线性回归是假设特证满足线性关系,根据给定的训练数据训练一个模型,即回归方程,并用此模型进行预测,回归:求回归系数的过程。具体做法是用回归系数乘以输入值,将结果相加,得到预测值。它是一种针对数值型数据的监督学习方法。
适用于数值型,如果是标称型或名义型的数据,需要转为数值型数据
对于非线性数据拟合较差
#!/bin/usr/python
# -*- coding:utf-8 -*-
from numpy import *
from matplotlib import pyplot as plt
def loadDataSet(fileName):
data = []
dataSet = []
xArr = []
yArr = []
fr = open(fileName)
[data.append(line.strip('\r\n').split(',')) for line in fr.readlines()]
[dataSet.append([float(line[0]), float(line[1])]) for line in data]
[xArr.append([1,line1[0]]) for line1 in dataSet]
[yArr.append(line2[-1]) for line2 in dataSet]
return dataSet,xArr,yArr
def show(dataSet,xarr,yarr,ws):
for i in range(shape(dataSet)[0]):
plt.scatter(dataSet[i][0], dataSet[i][1], marker='o', color='r', label='1', s=10)
plt.xlabel("X")
plt.ylabel("Y")
plt.title('Sample Distribute')
plt.show()
具体做法
1. 找到使误差最小的w, 误差是指预测值和真实值之间的误差
2. 由于误差可正可负,因此采用平方误差
∑i=1m(yi−xTiw)2
3. 对w求导,令它等于0,得到w的最优值:
w优=(XTX)−1XTy
def regression(xArr,yArr):
xMat = mat(xArr)
yMat = mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:
print "矩阵不可逆!!"
return
w = xTx.I * (xMat.T*yMat)
return w
def show(dataSet,xarr,yarr,ws):
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],marker='o', color='r', label='1', s=10)
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xMat * ws
ax.plot(xCopy[:,1],yHat)
plt.xlabel("X")
plt.ylabel("Y")
plt.title('Regression')
plt.show()
方法:计算测试集的被剔除的真实Y序列和预测Y序列的相关系数
def main():
dataSet,xarr,yarr = loadDataSet(r'/home/hu/文档/ML/iris.txt') #load trainSet
testSet,xTarr,yTarr = loadDataSet(r'/home/hu/文档/ML/irisTest.txt') # load testSet
#w = regression(xarr,yarr)
w = regression(xTarr,yTarr)
YPre = mat(xTarr)*w
print corrcoef(YPre.T,yTarr)
show(dataSet,xarr,yarr,w)
if __name__ == '__main__':
main()