1.线性回归(Linear Regression)

1.1什么是线性回归

我们首先用弄清楚什么是线性,什么是非线性。

(1)线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。
注意:题目的线性是指广义的线性,也就是数据与数据之间的关系。

(2)非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。
相信通过以上两个概念大家已经很清楚了,其次我们经常说的回归回归到底是什么意思呢。

回归:人们在测量事物的时候因为客观条件所限,求得的都是测量值,而不是事物真实的值,为了能够得到真实值,无限次的进行测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。
通俗的说就是用一个函数去逼近这个真实值,那又有人问了,线性回归不是用来做预测吗?是的,通过大量的数据我们是可以预测到真实值的。

1.2线性回归要解决什么问题

对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。

1.3线性回归的原理公式推导

首先,我们先定义我们的数据集:

非线性回归实例 非线性回归法_机器学习


然后我们可以将数据集划分为特征部分和标签部分:

非线性回归实例 非线性回归法_线性回归_02


非线性回归实例 非线性回归法_python_03


然后,我们线性回归的主要目的就是要让预测值和真实值的误差达到最小,所以损失函数的公式就等于:

非线性回归实例 非线性回归法_线性回归_04


下面是对该公式进行化简的一些步骤:

非线性回归实例 非线性回归法_线性回归_05


非线性回归实例 非线性回归法_机器学习_06


因为对矩阵求导不太熟悉,所以就查了一些在机器学习中常用的矩阵求导公式:

非线性回归实例 非线性回归法_非线性回归实例_07


在我们得到了,最后公式后,我们要让他尽可能趋近于0,这样才能将我们的误差降到最小。过程如下:

非线性回归实例 非线性回归法_机器学习_08


这样我们得到了,w的公式,可以求得w的值。因为,我们训练集中有一属性的值为1,这一列是为了代替类似于二元线性回归中的截距参数的,所以我们不用特别计算这一参数。

以下是python代码实现线性回归算法:

from numpy import *
import pandas as pd


# 导入数据
def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split('  ')) - 1
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('  ')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat, labelMat


# 求回归系数
def standRegres(xArr, yArr):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0:  # 判断行列式是否为0
        print("行列式为0")
        return
    ws = xTx.I * (xMat.T * yMat)  # 也可以用NumPy库的函数求解:ws=linalg.solve(xTx,xMat.T*yMatT)
    return ws


if __name__ == "__main__":
    xArr, yArr = loadDataSet('Salary_Data.txt')
    ws = standRegres(xArr, yArr)
    xMat = mat(xArr)
    yMat = mat(yArr)
    # 预测值
    yHat = xMat * ws

    # 计算预测值和真实值得相关性
    corrcoef(yHat.T, yMat)  # 0.986

    # 绘制数据集散点图和最佳拟合直线图
    # 创建图像并绘出原始的数据
    import matplotlib.pyplot as plt

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xMat[:, 1].flatten().A[0], yMat.T[:, 0].flatten().A[0])
    # 绘最佳拟合直线,需先要将点按照升序排列
    xCopy = xMat.copy()
    xCopy.sort(0)
    yHat = xCopy * ws
    ax.plot(xCopy[:, 1], yHat)
    plt.show()