在上一次完成一元的线性回归后,距离今天已经十多天了,本来想着早早更新下去,结果我的数据读取错误。导致我一直无法正确读取数据,还好我找到了解决方案。数据集合随后我会给出。
集合有两个,一个是ex2x.dat,第一列数据表示房屋的面积,第二列表示房屋的卧室数量
第二个是ex2y.dat,表示ex2x.dat对应行的房屋的价格。
而我们研究在房屋的面积和卧室数量与房屋价格的线性关系。
一. 梯度下降
我们的目标是预测值与真实值的差距越小越好,由此可以设置目标函数为:
批量梯度下降
原理可参考梯度下降。
接下来展示代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
x=pd.read_csv('C:\\Users\\zhanghongqing\\Desktop\\python\\逻辑回归\\ex2Data\\ex2x.dat',sep='\s+',header=None)
y=pd.read_csv('C:\\Users\\zhanghongqing\\Desktop\\python\\逻辑回归\\ex2Data\\ex2y.dat',sep='\s+',header=None)
x=np.array(x)
y=np.array(y)
a=np.ones((x.shape[0],1))
#在x数据集前加一列全为1的数据,作为常数项
x=np.hstack((a,x))
print(x)
#m,n分别为行和列的数量
m=x.shape[0]
n=x.shape[1]
theta=np.zeros((n,1))
print(theta)
J=np.zeros((50,1))
J1=np.zeros((50,1))
J2=np.zeros((50,1))
J3=np.zeros((50,1))
J4=np.zeros((50,1))
def deal():#预处理
sigma=np.std(x,axis=0)
mu=np.mean(x,axis=0)
for i in range(x.shape[1]):
if(i!=0):
x[:,i]=(x[:,i]-mu[i])/sigma[i]
def lostfuntion(theta):#损失函数
curentJ=1/(2*m)*np.dot((np.dot(x,theta)-y).T,np.dot(x,theta)-y)
return curentJ
def h(x):
return np.dot(x,theta)
def gradplus(alpha,nn,Jn):#梯度下降函数
global theta
for k in range(nn):
Jn[k]=lostfuntion(theta)
theta=theta-alpha/m*np.dot(x.T,h(x)-y)
deal()
#算出学习率为0.01,0.03,0.1,0.3的J
gradplus(0.01,50,J1)
gradplus(0.03,50,J2)
gradplus(0.1,50,J3)
gradplus(0.3,50,J4)
gradplus(0.1,50,J)
xx=np.array([i for i in range(50)])
#画图部分
plt.figure(num=1)
plt.plot(xx,J,'b-')
plt.legend(['0.1'])
plt.xlabel('number of iterations')
plt.ylabel('cost j')
plt.show()
plt.figure(num=2)
plt.plot(xx,J1,'b-')
plt.plot(xx,J2,'r-')
plt.plot(xx,J3,'k-')
plt.plot(xx,J4,'y-')
plt.legend(['0.01','0.03','0.1','0.3'])
plt.xlabel('number of iterations')
plt.ylabel('cost j')
plt.show()
最后我们拟合出了theta值,图片展示了拟合过程中theta的变化。
总结:
1.学习率越大,梯度下降的速度越快。
2.图像可以得出,学习率太小迭代次数太少是无法得出较为精确的结论的。
3.我的两个文件为dat文件,读取时如果不加sep='\s+',将读取出str类型的数据。
ex2x.dat
2.1040000e+03 3.0000000e+00
1.6000000e+03 3.0000000e+00
2.4000000e+03 3.0000000e+00
1.4160000e+03 2.0000000e+00
3.0000000e+03 4.0000000e+00
1.9850000e+03 4.0000000e+00
1.5340000e+03 3.0000000e+00
1.4270000e+03 3.0000000e+00
1.3800000e+03 3.0000000e+00
1.4940000e+03 3.0000000e+00
1.9400000e+03 4.0000000e+00
2.0000000e+03 3.0000000e+00
1.8900000e+03 3.0000000e+00
4.4780000e+03 5.0000000e+00
1.2680000e+03 3.0000000e+00
2.3000000e+03 4.0000000e+00
1.3200000e+03 2.0000000e+00
1.2360000e+03 3.0000000e+00
2.6090000e+03 4.0000000e+00
3.0310000e+03 4.0000000e+00
1.7670000e+03 3.0000000e+00
1.8880000e+03 2.0000000e+00
1.6040000e+03 3.0000000e+00
1.9620000e+03 4.0000000e+00
3.8900000e+03 3.0000000e+00
1.1000000e+03 3.0000000e+00
1.4580000e+03 3.0000000e+00
2.5260000e+03 3.0000000e+00
2.2000000e+03 3.0000000e+00
2.6370000e+03 3.0000000e+00
1.8390000e+03 2.0000000e+00
1.0000000e+03 1.0000000e+00
2.0400000e+03 4.0000000e+00
3.1370000e+03 3.0000000e+00
1.8110000e+03 4.0000000e+00
1.4370000e+03 3.0000000e+00
1.2390000e+03 3.0000000e+00
2.1320000e+03 4.0000000e+00
4.2150000e+03 4.0000000e+00
2.1620000e+03 4.0000000e+00
1.6640000e+03 2.0000000e+00
2.2380000e+03 3.0000000e+00
2.5670000e+03 4.0000000e+00
1.2000000e+03 3.0000000e+00
8.5200000e+02 2.0000000e+00
1.8520000e+03 4.0000000e+00
1.2030000e+03 3.0000000e+00
ex2ydat
3.9990000e+05
3.2990000e+05
3.6900000e+05
2.3200000e+05
5.3990000e+05
2.9990000e+05
3.1490000e+05
1.9899900e+05
2.1200000e+05
2.4250000e+05
2.3999900e+05
3.4700000e+05
3.2999900e+05
6.9990000e+05
2.5990000e+05
4.4990000e+05
2.9990000e+05
1.9990000e+05
4.9999800e+05
5.9900000e+05
2.5290000e+05
2.5500000e+05
2.4290000e+05
2.5990000e+05
5.7390000e+05
2.4990000e+05
4.6450000e+05
4.6900000e+05
4.7500000e+05
2.9990000e+05
3.4990000e+05
1.6990000e+05
3.1490000e+05
5.7990000e+05
2.8590000e+05
2.4990000e+05
2.2990000e+05
3.4500000e+05
5.4900000e+05
2.8700000e+05
3.6850000e+05
3.2990000e+05
3.1400000e+05
2.9900000e+05
1.7990000e+05
2.9990000e+05
2.3950000e+05