多元线性模型原理和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. 周志华的《机器学习》


posted @ 2017-10-13 23:25  Pancho  阅读(1810)  评论(0编辑  收藏  举报