逻辑回归及其损失
为什么采用交叉熵损失也就是二项分布参数化的极大似然估计: 参考博文
梯度下降
参考: 神经网络优化算法及代码实现——从SGD、Momentum、AdaGrad、RMSProp到Adam
训练数据:
实现过程:
'''
A classification task with logistic regression:
loss function: cross entropy
optimizer: sgd or Newton method
tips:
1: read csv file (headers are ['x1', 'x2', 'y']) https://www.cnblogs.com/unnameable/p/7366437.html
2: train samples: 1 - 800; test: 801:1000
3: y = sigmoid(w1*x1 + w2*x2 + b), compute the params and tell me
Modularize your code!!
'''
import csv
import numpy as np
import pandas as pd
#Sigmoid函数
def sigmoid(z):
sigmoid=1.0/(1.0+np.exp(-z))
return sigmoid
#cross entropy
def loss(h,y):
loss=(-y*np.log(h)-(1-y)*np.log(1-h)).mean()
return loss
#计算梯度
def gradient(X,h,y):
gradient=np.dot(X.T,(h-y))/y.shape[0]
return gradient
#逻辑回归优化过程
def Logistic_Regression(X,y,stepsize,max_iters):
intercept=np.ones((X.shape[0],1)) #初始化截距为1
X=np.concatenate((intercept,X),axis=1)
w=np.zeros(X.shape[1]) #初始化参数为0
iter_count=0 #当前迭代次数
l=0 #损失值
while(iter_count<max_iters): #梯度下降迭代
z=np.dot(X,w) #线性函数
h=sigmoid(z)
g=gradient(X,h,y) #计算梯度
w-=stepsize*g #更新参数
l=loss(h,y) #计算更新后的损失
iter_count=iter_count+1
#print(iter_count)
return l,w #返回迭代后的损失和参数
#逻辑回归预测函数
def Logistic_Regression_predict(test_X,test_label,w):
intercept=np.ones((test_X.shape[0],1))
test_X=np.concatenate((intercept,test_X),axis=1)
predict_z=np.dot(test_X,w)
predict_label=sigmoid(predict_z)
predict_label[predict_label<0.5]=0
predict_label[predict_label>0.5]=1
return predict_label
#主函数
f=open('./data.csv')
data=pd.read_csv(f) #导入csv文件
X=data.iloc[:,0:2]
#y=data.iloc[:,2]
#划分测试训练集
train_X=X.iloc[0:800,:]
test_X=X.iloc[800:,:]
train_label=data.iloc[0:800,2]
test_label=data.iloc[800:,2]
#逻辑回归模型训练及预测
l,w=Logistic_Regression(train_X,train_label,0.05,5000) #训练模型
predict_label=Logistic_Regression_predict(test_X,test_label,w) #预测标签
accuracy=(predict_label==test_label).mean() #计算预测准确率
print(accuracy)
'''
result:
0.97
'''