算法介绍
回归,一般都是指线性回归(linear regression),本文的回归和线性回归代表同一
个意思。线性回归意味着可以将输人项分别乘以一些常量,再将结果加起来得到输出。
应当怎样从一大堆数据里求出回归方程呢?假定输人数据存放在矩阵X中,而回归系数存放
在向量W中。那么对于给定的数据
X
1
X{_{1}}
X1 , 预测结果将会通过
Y
1
=
X
1
T
W
Y_{1}= {X_{1}}^{T}W
Y1=X1TW
给出。现在的问题是,手里有一些
X
1
X{_{1}}
X1和对应的y怎样才能找到W呢? 一个常用的方法就是找出使误差最小的W这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差
平方误差公式:
用矩阵表示还可以写做
对W求导,
令其等于零,解出w如下
算法实现
def loadDataSet(fileName): #general function to parse tab -delimited floats
numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields
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 standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:
print "This matrix is singular, cannot do inverse"
return
ws = xTx.I * (xMat.T*yMat)
return ws
测试代码
if __name__ == '__main__':
xArr,yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr,yArr)
print(ws)
xMat=mat(xArr)
yMat =mat(yArr)
yHat = xMat* ws
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()
得到的ws的结果为
[[ 3.00774324]
[ 1.69532264]]