目录
线性回归
回归的目的就是预测数值型的目标值
最直接的方法是 依据输入写出一个目标值的计算公式
一般线性回归y=w*x+b,回归和线性回归一般是一个意思。
参考(2条消息) Python3《机器学习实战》学习笔记(十一):线性回归基础篇之预测鲍鱼年龄_Jack-Cui的博客-CSDN博客
应该怎么从一大堆数据里求出回归方程呢?假定输入数据存放在矩阵X中,结果存放在向量y中,而回归系存放在向量w中:
那么对于给定的数据x1,即矩阵X的第一列数据,预测结果u1将会通过如下公式给出:
现在的问题是,手里有数据矩阵X和对应的标签向量y,怎么才能找到w呢?一个常用的方法就是找出使误差最小的w。这里的误差是指预测u值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。
平方误差和可以写做:
我们要找到w,使平方误差和最小。因为我们认为平方误差和越小,线性回归拟合效果越好。
因此,用平方误差和对w进行求导:
使导数为0,得到
标准回归
数据导入
def loadDataSet(fileName):
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]))
return dataMat, labelMat
标准回归函数
def standRegres(xArr,yArr):#x数据集,y数据集
xMat = np.mat(xArr); yMat = np.mat(yArr).T
xTx = xMat.T * xMat #根据文中推导的公示计算回归系数 2*2矩阵
if np.linalg.det(xTx) == 0.0:
print("矩阵为奇异矩阵,不能求逆")
return
ws = xTx.I * (xMat.T*yMat)
return ws #回归系数
画图
xArr,yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr,yArr)
xMat = np.mat(xArr)
yMat = np.mat(yArr) #真实y值
yHat = xMat*ws #用ws回归系数算出来的y值
xCopy = xMat.copy()
xCopy.sort(0) #排序
yHat = xCopy * ws #计算对应的y值
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xCopy[:, 1], yHat) #绘制回归曲线
ax.scatter(xMat[:,1].flatten().A[0], yMat.flatten().A[0], s = 20, alpha = .5) #绘制样本点
plt.title('DataSet')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
如何判断模型的好坏呢?可以计算预测值yHat和真实值之间的相关系数
xArr,yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr,yArr)
xMat = np.mat(xArr)
yMat = np.mat(yArr) #真实y值
yHat = xMat*ws #用ws回归系数算出来的y值
corr = np.corrcoef(yHat.T,yMat)
print(corr)
结果:相关系数为0.98
局部加权线性回归
线性回归可能出现欠拟合的问题,因为它求的是具有最小均方误差的无偏估计。可以在估计中引入一些偏差,来降低预测的均方误差。比如局部加权线性回归(LWLR),给待测点附近的每个点赋予一定的权重,回归系数w解法:
LWLR 使用“核”(与支持向量机中的“核”类似)来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下,点x与x(i)越近,w(i,i)将会越大