一 线性回归(Linear Regression)
1. 线性回归概述
回归的目的是预测数值型数据的目标值,最直接的方法就是根据输入写出一个求出目标值的计算公式,也就是所谓的回归方程,例如y = ax1+bx2,其中求回归系数的过程就是回归。那么回归是如何预测的呢?当有了这些回归系数,给定输入,具体的做法就是将回归系数与输入相乘,再将结果加起来就是最终的预测值。说到回归,一般指的都是线性回归,当然也存在非线性回归,在此不做讨论。
假定输入数据存在矩阵x中,而回归系数存放在向量w中。那么对于给定的数据x1,预测结果可以通过y1 = x1Tw给出,那么问题就是来寻找回归系数。一个最常用的方法就是寻找误差最小的w,误差可以用预测的y值和真实的y值的差值表示,由于正负差值的差异,可以选用平方误差,也就是对预测的y值和真实的y值的平方求和,用矩阵可表示为:(y - xw)T(y - xw),现在问题就转换为寻找使得上述矩阵值最小的w,对w求导为:xT(y - xw),令其为0,解得:w = (xTx)-1xTy,这就是采用此方法估计出来的
注:数据集ex0.txt在此博客的最后面
2.python实现
from numpy import *
%matplotlib inline
import matplotlib.pyplot as plt
def loadDataSet(fileName):
dataSet=[]
labels=[]
fr=open(fileName)
for line in fr.readlines():
lineArr=[]
curLine=line.strip().split('\t')
for i in range(len(curLine)-1):
lineArr.append(float(curLine[i]))
dataSet.append(lineArr)
labels.append(float(curLine[-1]))
return dataSet,labels
dataSet,labels=loadDataSet('dataset/ex0.txt')
def standardRegression(dataSet,labels):
'''
标准的回归函数的目标是:回归系数ws
'''
#1.x^t*x的结果
xMat=mat(dataSet)
yMat=mat(labels)
#print(yMat.T)
xTx=xMat.T*xMat
#2.求上面的结果矩阵是否可逆
if linalg.det(xTx)==0.0:
print('此矩阵为不可逆矩阵')
return
ws=xTx.I*(xMat.T*yMat.T)
return ws
ws=standardRegression(dataSet,labels)
#求预测值
xMat=mat(dataSet)
yMat=mat(labels).T
predict=xMat*ws
print(predict[0:5])
print(yMat[0:5])
#请加入模型的评测函数
#1.平均绝对误差 Mean Absolute Error,MAE |y-mean(y)|求和/n
meanValue=mean(yMat)
print('均值:',meanValue)
print('长度:',len(yMat))
#print('差:',yMat-meanValue)
MAE=sum(abs(yMat-mean(yMat)))/len(yMat)
print(MAE)
#2.均方误差 Mean Squared Error ,MSE (y-predict)^2,求和/n
diff=yMat-predict
#print("diff:",diff)
squarel=square(diff)
MSE=sum(squarel)/len(yMat)
print(MSE)
#3.R-squred 1-((y-predict)^2求和)|y-mean(y)|求和
#1-(MSE/MAE)
r=1.0-(sum(square(yMat-predict))/sum(square(yMat-mean(yMat))))
print(r)
#绘制图表来显示 数据点与模型的关系
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))
ax=fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[0