1. 程式人生 > >最小二乘法總結

最小二乘法總結

 一.背景

   5月9號到北大去聽hulu的講座《推薦系統和計算廣告在視訊行業應用》,想到能見到傳說中的項亮大神,特地拿了本《推薦系統實踐》求籤名。講座開始,主講人先問了下哪些同學有機器學習的背景,我恬不知恥的毅然舉手,真是慚愧。後來主講人在講座中提到了最小二乘法,說這個是機器學習最基礎的演算法。神馬,最基礎,我咋不知道呢! 看來以後還是要對自己有清晰認識。

   回來趕緊上百度,搜了下什麼是最小二乘法。

   先看下百度百科的介紹:最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間

誤差的平方和為最小。最小二乘法還可用於曲線擬合。其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。

   通過這段描述可以看出來,最小二乘法也是一種優化方法,求得目標函式的最優值。並且也可以用於曲線擬合,來解決迴歸問題。難怪《統計學習方法》中提到,迴歸學習最常用的損失函式是平方損失函式,在此情況下,迴歸問題可以著名的最小二乘法來解決。看來最小二乘法果然是機器學習領域做有名和有效的演算法之一。

二. 最小二乘法

   我們以最簡單的一元線性模型來解釋最小二乘法。什麼是一元線性模型呢? 監督學習中,如果預測的變數是離散的,我們稱其為分類(如決策樹,支援向量機等),如果預測的變數是連續的,我們稱其為迴歸。迴歸分析中,如果只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。如果迴歸分析中包括兩個或兩個以上的自變數,且因變數和自變數之間是線性關係,則稱為多元線性迴歸分析。對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面...

   對於一元線性迴歸模型, 假設從總體中獲取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對於平面中的這n個點,可以使用無數條曲線來擬合。要求樣本回歸函式儘可能好地擬合這組值。綜合起來看,這條直線處於樣本資料的中心位置最合理。 選擇最佳擬合曲線的標準可以確定為:使總的擬合誤差(即總殘差)達到最小。有以下三個標準可以選擇:

        (1)用“殘差和最小”確定直線位置是一個途徑。但很快發現計算“殘差和”存在相互抵消的問題。
        (2)用“殘差絕對值和最小”確定直線位置也是一個途徑。但絕對值的計算比較麻煩。
        (3)最小二乘法的原則是以“殘差平方和最小”確定直線位置。用最小二乘法除了計算比較方便外,得到的估計量還具有優良特性。這種方法對異常值非常敏感。

  最常用的是普通最小二乘法( Ordinary  Least Square,OLS):所選擇的迴歸模型應該使所有觀察值的殘差平方和達到最小。(Q為殘差平方和)- 即採用平方損失函式。

  樣本回歸模型:

                                     其中ei為樣本(Xi, Yi)的誤差

   平方損失函式:

                      

   則通過Q最小確定這條直線,即確定,以為變數,把它們看作是Q的函式,就變成了一個求極值的問題,可以通過求導數得到。求Q對兩個待估引數的偏導數:

                       

    根據數學知識我們知道,函式的極值點為偏導為0的點。

    解得:

                   

這就是最小二乘法的解法,就是求得平方損失函式的極值點。

三. C++實現程式碼

複製程式碼
 1 /*
 2 最小二乘法C++實現
 3 引數1為輸入檔案
 4 輸入 : x
 5 輸出: 預測的y  
 6 */
 7 #include<iostream>
 8 #include<fstream>
 9 #include<vector>
10 using namespace std;
11 
12 class LeastSquare{
13     double a, b;
14 public:
15     LeastSquare(const vector<double>& x, const vector<double>& y)
16     {
17         double t1=0, t2=0, t3=0, t4=0;
18         for(int i=0; i<x.size(); ++i)
19         {
20             t1 += x[i]*x[i];
21             t2 += x[i];
22             t3 += x[i]*y[i];
23             t4 += y[i];
24         }
25         a = (t3*x.size() - t2*t4) / (t1*x.size() - t2*t2);  // 求得β1 
26         b = (t1*t4 - t2*t3) / (t1*x.size() - t2*t2);        // 求得β2
27     }
28 
29     double getY(const double x) const
30     {
31         return a*x + b;
32     }
33 
34     void print() const
35     {
36         cout<<"y = "<<a<<"x + "<<b<<"\n";
37     }
38 
39 };
40 
41 int main(int argc, char *argv[])
42 {
43     if(argc != 2)
44     {
45         cout<<"Usage: DataFile.txt"<<endl;
46         return -1;
47     }
48     else
49     {
50         vector<double> x;
51         ifstream in(argv[1]);
52         for(double d; in>>d; )
53             x.push_back(d);
54         int sz = x.size();
55         vector<double> y(x.begin()+sz/2, x.end());
56         x.resize(sz/2);
57         LeastSquare ls(x, y);
58         ls.print();
59         
60         cout<<"Input x:\n";
61         double x0;
62         while(cin>>x0)
63         {
64             cout<<"y = "<<ls.getY(x0)<<endl;
65             cout<<"Input x:\n";
66         }
67     }
68 }
複製程式碼

四. 最小二乘法與梯度下降法

   最小二乘法跟梯度下降法都是通過求導來求損失函式的最小值,那它們有什麼區別呢。

   相同


  1.本質相同:兩種方法都是在給定已知資料(independent & dependent variables)的前提下對dependent variables算出出一個一般性的估值函式。然後對給定新資料的dependent variables進行估算。
  2.目標相同:都是在已知資料的框架內,使得估算值與實際值的總平方差儘量更小(事實上未必一定要使用平方),估算值與實際值的總平方差的公式為:

   其中為第i組資料的independent variable,為第i組資料的dependent variable,為係數向量。


   不同
  1.實現方法和結果不同:最小二乘法是直接對求導找出全域性最小,是非迭代法。而梯度下降法是一種迭代法,先給定一個,然後向下降最快的方向調整,在若干次迭代之後找到區域性最小。梯度下降法的缺點是到最小點的時候收斂速度變慢,並且對初始點的選擇極為敏感,其改進大多是在這兩方面下功夫。

 參考: http://blog.csdn.net/qll125596718/article/details/8248249


轉載出處:http://www.cnblogs.com/iamccme/archive/2013/05/15/3080737.html

相關推薦

乘法總結

 一.背景    5月9號到北大去聽hulu的講座《推薦系統和計算廣告在視訊行業應用》,想到能見到傳說中的項亮大神,特地拿了本《推薦系統實踐》求籤名。講座開始,主講人先問了下哪些同學有機器學習的背景,我恬不知恥的毅然舉手,真是慚愧。後來主講人在講座中提到了最小二乘法,說這

R語言中如何使用乘法

一次函數 python 散點圖 博客 如何 這裏只是介紹下R語言中如何使用最小二乘法解決一次函數的線性回歸問題。 代碼如下:(數據同上一篇博客)(是不是很簡單????)> x<-c(6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1

Python中如何使用乘法

python 技術 如何 模型 平面 之所以說”使用”而不是”實現”,是因為python的相關類庫已經幫我們實現了具體算法,而我們只要學會使用就可以了。隨著對技術的逐漸掌握及積累,當類庫中的算法已經無法滿足自身需求的時候,我們也可以嘗試通過自己的方式實現各種算法。 言

機器學習-乘法

red num class cat blank height mar 感覺 時間 一、引言 這段時間學習《機器學習》,學到第5章的“Logistic回歸”,感覺相當吃力。追本溯源,從“Logistic回歸”到“線性回歸”,再到“最小二乘法”。最終定格到了《高等數學》(第六版

Regularized least-squares classification(正則化乘法分類器)取代SVM

得出 ack 提高 kernel sys 風險 重要 ref height 在機器學習或者是模式識別其中有一種重要的分類器叫做:SVM 。這個被廣泛的應用於各個領域。可是其計算的復雜度以及訓練的速度是制約其在實時的計算機應用的主要原因。因此也非常非常多的算法

乘法大似然估計的聯系和區別(轉)

enc bsp 聯系 角度 tro span nbsp sdn .science 對於最小二乘法,當從模型總體隨機抽取n組樣本觀測值後,最合理的參數估計量應該使得模型能最好地擬合樣本數據,也就是估計值和觀測值之差的平方和最小。而對於最大似然法,當從模型總體隨機抽取n組樣本觀

15-乘法搞不定的,讓RANSAC來吧!

統計學 但是 rom 指定 車上 mat table oss div 現實生活總是充滿了雜音。記得高中時,班上某學霸喜歡戴著耳機邊聽JAY的歌邊學習,或許這樣可以幫他進入一個心如止水的境界。剛畢業那會,我也喜歡在班車上戴著耳機聽歌,似乎逃避現實是常態。把嘈雜的現實屏蔽在

算法#03--具體解釋乘法原理和代碼

column entry 結束 ati alt for args 集合 else 最小二乘法原理 最小二乘法的目標:求誤差的最小平方和,相應有兩種:線性和非線性。線性最小二乘的解是closed-form(例如以下文),而非線性最小二乘沒有closed-

乘法

mcc 希望 最小化 medium end ima ati 思想 esp 1、什麽是最小二乘思想?簡單地說,最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小.這裏的“二乘”指的是用平方來度量觀測點與估計點的遠近(在古漢語中“平方”稱為“二乘”),“最小”指的是參

乘法多項式曲線擬合原理與實現 zz

博客 del p s 並且 多項式 聯網 python mar 程序 概念 最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地經過這些點,而是曲線y=f(x)的近似曲線y= φ(x)。 原理 [原理部分由個人根據互聯網上的資料進行總結,希望對大

利用乘法擬合脫密坐標的方法

微信 旋轉 殘差 擬合 cnblogs 整體 ont soft 尋找 文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/ 1.背景 公司某項目中,業主使用了由中科院進行過脫密處理的公網地圖,同時提供

Python 普通乘法(OLS)進行多項式擬合

zlabel predict ylabel model for font 結果 param col 多元函數擬合。如 電視機和收音機價格多銷售額的影響,此時自變量有兩個。 python 解法: import numpy as np import pandas as

『PyTorch』第六彈_乘法的不同實現手段(待續)

int pri back imp python return red 最小 num PyTorch的Variable import torch as t from torch.autograd import Variable as V import matplotlib.

python中matplotlib實現乘法擬合的過程詳解

ast array plt atp ons 正則 key code 擬合 這篇文章主要給大家介紹了關於python中matplotlib實現最小二乘法擬合的相關資料,文中通過示例代碼詳細介紹了關於最小二乘法擬合直線和最小二乘法擬合曲線的實現過程,需要的朋友可以參考借鑒,下

解決異方差問題--加權乘法

bubuko 異常 收入 信息 del seed 例如 假設 尋求 異方差問題    Ordinary Least Squares (OLS) 需要四個 - -有些人說五或六個 - 假設要滿足,但建模時我們經常會遇到異方差(Heteroskedasticity)問題, 那是

簡單線性迴歸-乘法推導過程

最近學習線性迴歸,自己推導了一下最小二乘法。  其他參考文章: https://blog.csdn.net/chasdmeng/article/details/38869941?utm_source=blogxgwz0 https://blog.csdn.net/iter

sklearn使用——乘法

參考網頁:http://sklearn.apachecn.org/cn/0.19.0/ 其中提供了中文版的檔案說明,較為清晰。   1 from sklearn.linear_model import LinearRegression as lr 2 import matplotli

乘法進行曲線擬合 Python

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習筆記(一):乘法和梯度下降

一、最小二乘法 1.一元線性擬合的最小二乘法 先選取最為簡單的一元線性函式擬合助於我們理解最小二乘法的原理。 要讓一條直接最好的擬合紅色的資料點,那麼我們希望每個點到直線的殘差都最小。 設擬合直線為

非線性乘法之Gauss Newton、L-M、Dog-Leg原理簡介與實現

double func(const VectorXd& input, const VectorXd& output, const VectorXd& params, double objInd