机器学习之局部加权线性回归
2017-04-13 20:50
393 查看
局部加权线性回归(Locally Weighted Linear Regression)算法背景:现实生活中很多数据采用线性模型不能很好的描述,比如说房价预测的问题,直线不能很好的拟合所有的数据点,甚至存在较大的误差,我们可能采用一条类似于二次函数的曲线可以拟合的更好。但是为了解决在非线性模型里建立线性模组的问题,我们预测一点的值时,选择与这个点相近的点而不是所有的点做线性回归。基于此,产生了局部加权回归算法。算法思想:局部加权回归是基于非参数学习算法的思想,使得特征的选择更好。赋予预测点附近每一个点以一定的权值,在这上面基于波长函数来进行普通的线性回归.可以实现对临近点的精确拟合同时忽略那些距离较远的点的贡献,即近点的权值大,远点的权值小,k为波长参数,控制了权值随距离下降的速度,越大下降的越快。越小越精确并且太小可能出现过拟合的问题。
普通的线性回归函数使用的最小二乘法,即cost函数是要使得J(Θ)最小化,求得线性回归参数 加入局部加权算法,cost函数变成了加权的cost函数,如下面的形式其中w(i)是权重同样可以求得线性回归参数Θ为下面的形式 在使用这个算法训练数据时,我们需要学习两类参数,线性回归的参数以及波长参数。算法的缺点主要在于对于每一个需要预测的点,都要重新依据整个数据集模拟出一个线性回归模型出来,使得算法的代价极高。代码实现python:#coding=utf-8
#LocallyWeightedLinearRegression.py
#局部加权线性回归算法的实现
#其中线性回归使用的最小二乘法,因此回归系数是 theta = (X.T* W * X).I * X.T *W * Y
from numpy import *
#加载数据
def load_data(fileName):
numFeat = len(open(fileName).readline().split(',')) - 1
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split(',')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr) #实际数据集
labelMat.append(float(curLine[-1]))#实际数据标签值
return dataMat,labelMat
# 对某一点计算估计值
def lwlr(testPoint, xArr, yArr, k = 1.0):
xMat = mat(xArr); yMat = mat(yArr).T#矩阵化
m = shape(xMat)[0]#取得维度25
weights = mat(eye((m)))#eye生成对角矩阵,m*m
for i in range(m):
diffMat = testPoint - xMat[i, :]#计算测试点坐标和所有数据坐标的差值
#计算权值 w =exp((-(xi-X)^2)/(2*k*k))
weights[i, i] = exp(diffMat * diffMat.T/(-2.0 * k**2)) # 计算权重对角矩阵
xTx = xMat.T * (weights * xMat) #对x值进行加权计算 # 奇异矩阵不能计算
if linalg.det(xTx) == 0.0:
print('This Matrix is singular, cannot do inverse')
return
#theta = (X.T* W * X).I * X.T *W * Y
theta = xTx.I * (xMat.T * (weights * yMat)) # 计算回归系数 ,对y加权
return testPoint * theta
# 对所有点计算估计值
def lwlrTest(testArr, xArr, yArr, k = 1.0):
m = shape(testArr)[0]
yHat = zeros(m)#初始化预测值列表
for i in range(m):
yHat[i] = lwlr(testArr[i], xArr, yArr, k)
return yHat
使用k=0.1,数据拟合的最好:
使用k=0.01,数据存在过拟合的问题:
使用k=1.0,数据出现欠拟合的问题:
结论:当K=1.0时,出现了欠拟合的问题,根据公式,此时权重过大,下降太快,计算点太少,相当于所有的数据视为等权重,相当于普通的线性回归模型,当k=0.1时得到了很好的效果,当k=0.01时,出现了过拟合的问题,纳入了较多的噪音点,因此也不属于好的结果。
普通的线性回归函数使用的最小二乘法,即cost函数是要使得J(Θ)最小化,求得线性回归参数 加入局部加权算法,cost函数变成了加权的cost函数,如下面的形式其中w(i)是权重同样可以求得线性回归参数Θ为下面的形式 在使用这个算法训练数据时,我们需要学习两类参数,线性回归的参数以及波长参数。算法的缺点主要在于对于每一个需要预测的点,都要重新依据整个数据集模拟出一个线性回归模型出来,使得算法的代价极高。代码实现python:#coding=utf-8
#LocallyWeightedLinearRegression.py
#局部加权线性回归算法的实现
#其中线性回归使用的最小二乘法,因此回归系数是 theta = (X.T* W * X).I * X.T *W * Y
from numpy import *
#加载数据
def load_data(fileName):
numFeat = len(open(fileName).readline().split(',')) - 1
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split(',')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr) #实际数据集
labelMat.append(float(curLine[-1]))#实际数据标签值
return dataMat,labelMat
# 对某一点计算估计值
def lwlr(testPoint, xArr, yArr, k = 1.0):
xMat = mat(xArr); yMat = mat(yArr).T#矩阵化
m = shape(xMat)[0]#取得维度25
weights = mat(eye((m)))#eye生成对角矩阵,m*m
for i in range(m):
diffMat = testPoint - xMat[i, :]#计算测试点坐标和所有数据坐标的差值
#计算权值 w =exp((-(xi-X)^2)/(2*k*k))
weights[i, i] = exp(diffMat * diffMat.T/(-2.0 * k**2)) # 计算权重对角矩阵
xTx = xMat.T * (weights * xMat) #对x值进行加权计算 # 奇异矩阵不能计算
if linalg.det(xTx) == 0.0:
print('This Matrix is singular, cannot do inverse')
return
#theta = (X.T* W * X).I * X.T *W * Y
theta = xTx.I * (xMat.T * (weights * yMat)) # 计算回归系数 ,对y加权
return testPoint * theta
# 对所有点计算估计值
def lwlrTest(testArr, xArr, yArr, k = 1.0):
m = shape(testArr)[0]
yHat = zeros(m)#初始化预测值列表
for i in range(m):
yHat[i] = lwlr(testArr[i], xArr, yArr, k)
return yHat
#coding=utf-8 #测试局部加权线性回归算法 import matplotlib.pyplot as plt import LocallyWeightedLinearRegression as lwlr from numpy import * xArr, yArr = lwlr.load_data('ex2.txt') yHat = lwlr.lwlrTest(xArr, xArr, yArr, 0.1) xMat = mat(xArr) strInd = xMat[:, 1].argsort(0)#返回数据第二列从小到大的索引值 #xSort = xMat[strInd][:, 0, :]#返回第一列和第二列,根据上面索引顺序取出 xSort = xMat[strInd][:]#返回第一列和第二列,根据上面索引顺序取出,xSort为Xmat的另一个拷贝 fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(xSort[:, 1], yHat[strInd])#画出拟合的线 ax.scatter(xMat[:, 1].flatten().A[0], mat(yArr).T.flatten().A[0], s = 2, c = 'red')#画出实际点 plt.show()
使用k=0.1,数据拟合的最好:
使用k=0.01,数据存在过拟合的问题:
使用k=1.0,数据出现欠拟合的问题:
结论:当K=1.0时,出现了欠拟合的问题,根据公式,此时权重过大,下降太快,计算点太少,相当于所有的数据视为等权重,相当于普通的线性回归模型,当k=0.1时得到了很好的效果,当k=0.01时,出现了过拟合的问题,纳入了较多的噪音点,因此也不属于好的结果。
相关文章推荐
- 机器学习实战——线性回归和局部加权线性回归(含python中复制的四种情形!)
- 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)
- 机器学习中的局部加权线性回归
- [机器学习]线性回归和局部加权线性回归
- 机器学习-学习笔记3.1-局部加权回归
- 机器学习:线性回归、局部加权线性回归、岭回归、前向逐步回归
- 局部加权线性回归(LWLR)
- [置顶] 《机器学习实战》--局部加权线性回归(LWR)
- 局部加权线性回归(Locally weighted linear regression)
- 机器学习-学习笔记3.1-局部加权回归
- 线性回归、局部加权线性回归、岭回归、lasso及逐步线性回归
- 回归算法学习笔记(二)局部加权线性回归
- 机器学习与算法(8)--局部加权学习算法(LWR)
- 【机器学习】局部加权线性回归
- 【机器学习入门】局部加权回归
- 机器学习---局部加权回归
- CS229学习笔记之概率解释与局部加权线性回归
- (斯坦福机器学习课程笔记)局部加权线性回归练习
- 机器学习第二篇(stanford大学公开课学习笔记) —局部加权回归
- 机器学习笔记----最小二乘法,局部加权,岭回归讲解