Linear Regression
目的:解线性回归中的系数向量w
定义:
Full batch gradient descent
定义
#w0为纵的向量
def batch_gradient(x,y,w0,a):
d=0
desc=[[0],[0],[0]]
for i in range(len(y)):
d = y[i]-x[i][0]*w0[1,0]-x[i][1]*w0[2,0]-w0[0,0]
x_mat=np.mat([1,x[i][0],x[i][1]])
desc = desc + (x_mat.T)*d
w1=w0+a*desc
return w1
def iteration(w1,k):
w_all=[]
print ("第1次迭代后的点为:",w1)
for i in range (k):
if (i+1)< k:
w1=batch_gradient(x,y,w1,a)
print ("第",i+2,"次迭代后的点为:",w1)
w_all.append(w1)
return w_all
x=[[4,8],[3.6,7.6],[4.4,8.4],[3.2,7.2],[4.8,8.8],[2.8,6.8]]
y=[14,13,15,12,16,11]
w0=np.mat([[0],[2],[5]])
a=0.05#学习率
w1=batch_gradient(x,y,w0,a)
iteration(w1,3)
报错1:w1=(w + ad for w in w0)运行后生成generator对象,查看w1提示cannot pickle ‘generator’ object,修改为w1=[w + ad for w in w0]就是一个列表了。
插叙:如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器generator
报错2:desc += (x_mat.T)*d其中desc为desc=[[0],[0],[0]],矩阵加法出错,提示‘Cannot cast ufunc ‘add’ output from dtype(‘float64’) to dtype(‘int32’) with casting rule ‘same_kind’’。修改为desc = desc + (x_mat.T)*d。
Normal equation method
解方程代公式就完事了
#normal equations method
import numpy as np
x=[[4,8],[3.6,7.6],[4.4,8.4],[3.2,7.2],[4.8,8.8],[2.8,6.8]]
y=[14,13,15,12,16,11]
w0=np.mat([[0],[2],[5]])
a=0.05
x_mat=np.mat([x[0][0],x[0][1],1])
y_mat=np.mat(y[0])
for i in range(len(y)):
if i+2 <= len(y):
x_mat=np.r_[x_mat,np.mat([x[i+1][0],x[i+1][1],1])]
y_mat=np.r_[y_mat,np.mat(y[i+1])]
xtx=np.dot(x_mat.T,x_mat)
xtxit=np.dot(np.linalg.inv(xtx),x_mat.T)
w=np.dot(xtxit,y_mat)
不知道为啥结果和题目中的结果不一样,公式也没错啊。。
难点1:怎么依次往矩阵里添加行。https://blog.csdn.net/tintinetmilou/article/details/78119320
报错1:x_mat=np.r_(x_mat,([x[i+1][0],x[i+1][1],1])),提示’RClass’ object is not callable。解决:np.r_函数得用方括号[]。并且前后得统一数据格式,不能直接将列表插入进矩阵。
修改为:np.r_[x_mat,np.mat([x[1][0],x[1][1],1])]