from numpy
import *
import matplotlib.pyplot as plt
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
(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
xArr
= [[1, 732
],
[1, 733
],
[1, 734
],
[1, 735
],
[1, 736
],
[1, 737
],
[1, 738
],
[1, 739
],
[1, 740
],
[1, 741
],
[1, 742
],
[1, 743
],
[1, 744
],
[1, 745
],
[1, 746
],
[1, 747
],
[1, 748
],
[1, 749
],
[1, 750
],
[1, 751
],
[1, 752
],
[1, 753
],
[1, 754
],
[1, 755
],
[1, 756
],
[1, 757
],
[1, 758
],
[1, 759
],
[1, 760
],
[1, 761
],
[1, 762
]]
yArr
= [427.32139373952896, 430.735363778539, 425.6767343525396, 431.4185708563029, 430.99515141425684, 432.3820058846558, 433.74955658806323, 433.5750437214359, 433.7781211647823, 431.3961869282752, 433.9786575155382, 439.3783187858723, 440.22278884180486, 439.7035715665656, 436.3271129747373, 437.6662079987627, 441.00947912285056, 436.8307767906325, 440.9128942751956, 438.4408287267856, 432.90572835049574, 444.17917838673696, 449.64086693594845, 443.6499887657059, 446.6215382473078, 444.3090856509079, 442.6554589980954, 447.21599252533633, 445.5086451071811, 446.07960289412387, 447.5937190253615
]
yHat1
= lwlrTest
(xArr,xArr,yArr,0.5
)
yHat2
= lwlrTest
(xArr,xArr,yArr,1
)
yHat3
= lwlrTest
(xArr,xArr,yArr,1.5
)
print
(yArr
[15
])
print
(yHat1
[15
])
xMat
= mat
(xArr
);yMat
= mat
(yArr
)
srtInd
= xMat
[:,1
].argsort
(0
)
xSort
= xMat
[srtInd
][:,0,:
]
fig
= plt.figure
()
ax
= fig.add_subplot
(131
)
ax.plot
(xSort
[:,1
],yHat1
[srtInd
])
ax.scatter
(xMat
[:,1
].flatten
().A
[0
],mat
(yArr
).T.flatten
().A
[0
],
)
plt.title
('k=0.5')
ax
= fig.add_subplot
(132
)
ax.plot
(xSort
[:,1
],yHat2
[srtInd
])
ax.scatter
(xMat
[:,1
].flatten
().A
[0
],mat
(yArr
).T.flatten
().A
[0
],
)
plt.title
('k=1')
ax
= fig.add_subplot
(133
)
ax.plot
(xSort
[:,1
],yHat3
[srtInd
])
ax.scatter
(xMat
[:,1
].flatten
().A
[0
],mat
(yArr
).T.flatten
().A
[0
],
)
plt.title
('k=1.5')
plt.show
()
结果