Gun's Blog

机器学习--多元线性回归算法

Word count: 833Reading time: 3 min
2019/08/27 Share

一.预备知识:
假定输入数据存放在矩阵X中,结果存放在向量y中:

那么对于给定的数据x1,即矩阵X的第一列数据,预测结果u1将会通过如下公式给出:

现在的问题是,手里有数据矩阵X和对应的标签向量y,怎么才能找到w呢?
一个常用的方法就是找出使误差最小的w。这里的误差是指预测u值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。
平方误差和可以写做:

在继续推导之前,先明确一个目的:找到w,使平方误差和最小。因为我们认为平方误差和越小,说明线性回归拟合效果越好。
现在,我们用矩阵表示的平方误差和对w进行求导,并令其等于0,得到:

w上方的小标记表示,这是当前可以估计出的w的最优解。从现有数据上估计出的w可能并不是数据中的真实w值,所以这里使用了一个”帽”符号来表示它仅是w的一个最佳估计。
需要注意的是,上述公式中包含逆矩阵,也就是说,这个方程只在逆矩阵存在的时候使用,也即是这个矩阵是一个方阵,并且其行列式不为0。

二.代码实现:
1.数据可视化:
showData.py代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import matplotlib.pyplot as plt
import numpy

def loadDataSet(fileName):
numFeat=len(open(fileName).readline().split('\t'))-1 #读取第一行数据
xArr=[]
yArr=[]
fr=open(fileName)
for line in fr.readlines():
lineArr=[]
curLine=line.strip().split('\t') #去掉开头结尾的空白(包括空格和换行符),最后返回长度为numFeat的列表;
'''
['1.0','0.067732','2.0']
'''
for i in range(numFeat):
lineArr.append(float(curLine[i])) #[1.0,0.067732]
xArr.append(list(lineArr))
yArr.append(float(curLine[-1]))
return xArr,yArr

def plotDataSet():
xArr,yArr=loadDataSet('exo.txt')
n=len(xArr)
xcord=[]
ycord=[]
for i in range(n):
xcord.append(xArr[i][1])
ycord.append(yArr[i])
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(xcord,ycord,s=20,c='green',alpha=0.5)
plt.title("dataSet")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

if __name__=='__main__':
plotDataSet()

可视化结果:
dataSet

三.线性回归预测:
代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(file_name):
numFeat=len(open(file_name).readline().split('\t'))-1
data_mat=[];label_mat=[]
fr=open(file_name)
for line in fr.readlines():
lineArr=[]
curLine=line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
data_mat.append(lineArr)
label_mat.append(float(curLine[-1]))
return data_mat,label_mat

def standRegres(xArr,yArr):
x_mat=mat(xArr);y_mat=mat(yArr).T
XTX=x_mat.T*x_mat
if linalg.det(XTX)==0.0:
print('gaijuzhenbukeni')
return
ws=XTX.I*(x_mat.T*y_mat)
return ws

def show_linear_regre():
xArr,yArr=loadDataSet('exO.txt')
ws=standRegres(xArr, yArr)
x_mat=mat(xArr);y_mat=mat(yArr)
y_Hat=x_mat*ws
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(x_mat[:,1].flatten().A[0],y_mat.T[:,0].flatten().A[0])

xCopy=x_mat.copy()
xCopy.sort(0)
y_Hat=xCopy*ws
ax.plot(xCopy[:,1],y_Hat,c='red')
plt.title('DataSet')
plt.xlabel('x')
plt.show()

if __name__=='__main__':
show_linear_regre()

可视化结果:
!线性回归预测

CATALOG