多元线性模型原理和python代码
本文分享网址: http://www.cnblogs.com/DesertHero2013/p/7662721.html
1)目标:通过一个属性的线性组合;来进行预测模型。即:
其中 是
;w和b学成后,模型就确定了。 其实
可以理解成各个属性值的权值。
2)性能度量: 求出均方误差并使它最小化,就是我们要求的w和b:
均方误差是各数据偏离真实值的距离平方和的平均数,也即误差平方和的平均数,可这里没看到他除以m。当然,平方和最小,除以m也是最小。
用最小二乘法来使上面式子最小,就是使样本到直线上的欧式距离最小。
A.最小二乘:找到一个(组)估计值,使得实际值与估计值的距离最小。本来用两者差的绝对值汇总并使之最小是最理想的,但绝对值在数学上求最小值比较麻烦,因而替代做法是,找一个(组)估计值,使得实际值与估计值之差的平方加总之后的值最小,称为最小二乘。“二乘”的英文为least square,其实英文的字面意思是“平方最小”。这时,将这个差的平方的和式对参数求导数,并取一阶导数为零,就是OLSE。
3)一般的,我们遇到的不止一个属性,所以我用矩阵的形式来解决。X 表示m*(d+1)大小的矩阵,表示属性值,y是标记,w*是我们要求得权值。
这个是使得误差的平方和最小,例如下面表示:
这里的 = (w,b) ,是故意组合的向量。w是向量,b是一个值,相当于弥补的误差。目标就是求得误差平方和最小的时候的参数w和b!
即为均方差的矩阵形式,要是它最小,只要对 求导即可。 得到:
令上式=0,可知我们要求的参数。
这就是我们可以编程用的公式,这种方法的称为正规方程法。上面式子怎么求出来的?
2X^T(Xw-y) = 0 ,
2X^TXw-2X^Ty = 0
X^TXw = X^Ty
若X^TX满秩,则可逆,故两边同时左乘(X^TX)^-1 即可。
故得:
w =((X^TX)^-1)X^Ty ,即为上面结果。
下面是我们的Python代码:
# -*- coding: utf-8 -*- """ Created on Tue Oct 10 23:10:00 2017 Version:python3.5.1 @author: Stone """ import pandas as pd from numpy.linalg import inv from numpy import dot # 正规方程法 # 拟合线性模型: Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width # 该模型以萼片宽度+花瓣宽度+花瓣长度 来推测萼片长度。 # 即模型:Sepal.Length = Sepal.Width * x1 + Petal.Length * x2 + Petal.Width * x3 + b iris = pd.read_csv('iris.csv') #读取iris.csv 文件 temp = iris.iloc[:,2:5] #表示在你定义的矩阵iris中,分别是行[0,end),列[2:5) # iloc直接确定行列数,左闭右开 temp['x0'] = 1 #为了把误差b加入w*=(w,b)向量(周志华的《机器学习》P55页的 w*上面有个‘^’符号,这里不好输入),temp表格后面加以1列X0,并每行赋值1,就是为了把b吸收进入w*。 X = temp.iloc[:,[0,1,2,3 ]] #赋值矩阵X为0,1,2,3列,150行。 列名为 Sepal.Width,Petal.Length,Petal.Width,x0 Y = iris.iloc[:,1] #选取标记列:Sepal.Length ,就是我们的拟合目标Sepal.Length。 Y = Y.values.reshape(len(iris), 1) #values是返回值 reshape()重塑数组,如这里变成新的1列iris表格长度的列表,形如[[a],[b],...] #书上Y是标记,就是我们要拟合的目标。 theta_n = dot(dot(inv(dot(X.T, X)), X.T), Y) # theta = (X'X)^(-1)X'Y dot是按照矩阵乘法的规则来运算,inv()是求逆矩阵的 X.T是X矩阵的转制 print(theta_n) #打印权重系数 print('请依次输入需要预测的Sepal.Width,Petal.Length,Petal.Width:') x1,x2,x3 = map(float,input().split()) t = (0.65083716*x1 + 0.70913196*x2 - 0.55648266*x3 + 1.85599749 ) print('预测的花萼长度为:',t) #测试了下,三种数据的误差还可以,至少能拟合了。 #上面x1,x2,x3,b的系数值就是我们求出来的权值。
本代码使用的iris 训练集下载地址: https://files.cnblogs.com/files/sumai/iris.rar
输出如下图:
原始花萼的长度数据为5.4,所以拟合是成功的,至于精度就不好说了。
线性回归:就是找到若干样本属性值(自变量)与标记值(我的拟合目标,因变量)的线性关系。刚学这个,有错误,望指出。
由于第一次发这种文章,排版和公式都不好,大家见谅。
参考: 1. https://www.cnblogs.com/sumai/p/5211558.html
2. 周志华的《机器学习》