介绍
线性回归是假设特证满足线性关系,根据给定的训练数据训练一个模型,即回归方程,并用此模型进行预测,回归:求回归系数的过程。具体做法是用回归系数乘以输入值,将结果相加,得到预测值。它是一种针对数值型数据的监督学习方法。
特点
适用于数值型,如果是标称型或名义型的数据,需要转为数值型数据
对于非线性数据拟合较差
查看数据分布
- 数据集包含150个样本,每个样本共2个特征,第1个为输入,第2个为结果。由于没有提供测试集,因此随机选择100个样本作为训练集,50个样本剔除结果后作为测试集;
- 通过散点图查看样本分布情况
#!/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()
可以看出,第一维特征和第二维特征具有某种线性关系
回归方程
Yi=XTi∗w
Xi表示输入矩阵,向量w存放回归系数,Yi指预测结果
具体做法
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()
由上图可知,YPre预测值和YTarr实际值的相关系数达到0.95,采用此方法具有建模效果不错。