机器学习-线性回归
本文代码均来自于《机器学习实战》
分类算法先说到这里,接下来说一个回归算法
线性回归
线性回归比较简单,就不怎么说了,要是模型记不得了就百度一下吧,这里列一下公式就直接上代码了
'''
Created on Jan 8, 2011
@author: Peter
'''
from numpy import *
#加载数据
def loadDataSet(fileName): #general function to parse tab -delimited floats
#attribute的个数
numFeat = len(open(fileName).readline().split(' ')) - 1 #get number of fields
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是一个二维矩阵,labelMat是一维的
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
#就是,简单的线性回归
def standRegres(xArr,yArr):
#这里没有出现为特征X加1列,因为它已经写在数据中了2333,要是数据中没有的话是要写的。
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat#这个是X的转置乘以X
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
#.I在numpy中是求逆矩阵
ws = xTx.I * (xMat.T*yMat)
return ws
线性回归的一个问题就是可能会出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计,所以如果模型欠拟合的话将不能得到最好的预测效果.所以有些方法允许在估计中引如一些偏差,从而降低预测的均方误差。其中一个方法就是局部加权线性回归
---来源当然是《机器学习实战》
局部加权线性回归
这页书中干货比较多,就直接放上来了
看见没,人家是用了核函数的,和你们印象中那个傻白甜的线性回归不一样!知道书里为什么把它放在SVM后面了吧
那么这个局部加权线性回归是何方神圣呢?看到网上一个比较靠谱的博客,摘录如下:
来源:http://cynhard.com/2018/07/13/ML-Locally-Weighted-Linear-Regression/
(由于这位博主用了插件来显示公式,我就偷懒截图了2333)
可以看到,所谓“加权”不是直接加在直线方程上的,而是加在损失函数上、用来使函数“跑偏”的。
划重点:已知样本距离预测样本越近,权重越大;k越大,权重随距离减小的速度越慢。
局部加权回归是基于非参数学习算法的思想,使得特征的选择更好。赋予预测点附近每一个点以一定的权值,在这上面基于波长函数来进行普通的线性回归.可以实现对临近点的精确拟合同时忽略那些距离较远的点的贡献,即近点的权值大,远点的权值小,k为波长参数,控制了权值随距离下降的速度,越大下降的越快。越小越精确并且太小可能出现过拟合的问题。
算法的缺点主要在于对于每一个需要预测的点,都要重新依据整个数据集模拟出一个线性回归模型出来,使得算法的代价极高。————————————————
版权声明:本文为CSDN博主「美麗突然發生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tianse12/article/details/70161591
局部加权线性回归是不需要“学习”的,属于和KNN一样的性质,这点性质甚至还不如线性回归
代码如下:
'''
Created on Jan 8, 2011
@author: Peter
'''
from numpy import *
#局部加权线性回归,需要手动选择一个合适的k
#输入的是一个向量而不是矩阵,它一次只能处理一个预测!有点捞
def lwlr(testPoint,xArr,yArr,k=1.0):
#x和y是训练集样本
xMat = mat(xArr); yMat = mat(yArr).T
#m是样本个数
m = shape(xMat)[0]
#创建一个对角单位矩阵用来保存权重w
#使用矩阵而不是向量的原因是为了最后用矩阵乘法好算,公式里面也是这样写的
weights = mat(eye((m)))
for j in range(m): #next 2 lines create weights matrix
#一个样本计算一遍,填到weight中
diffMat = testPoint - xMat[j,:] #
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
xTx = xMat.T * (weights * xMat)
if linalg.det(xTx) == 0.0:
print ("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T * (weights * yMat))
return testPoint * ws
#对多个待回归点进行回归
def lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat
#输出x和y坐标,比lwlrTest更方便将结果画出来
def lwlrTestPlot(xArr,yArr,k=1.0): #same thing as lwlrTest except it sorts X first
yHat = zeros(shape(yArr)) #easier for plotting
xCopy = mat(xArr)
xCopy.sort(0)#按第一个特征排个序
for i in range(shape(xArr)[0]):
yHat[i] = lwlr(xCopy[i],xArr,yArr,k)
return yHat,xCopy