1)目标
使用Logistic回归模型来预测一个学生是否有资格入学。评估学生在两门test中的表现来决定录取率,通过以往的成绩和是否录取的学生数据建立模型,训练Logistic回归,对每一个新申请学生,你通过lr判定是否应该予以录取。
2)总结
- 实现算法前,应该在纸上将各个矩阵的维度整理清楚,防止不知名bug。
- 相比于之前的线性回归,lr由于加入了非线性的部分,梯度下降的速度会非常缓慢,可以采用高级方法,共轭梯度、BFGS等。
3)代码
import numpy as np
import matplotlib.pyplot as plt
#读取数据
data = np.loadtxt('D:\python\homewrok\data_sets\ex2data1.txt', delimiter=",")
x = data[:,[0,1]]
x = np.c_[np.ones(len(data)),x] #添加第一列
y = data[:,[2]]
#变量初始化
n=3
m=len(data)
time=0 #迭代次数time
aerfa=0.001 #学习率aerfa
theta=np.zeros(n)
JJ=np.zeros(250000) #代价函数
#数据可视化
plt.subplot(211)
for i in range(m):
if y[i]==0:
plt.scatter(x[i,[1]],x[i,[2]],c='red',marker='x')
if y[i]==1:
plt.scatter(x[i,[1]],x[i,[2]],c='blue',marker='o')
#目标函数
def h(theta,x):
h1= x @ theta
y=1/(1+np.exp(-h1))
return y
#代价函数
def J(theta,x,y):
yn = y.reshape(100)
cost = yn * np.log(h(theta,x)) + (1-yn) * np.log(1-h(theta,x))
out = -1/m * cost
return np.sum(out)
#梯度下降
while time<250000:
yt=y.reshape(100) #转置
daoshu = (aerfa / m) * (x.T @ (h(theta, x) - yt)) #向量运算,关注行和列配对
theta = theta - daoshu #迭代
JJ[time]=J(theta,x,y) #代价函数
time+=1
#结果可视化
a=-theta[0]/theta[2]
b=-theta[1]/theta[2]
plt.plot(range(120),a+b*range(120))
plt.subplot(212)
plt.plot(range(250000),JJ)
print(theta,time)
plt.show()
4)运行结果
theta0,theta1,theta2:
数据可视化:加粗样式