机器学习线性回归学习

线性回归算法

线性回归算法是用来拟合连续值样本的一类算法,具体来说就是在我们观察到数据是线性变化的时候,我们可以使用一条拟合直线来大概的描述样本数据的变化,从而能够在新样本到来时,能快速的预测其对应的结果值

算法原理

线性回归算法主要就是通过训练测试样本,得到直线y=wx+b中w和h相应的值,从而得到一个拟合直线

这里可以看到y=wx+b和逻辑回归中的分类超平面的直线方程很类似,但是还是有一定区别的,在逻辑回归中,我们假设分类超平面的平面方程为

wx+b=0

其实也就是w0y + wx +b = 0,其中w0=1,这样其实两者的方程是一至的,最大的不同是在逻辑回归中,我们定义的损失函数是

这里表示的是所有分类错误点到分类直线的距离,距离越大,说明我们的分类直线越差,所有在逻辑回归中我们的目的就是最小化这个方程的值

但是在线性回归中,我们的目的是找到一条拟合样本的直线,我们的优化目标应该只尽可能的减小,样本点到直线的距离,当所有样本点到直线的距离为0时,就表明我们的拟合直线很好的经过了所有的点,这是最理想的,但是总有很多噪声点的存在,所有一般在寻找w和b的时候我们的损失函数如下:

最小,其实也就是点到直线的距离最小就可以了

这里我们可以扩充一下x的维度,将w * x+b变成 W * X,其中

这样我们最终的直线方程就变成了

损失函数为:

这里的未知变量就是W了,根据导数的定义,我们对W求导,可得当


时,也就是

时,得到的回归直线是最佳的拟合直线

代码实现

import numpy as np
import matplotlib.pyplot as plt

# 加载一些数据,显示的拟合直线为y=0.5x+1
def loadDatas(n):
    noise = np.random.rand(n) # 定义一些噪声
    x = [[x] for x in range(n)] # x值
    y = [(0.5 * x[i][0] + 1 + noise[i]) for i in range(n)] # y值

    return np.mat(x), np.mat(y) # 返回x,y的矩阵

# 计算出我们回归直线的w值
def standRegress(x, y):
    x = np.hstack((np.ones((x.shape[0], 1)), x)) # 扩充一下x,变成[x:1]的矩阵
    w = (x.T * x).I * x.T * y.T # 计算w值,公式如上

    return w, x

x, y = loadDatas(10)
w, xMat = standRegress(x,y)
y_pred = xMat * w

plt.scatter(x,y)
plt.plot(x, y_pred)
plt.show()

你可能感兴趣的:(机器学习线性回归学习)