一、线性回归实现的说明
在上一次线性回归的介绍中,我们看到线性回归可以用解方程或者梯度下降的方法解决,下面我们将实现自己的代码去实现求解过程。
下面的求解的例子,都是按比较简单的二维坐标系提供了四个样本点,(x,y):(1,2),(3,3),(5,7),(6,8)求解最能拟合回归的直线
二、实现解方程
我们可以按照矩阵求解的方法进行求解,公式:
将例子中的变量值代入到方程中,我们利用现有的numpy库,对矩阵进行求解,代码如下:
from numpy import *
import numpy as np
from matplotlib import pyplot as plt
#原始数据
data = np.array([[1,2],[3,3],[5,7],[6,8]])
#数据处理
m,n = np.shape(data)
x_data = np.ones((m,n))
y_data = np.ones((m,1))
x_data[:,1:] = data[:,:-1]
y_data[:,:] = data[:,-1:]
XT = x_data.T
#求乘积
XTX = np.dot(XT ,x_data)
#得到xtx的逆矩阵
XN = np.matrix(XTX).I
#根据公式得出结果
THETA = XN * XT * y_data
plt.plot(x_data[:,-1:],y_data,"ob")
plt.plot(x_data[:,-1:],x_data * THETA,color="red",linewidth=2)
plt.title("matrix equation")
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.show()
打印出最后的为[[0.16949153][1.28813559]],最后得到的图如下:
我们可以看到红色的直线比较合理的拟合了蓝色的点,使损失函数达到最小。
三、梯度下降求解
梯度求解需要设定学习率,迭代次数,损失函数并求偏导
from numpy import *
import numpy as np
from matplotlib import pyplot as plt
#原始数据
data = np.array([[1,2],[3,3],[5,7],[6,8]])
#数据处理
m,n = np.shape(data)
x_data = np.ones((m,n))
y_data = np.ones((m,1))
x_data[:,1:] = data[:,:-1]
y_data[:,:] = data[:,-1:]
#构建梯度下降的函数
def GradientByLearnRatio(ratio,itercount):
#我这里初始化theta的值,是一个全0的值
theta = np.zeros((n,1))
for i in range(itercount):
#损失函数求偏导====
loss = np.dot(x_data, theta) - y_data
grad = np.dot(x_data.T, loss)
theta = theta - ratio * grad/m
#可以打印出直线的变化情况
if(i%(itercount/5) == 0):
Draw(theta)
return theta
def Draw(theta):
plt.plot(x_data[:, -1:], y_data, "ob")
plt.plot(x_data[:, -1:], np.dot(x_data, theta), color="red", linewidth=2)
plt.title("matrix equation")
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.show()
# 学习率
ratio = 0.001
#迭代次数
itercount = 10000
THETA = GradientByLearnRatio(ratio,itercount)
print(THETA)
打印出最后的为[[0.18334215],[1.28517626]],基本上与方程求解得出的结果差不多。