php ml 非线性回归,机器学习 | 预测数值型数据:回归

这篇博客介绍了如何使用Python进行线性回归和局部加权线性回归的实现。首先,通过`loadDataSet`函数读取数据,然后利用`standRegres`函数计算标准线性回归的权重。接着,`lwlr`函数展示了局部加权线性回归的过程,它根据给定的核(高斯核)和距离衰减权重,对每个样本点进行加权回归。最后,`drawFigure2`函数绘制了数据点及预测曲线,直观展示回归效果。
摘要由CSDN通过智能技术生成

由于近期学业繁重QAQ,所以我就不说废话了,直接上代码~

线性回归

bVbqyFx?w=896&h=667

局部加权线性回归

bVbqyFy?w=901&h=645

代码

from numpy import *

import matplotlib.pyplot as plt

#标准回归函数和数据导入函数

#默认文本的最后一行为目标值

#第一列为偏移量,假定为常数1.0

#第二列为x1,也就是图中的横坐标

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

#计算最佳拟合曲线

#.T标识矩阵的转置

def standRegres(xArr,yArr):

xMat=mat(xArr)

#矩阵转置,变程行向量

yMat=mat(yArr).T

#判断xTx的转置与xTx相乘是否为0

xTx=xMat.T*xMat

#若为0,那么计算逆矩阵的时候会出错

if linalg.det(xTx)==0.0:

print("this matrix is singular,cannot do inverse")

return

#计算ws

#.I返回矩阵的逆

ws=xTx.I*(xMat.T*yMat)

return ws

#绘制数据集散点图和最佳拟合直线图

def drawFigure():

xArr,yArr=loadDataSet('ex0.txt')

ws=standRegres(xArr,yArr)

xMat=mat(xArr)

yMat=mat(yArr)

fig=plt.figure()

ax=fig.add_subplot(111)

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()

#局部加权线性回归

#给待预测的点附近的每个点赋予一定的权重

#在这个子集上基于最小均方差来进行普通的回归

#使用的核为高斯核

#最终构建了一个只含对角元素的权重矩阵w,并且x与x(i)越近,

#w(i,i)将会越大

#局部加权线性回归函数

def lwlr(testPoint,xArr,yArr,k=1.0):

xMat=mat(xArr)

yMat=mat(yArr).T

m=shape(xMat)[0]

#创建对角矩阵

#权重矩阵是一个方阵,阶数为样本点的个数

#该矩阵为每个样本点初始化了一个权重

weights=mat(eye((m)))

#遍历数据集,计算每个样本点对应的权重值

#随着样本点与待预测点距离的递增,权重将以指数级衰减

#参数k控制衰减的速度

#权重值大小以指数级衰减

for j in range(m):

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):

m=shape(testArr)[0]

yHat=zeros(m)

#为数据集中的每个点调用lwlr()

for i in range(m):

yHat[i]=lwlr(testArr[i],xArr,yArr,k)

return yHat

def drawfigure2():

xArr,yArr=loadDataSet('ex0.txt')

#print(yArr[0])

yHat0=lwlr(xArr[0],xArr,yArr,1.0)

#print(yHat0)

yHat=lwlrTest(xArr,xArr,yArr,0.01)

xMat=mat(xArr)

strInd=xMat[:,1].argsort(0)

xSort=xMat[strInd][:,0,:]

fig=plt.figure()

ax=fig.add_subplot(111)

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()

def main():

drawfigure2()

#drawFigure()

#xArr,yArr=loadDataSet('ex0.txt')

#ws=standRegres(xArr,yArr)

#xMat=mat(xArr)

#yMat=mat(yArr)

#计算预测值yHat和真实值y的匹配程度——计算两个序列的相关程度

#yHat=xMat*ws

#arr=corrcoef(yHat.T,yMat)

#yHat与yMat的相关系数为0.98

#[[1. 0.98647356]

#[0.98647356 1. ]]

#print(arr)

#[[1.0, 0.067732], [1.0, 0.42781],...]

#print(xArr)

#[3.176513, 3.816464,...]

#print(yArr)

#[[3.00774324]

#[1.69532264]]

#Haty=wx[0]*x0+ws[1]*x1

#print(ws)

if __name__=='__main__':

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值