多元線性模型原理和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 訓練集下載地址: http://files.cnblogs.com/files/sumai/iris.rar

輸出如下圖:

原始花萼的長度數據為5.4,所以擬合是成功的,至於精度就不好說了。

線性回歸:就是找到若干樣本屬性值(自變量)與標記值(我的擬合目標,因變量)的線性關系。剛學這個,有錯誤,望指出。

由於第一次發這種文章,排版和公式都不好,大家見諒。

參考: 1.  https://www.cnblogs.com/sumai/p/5211558.html

            2. 周志華的《機器學習》

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM