机器学习之线性回归的实现

一、线性回归实现的说明

在上一次线性回归的介绍中,我们看到线性回归可以用解方程或者梯度下降的方法解决,下面我们将实现自己的代码去实现求解过程。

下面的求解的例子,都是按比较简单的二维坐标系提供了四个样本点,(x,y):(1,2),(3,3),(5,7),(6,8)求解最能拟合回归的直线

二、实现解方程

我们可以按照矩阵求解的方法进行求解,公式:\mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y}

将例子中的变量值代入到方程中,我们利用现有的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()

打印出最后的\theta为[[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)

打印出最后的\theta为[[0.18334215],[1.28517626]],基本上与方程求解得出的结果差不多。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值