【机器学习】线性回归的最小二乘法

一、问题阐述
紧接上篇,本文使用Python语言测试该算法。因此算法原理不再赘述。上篇博文已经提及损失函数J(θ),对其求关于θ的偏导数并令其等于0,得:
这里写图片描述
以下算法便用到此式。
计算过程涉及很多线性代数的定理,主要用到此式:
这里写图片描述
其中tr表示矩阵的迹(trace)。

二、代码实现

from numpy import *

# load data 导入数据
def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split('\t')) - 1
    dataMat = []; labelMat = []
    fd = open(fileName)
    for line in fd.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]))
    return dataMat, labelMat

# linear regression 计算回归系数
def linearRegres(xVec, yVec):
    xMat = mat(xVec);yMat = mat(yVec).T;
    xTx = xMat.T * xMat;
    if linalg.det(xTx) == 0:        # 奇异矩阵不能求逆
        print('This matrix is singular, cannot do inverse')
        return
    theta = xTx.I * xMat.T * yMat
    return theta

该数据集是《机器学习实战》第8章中的例子。该例输入是一个二维向量x=[x0, x1],输出为y。其中第一维输入x0的值总为1.0,表示一个为常数的偏移量,第二维输入x1是横坐标值。计算出回归系数后最终得到模型:y = θ[0] + θ[1] * x1(x0 = 1.0)。绘出散点图和回归模型图程序如下:

import matplotlib.pyplot as plt
from linear_regression import LinearRegression as lr
from numpy import *

xVec, yVec = lr.loadDataSet('ex0.txt')
theta = lr.linearRegres(xVec, yVec)
xMat = mat(xVec)
yMat = mat(yVec)
yHat = xMat * theta
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])
xCopy = xMat.copy()
xCopy.sort(0)   # 把点按升序排列
yHat = xCopy * theta
ax.plot(xCopy[:,1],yHat)
plt.show()

运行结果如下图:
数据散点图和回归直线
三、总结
终于跨进机器学习领域的大门啦!刚开始感觉也没有想象中那么难,主要是数学基础要扎实,在此基础之上多加琢磨,应该不难理解算法的原理。幸好放假之前恶补了概率论和线性代数,目前课程里讲的一些数学概念我还能听懂,可能往后学习还要继续把数学补一补呢!

发布了30 篇原创文章 · 获赞 97 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/HerosOfEarth/article/details/51946345