一、概念简述
下图是线性回归的模型函数,目的就是通过一系列的测试数据求出θ的值,来更好地拟合连续的数据。
做法是最小化代价函数J(θ)(这里用的是平方误差),这里的代价函数在台湾的视频中指的是in-sample:Ein。这分为两种方式,一种是按照单个训练样本更新θ,采用梯度下降法和最小均方法(LMS),第二种是最小二乘法直接得到。
线性回归还有一个用途,就是可以利用线性回归得到二分类感知器的W0,减少分类器迭代的运算时间。
二、基本线性回归的Python 实现
(1)数据导入和回归函数
from numpy import * # 导入 numpy 库
#Linear Regression
def loadDataSet(filename):
numFeat = len(open(filename).readline().split('\t'))-1
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"
return
ws = xTx.I * (xMat.T*yMat)
return ws
(2)绘制图像
#-*- coding: UTF-8 -*-
import LinerRegression
import matplotlib.pyplot as plt
from numpy import *
xArr,yArr = LinerRegression.loadDataSet('ex0.txt')
ws = LinerRegression.standRegres(xArr,yArr)
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]) #散点图
#flatten 用法
# >>> a = [[1,3],[2,4],[3,5]]
# 02.>>> a = mat(a)
# 03.>>> y = a.flatten()
# 04.>>> y
# 05.matrix([[1, 3, 2, 4, 3, 5]])
# 06.>>> y = a.flatten().A
# 07.>>> y
# 08.array([[1, 3, 2, 4, 3, 5]])
# 09.>>> shape(y)
# 10.(1, 6)
# 11.>>> shape(y[0])
# 12.(6,)
# 13.>>> y = a.flatten().A[0]
# 14.>>> y
# 15.array([1, 3, 2, 4, 3, 5])
xCopy = xMat.copy()
xCopy.sort(0) #arr.sort(0) #二维数组按列排序; arr.sort(1) #二维数组按行排序;
yHat = xCopy*ws
ax.plot(xCopy[:,1],yHat) #绘制回归线
plt.show()
(3)预测值和训练值的匹配程度
Numpy库提供了corrcoef(yEstimate,yActual)来计算预测值和真实值的相关性。注意两个参数都应该是行向量。