前言
用线性回归找到最佳拟合直线
回归:预测数值型的目标值
回归方程:包括一系列回归系数和输入的方程
求上面回归方程中的回归系数的过程就是回归
回归的一般方法
- 收集数据:采用任意方法收集数据。
- 准备数据:回归需要数值型数据,标称型数据将被转成二值型数据。
- 分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法求得新回归系数之后,可以将新拟合线绘在图上作为对比。
- 训练算法:找到回归系数。
- 测试算法:使用R2或者预测值和数据的拟合度,来分析模型的效果。
- 使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
代码实现
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()
1 条评论
测试