#利用局部加权线性回归函数,对数据集xArr中的每一个样本点进行预测,并绘制预测折线图与原数据散点图的叠加图 #step1:绘制原数据散点图 xArr,yArr = loadDataSet('ex0.txt') plt.scatter(array(xArr)[:,1],array(yArr)) #step2: 绘制拟合线(局部加权线性回归)
时间: 2024-02-25 09:56:10 浏览: 54
以下是代码实现:
```python
import matplotlib.pyplot as plt
from numpy import *
# 加载数据集
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 lwlr(testPoint, xArr, yArr, k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))
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(xArr, yArr, k=1.0):
yHat = zeros(shape(yArr))
for i in range(shape(xArr)[0]):
yHat[i] = lwlr(xArr[i], xArr, yArr, k)
return yHat
# 绘制原数据散点图
xArr, yArr = loadDataSet('ex0.txt')
plt.scatter(array(xArr)[:,1], array(yArr), s=20, c='blue', alpha=.5)
# 绘制拟合线(局部加权线性回归)
yHat = lwlrTest(xArr, yArr, k=0.01)
srtInd = array(xArr)[:,1].argsort(0)
xSort = array(xArr)[srtInd]
plt.plot(xSort[:,1], yHat[srtInd], c='red')
# 绘制预测折线图与原数据散点图的叠加图
plt.show()
```
其中,`lwlr()` 函数是局部加权线性回归函数,用于对单个样本点进行预测;`lwlrTest()` 函数用于对数据集中的所有样本点进行预测;`loadDataSet()` 函数用于加载数据集;`plt.scatter()` 函数用于绘制原数据散点图;`plt.plot()` 函数用于绘制拟合线;最后调用 `plt.show()` 函数将预测折线图与原数据散点图的叠加图展示出来。
阅读全文