前言

用线性回归找到最佳拟合直线

回归:预测数值型的目标值

回归方程:包括一系列回归系数和输入的方程

求上面回归方程中的回归系数的过程就是回归


回归的一般方法

  1. 收集数据:采用任意方法收集数据。
  2. 准备数据:回归需要数值型数据,标称型数据将被转成二值型数据。
  3. 分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线绘在图上作为对比。
  4. 训练算法:找到回归系数。
  5. 测试算法:使用R2或者预测值和数据的拟合度,来分析模型的效果。
  6. 使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
    QQ图片20210225003753.png

代码实现

import numpy as np
import matplotlib.pyplot as plt


def loadDataSet(fileName):
    # 获取文本中的特征数量,-1是为了去除标签列
    numFeat = len(open(fileName).readline().split('\t')) - 1
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
            dataMat.append(lineArr)
            labelMat.append(float(curLine[-1]))
    fr.close()
    return dataMat, labelMat


def standRegres(xArr, yArr):
    xMat = np.mat(xArr)
    yMat = np.mat(yArr).T
    print(xMat)
    xTx = xMat.T * xMat
    # np.linalg.inv():矩阵求逆;np.linalg.det():矩阵求行列式;行列式为0,矩阵没有逆
    if np.linalg.det(xTx) == 0.0:
        print("This matrix is singular, cannot do inverse")
        return
    # 此处可以看上面的推导
    ws = xTx.I * (xMat.T * yMat)
    return ws


if __name__ == "__main__":
    xArr, yArr = loadDataSet('ex0.txt')
    print(xArr[0:2])
    ws = standRegres(xArr, yArr)
    xMat = np.mat(xArr)
    yMat = np.mat(yArr)
    yHat = xMat * ws
    # 绘制数据点
    fig = plt.figure()
    ax = fig.add_subplot(111)
    # flatten().A[0]:即把numpy的array或者mat对象展开成一维
    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()

运行结果

QQ图片20210225004139.png

最后修改:2021 年 02 月 25 日
如果觉得我的文章对你有用,请随意赞赏