前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逻辑回归 使用Numpy实现逻辑回归

逻辑回归 使用Numpy实现逻辑回归

作者头像
小小程序员
发布2023-12-02 10:50:55
2450
发布2023-12-02 10:50:55
举报

使用Numpy实现逻辑回归

sigmoid 函数
g(z)=\frac{1}{(1+e^{−z} )}
代码语言:javascript
复制
# sigmoid 函数
def sigmod(z):
    return 1/(1+np.exp(-z))

线性计算与梯度下降

J(θ)=-\frac{1}{m}[∑_{i=1}^m y^{(i)} log⁡(h_θ(x^{(i)} ))+(1−y^{(i)}) log(1−h_θ (x^{(i)}))]

对于代价函数,采用梯度下降算法求θ的最小值:

θ_j≔θ_j−α\frac{∂J(θ)}{∂θ_j}

代入梯度:

θ_j≔θ_j−α∑_{i=1}^m(h_θ (x^{(i)} )−y^{(i)} ) x_j^i
代码语言:javascript
复制
# 进行计算
def compute(X,y,weights,bias):
    count=len(X)
    linear=np.dot(X,weights)+bias
    
    predictions = sigmoid(linear)
    
    dw=(1/count)*np.dot(X.T,(predictions-y))
    db=(1/count)*np.sum(predictions-y)
    
    return dw,db

def update(weights,bias,dw,db,rate):
    weights=weights-rate*dw
    bias=bias-rate*db
    
    return weights,bias
实现逻辑回归

逻辑回归公式

h_θ (x)=\frac{1}{(1+e^{−θ^T X} )}
代码语言:javascript
复制
#逻辑回归
def logistic(X,y,rate,iterations):
    count,col=X.shape
    weights,bias=initialize(col)
    
    for _ in range(iterations):
        dw,db=compute(X,y,weights,bias)
        
        weights,bias =update(weights,bias,dw,db,rate)
        
    return weights, bias
测试模型
代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

# 生成两个特征的单调数据
np.random.seed(42)
X1 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X2 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X = np.column_stack((X1, X2))

# 生成对应的标签,假设以直线 x1 = x2 为界限进行二分类
y = (X[:, 0] > X[:, 1]).astype(int)

# 添加偏置项
X_with_bias = np.c_[np.ones((X.shape[0], 1)), X]

# 训练逻辑回归模型
weights, bias = logistic(X_with_bias, y, rate=0.1, iterations=1000)

# 选择一些数据点进行预测
X_predict = np.array([[2, 2], [3, 4], [4, 3]])
predictions = predict(np.c_[np.ones((X_predict.shape[0], 1)), X_predict], weights, bias)

# 输出预测结果
print("Predictions:", predictions)

# 画出二分类后的图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, marker='o')
plt.scatter(X_predict[:, 0], X_predict[:, 1], marker='x', color='red', label='Predictions')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Binary Classification with Logistic Regression')
plt.legend()
plt.show()
在这里插入图片描述
在这里插入图片描述
完整代码
代码语言:javascript
复制
import numpy as np

# sigmoid 函数
def sigmod(z):
    return 1/(1+np.exp(-z))

# 初始化参数
def initialize(num_col):
    weights=np.zeros(num_col)
    bias=0
    return weights,bias

# 进行计算
def compute(X,y,weights,bias):
    count=len(X)
    linear=np.dot(X,weights)+bias
    
    predictions = sigmoid(linear)
    
    dw=(1/count)*np.dot(X.T,(predictions-y))
    db=(1/count)*np.sum(predictions-y)
    
    return dw,db

# 梯度下降
def update(weights,bias,dw,db,rate):
    weights=weights-rate*dw
    bias=bias-rate*db
    
    return weights,bias
    
#逻辑回归
def logistic(X,y,rate,iterations):
    count,col=X.shape
    weights,bias=initialize(col)
    
    for _ in range(iterations):
        dw,db=compute(X,y,weights,bias)
        
        weights,bias =update(weights,bias,dw,db,rate)
        
    return weights, bias

# 预测结果
def predict(X,weights,bias):
    linear = np.dot(X,weights)+bias
    predictions=sigmoid(linear)
    
    return [1 if y_hat>0.5 else 0  for y_hat in predictions]
可视化代码
代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

# 生成两个特征的单调数据
np.random.seed(42)
X1 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X2 = np.linspace(1, 5, 100) + np.random.randn(100) * 0.2
X = np.column_stack((X1, X2))

# 生成对应的标签,假设以直线 x1 = x2 为界限进行二分类
y = (X[:, 0] > X[:, 1]).astype(int)

# 添加偏置项
X_with_bias = np.c_[np.ones((X.shape[0], 1)), X]

# 训练逻辑回归模型
weights, bias = logistic(X_with_bias, y, rate=0.1, iterations=1000)

# 选择一些数据点进行预测
X_predict = np.array([[2, 2], [3, 4], [4, 3]])
predictions = predict(np.c_[np.ones((X_predict.shape[0], 1)), X_predict], weights, bias)

# 输出预测结果
print("Predictions:", predictions)

# 画出二分类后的图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, marker='o')
plt.scatter(X_predict[:, 0], X_predict[:, 1], marker='x', color='red', label='Predictions')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Binary Classification with Logistic Regression')
plt.legend()
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Numpy实现逻辑回归
    • sigmoid 函数
      • 线性计算与梯度下降
        • 实现逻辑回归
        • 测试模型
        • 完整代码
        • 可视化代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档