一、问题阐述
紧接上篇,本文使用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()
运行结果如下图:
三、总结
终于跨进机器学习领域的大门啦!刚开始感觉也没有想象中那么难,主要是数学基础要扎实,在此基础之上多加琢磨,应该不难理解算法的原理。幸好放假之前恶补了概率论和线性代数,目前课程里讲的一些数学概念我还能听懂,可能往后学习还要继续把数学补一补呢!