1 #_*_coding:utf-8_*_
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 def loadDataSet(fileName):
6 #numFeat表示特征的数量
7 numFeat = len(open(fileName).readline().split("\t")) - 1
8 dataMat = [];labelMat = []
9 fr = open(fileName)
10 for line in fr.readlines():
11 lineArr = []
12 curLine = line.strip().split("\t")
13 for i in range(numFeat):
14 lineArr.append(float(curLine[i]))
15 dataMat.append(lineArr)
16 labelMat.append(float(curLine[-1]))
17 return dataMat,labelMat
18
19 def standRegres(xArr,yArr):
20 xMat = np.mat(xArr);yMat = np.mat(yArr).T
21 xTx = xMat.T * xMat
22 if np.linalg.det(xTx) == 0.0:
23 print "This matrix is singular, cannot do inverse"
24 return
25 ws = xTx.I * (xMat.T * yMat)
26 return ws
27
28 def lwlr(testPoint,xArr,yArr,k = 1.0):
29 xMat = np.mat(xArr);yMat = np.mat(yArr).T
30 m = np.shape(xMat)[0]
31 weights = np.mat(np.eye(m))
32 for j in range(m):
33 diffMat = testPoint - xMat[j,:]
34 weights[j,j] = np.exp(diffMat * diffMat.T / (-2.0 * k ** 2))
35 xTx = xMat.T * (weights * xMat)
36 if np.linalg.det(xTx) == 0.0:
37 print "This matrix is singular, cannot do inverse"
38 return
39 ws = xTx.I * (xMat.T * (weights * yMat))
40 return testPoint * ws
41
42 def lwlrTest(testArr,xArr,yArr,k = 1.0):
43 m = np.shape(testArr)[0]
44 yHat = np.zeros(m)
45 for i in range(m):
46 yHat[i] = lwlr(testArr[i],xArr,yArr,k)
47 return yHat
48
49 if __name__ == "__main__":
50 xArr,yArr = loadDataSet("ex0.txt")
51 yHat = lwlrTest(xArr,xArr,yArr,0.01)
52 xMat = np.mat(xArr)
53 srtInd = xMat[:,1].argsort(0)
54 xSort = xMat[srtInd][:,0,:]
55
56 fig = plt.figure()
57 ax = fig.add_subplot(111)
58 ax.plot(xSort[:,1],yHat[srtInd])
59 ax.scatter(xMat[:,1].flatten().A[0],np.mat(yArr).T.flatten().A[0],s=2,c="red")
60 plt.show()