最小二乘法之加權最小二乘的應用

2021-01-14 編碼珠璣

我在上文「對最小二乘法擬合直線的一些思考與改進」中介紹了通過距離的平方來擬合一條直線,這實際上也是一個PCA問題,但是我在結尾也說了,這種擬合方法的缺點是對離群噪點的幹擾異常明顯,稍不留神就把我們的目標給拉偏了,比如下面這張圖片,在工業機器視覺檢測中,為了測量某些產品的高精密尺寸,我們需要擬合出圖中斜邊邊緣的準確直線方程,但是由於產品的缺陷,在邊緣處往往有噪點的存在:


而如果我們不加以處理而直接擬合的話,最終的擬合結果是這樣的:


綠線是我們根據上篇文章推導出來的公式進行擬合出來的結果,這顯然不是我們所要的結果。由於噪點的幹擾,我們所需的邊緣直線方程被拉偏了。


這是由於在實際擬合過程中,離群較大的點它們都有很大的權重,而實際上每個點都應該有不同的權重,越偏離目標點它們的權重應該越小。因此我們迫切需要對每個點都定義一個權重,這就是今天我要介紹的加權最小二乘法。


在介紹這個算法之前,先回答一個問題,上篇文章中,有網友私信問我為什麼那個參數方程要選取較小的特徵值與特徵向量:


這個問題我在上篇文中只是提到了一下,最小距離的總和剛好是數據集矩陣的特徵值,但並沒有說明具體的原因,這裡給出一個更直觀的證明方法:



如上圖所示,我們定義一個直線的單位法向量 

也即: 

因此:


好了,我們再回到剛開始那個問題,我們究竟該對每個點如何定義權重值 


但是我們究竟如何這個權重閾值 


那麼我們該採用哪種方式進行擬合呢,上面說了,權重的取值跟點到直線的距離密切相關,因此我們依然採用點到直線距離的最小來擬合,這也是一個條件極值問題,同樣需要適配拉格朗日乘子: 


下面給出實例代碼(c++版):

bool FitLineWeight(vector<POINT> vec, double &a, double &b, double &c){  if (vec.size() < 2)  {    return false;  }    FitLine(vec, a, b, c);
  for (size_t it = 0; it < times; it++) { if (vec.size() < 2) { return false; } double sum_x = 0.0f, sum_y = 0.0f; double avg_x = 0.0f, avg_y = 0.0f; vector<double> vecDistance; for (size_t i = 0; i < vec.size(); i++) { double d = abs(a * vec[i].x + b * vec[i].y + c); vecDistance.push_back(d); }     sort(vecDistance.begin(), vecDistance.end());
double median; if (vecDistance.size() % 2 == 0) { median = (vecDistance[vecDistance.size() / 2 - 1] + vecDistance[vecDistance.size() / 2]) / 2; } else { median = vecDistance[vecDistance.size() / 2]; } double t = 2 * (median / 0.6745); double sum_ww = 0.0f; vector<double> vecW; for (int i = 0; i < vec.size(); i++) { double w; double d = abs(a * vec[i].x + b * vec[i].y + c); if (d <= t) { w = 1; } else { w = t / d; }
vecW.push_back(w); sum_x += w * w * vec[i].x; sum_y += w * w * vec[i].y; sum_ww += w * w; } avg_x = sum_x / sum_ww; avg_y = sum_y / sum_ww;
double L_xx = 0.0f; double L_yy = 0.0f; double L_xy = 0.0f; for (int i = 0; i < vec.size(); i++) { L_xx += pow(vecW[i], 2) * (vec[i].x - avg_x) * (vec[i].x - avg_x); L_xy += pow(vecW[i], 2) * (vec[i].x - avg_x) * (vec[i].y - avg_y); L_yy += pow(vecW[i], 2) * (vec[i].y - avg_y) * (vec[i].y - avg_y); }
double lamd1, lamd2; double lamd; double m, n; m = L_xx + L_yy; n = L_xx * L_yy - L_xy * L_xy; lamd1 = (m + sqrt(m * m - 4 * n)) / 2; lamd2 = (m - sqrt(m * m - 4 * n)) / 2; lamd = lamd1 < lamd2 ? lamd1 : lamd2;
double d = sqrt((L_xx - lamd) * (L_xx - lamd) + L_xy * L_xy); if (abs(d) < 1e-6) { a = 1; b = 0; c = -a * avg_x - b * avg_y; } else { if (lamd >= L_xx) { a = L_xy / d; b = (lamd - L_xx) / d; c = -a * avg_x - b * avg_y; } else { a = -L_xy / d; b = (L_xx - lamd) / d; c = -a * avg_x - b * avg_y; } } }}


按照上面的代碼,分別調整代碼裡面的循環變量 


不迭代結果(也就是沒有權重分析,直接擬合,讓變量 


讓 


迭代兩次又更好了:

 

迭代三次的結果:


可見,只經過了三次迭代,我們擬合的直線就收斂於我們想要的理想結果了。而事實也證明,基本上只要我們迭代三到五次,就能達到很好的效果。


說到這裡,本文就算結束了,等我有空會再通過這種方法驗證一下其他集合圖形的擬合結果,例如圓或者橢圓,到時候再給大家回復。如果你想要本文的原始碼,請掃描下面的圖片,在我公眾號內回復「加權最小二乘」六個字即可,我會將原始碼都發送給你,方便你下去研究學習。

相關焦點

  • 最小二乘法
    Y計= a0 + a1 X (式1-1)  其中:a0、a1 是任意實數  為建立這直線方程就要確定a0和a1,應用《最小二乘法原理》,將實測值Yi與利用(式1-1)計算值(Y計=a0+a1X)的離差(Yi-Y計)的平方和〔∑(Yi - Y計)2〕最小為「優化判據」。
  • 通透 | 最小二乘法的本質是什麼?
    .最小二乘法的一種常見的描述是殘差滿足正態分布的最大似然估計模型具有如下形式:,我嘗試從「法」的角度談談自己對最小二乘『法』的認識。 .實際上像梯度法、高斯法、牛頓法、L-M法、狗腿法(Powell)、都是在解決非線性的最小二乘問題。
  • 手把手教你最小二乘法
    今天這期推送的主題是介紹最小二乘法以及如何利用最小二乘法對已有數據進行擬合。之所以會想到這個主題,是因為前段時間在準備美賽時看到很多最小二乘法的應用,但多數關於其原理的帖子要麼晦澀難懂要麼不夠清楚,就像下面這樣,於是乎萌生出這個想法。        (全文共2479字,我也不知道什麼時候能看完。
  • 來認識一下傳說中的最小二乘法
    最小二乘法在三坐標測量時常常被提起,那什麼是最小二乘法呢?它具備什麼樣的特點?根據標準,哪些要求必須採用最小二乘法呢?
  • 最小二乘法的計算原理
    高斯使用的方法就是最小二乘法,該方法發表於1809年他的著作《天體運動論》中。最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。其中,
  • 什麼是最小二乘法
    值得慶幸的是,在4個月前,測量攻城獅通過查閱大量資料,終於攻克難關,實現運用EXCEL的方式,運算最小二乘法計算平面度,經反覆測試,目前與海克斯康三次元、美國Micro-VU、兆豐的GOOD VISON、賽斯特的OMM等設備計算結果一致。
  • 最小二乘法的前世今生,及其與平均值的關係
    (科茨作品中關於加權平均的記載)以上面的5次月考成績為例,我們先跳出平均數這個圈,來看看一般性原理。為了能夠直觀理解,我們先來作一個簡圖。現在我們要找到一個合適的y值,使得它能替代這5次成績。一個好的想法是讓y到這五個點的豎直距離之和最小。
  • 最小二乘法詳細介紹
    高斯使用的最小二乘法的方法發表於1809年他的著作《天體運動論》中,而法國科學家勒讓德於1806年獨立發現「最小二乘法」,但因不為世人所知而默默無聞。1829年,高斯提供了最小二乘法的優化效果強於其他方法的證明,見高斯-馬爾可夫定理。
  • 最小二乘法的數學公式
    之前在德輝學堂介紹過最小二乘法,但是有很多好學的小夥伴總是追問,最小二乘法的數學公式究竟是怎麼樣的?      本期的這一篇文章,我們將介紹一個簡潔的最小二乘法數學公式,慢慢剖析它,爭取讓好學的小夥伴們能認識它,然後再結合Excel利用它來做一些計算。
  • Python實現最小二乘法
    上一篇文章講了最小二乘算法的原理。這篇文章通過一個簡單的例子來看如何通過Python實現最小乘法的線性回歸模型的參數估計。王松桂老師《線性統計模型——線性回歸與方差分析》一書中例3.1.3。回歸模型的參數估計一元線性模型的一般公式為一元線性回歸模型我們使用最小二乘法估算出α、β即可求出經驗回歸方程。
  • 最小二乘法與線性回歸
    最小二乘法原理例如我們有一組數據,分別對應x(橫坐標)與y(縱坐標)。我們試圖建立x與y的等式關係,並探究x預測y的可靠性。通過繪製散點圖,我們可以對該組數據擬合無數條直線,但是怎樣找到最佳擬合直線呢?最小二乘法可以解決這一問題。第一步:如下。不考慮x值,計算y值的均值b。
  • 第48篇 最小二乘法
    1806年,法國科學家勒讓德獨立創立最小二乘法,但因不為世人所知而默默無聞。勒讓德曾與高斯為誰最早創立最小二乘法原理發生爭執。1809年,高斯使用的最小二乘法的方法發表於《天體運動論》中。1829年,高斯提供了最小二乘法的優化效果強於其他方法的證明,因此最小二乘法也被稱為高斯-馬爾可夫定理。
  • GD&T乾貨|最小二乘法的數學公式詳解
    (GZHl:智慧汽車供應鏈)之前在德輝學堂介紹過最小二乘法,但是有很多好學的小夥伴總是追問,最小二乘法的數學公式究竟是怎麼樣的?本期的這一篇文章,我們將介紹一個簡潔的最小二乘法數學公式,慢慢剖析它,爭取讓好學的小夥伴們能認識它,然後再結合Excel利用它來做一些計算。
  • 線性回歸與最小二乘法
    線性回歸模型是使用最廣泛的模型之一,也最經典的回歸模型,如下所示x軸表示自變量x的值,y軸表示因變量y的值,圖中的藍色線條就代表它們之間的回歸模型
  • 最小二乘法(1)——線性問題
    最小二乘法  常規的方法無法回答小明的問題,幸好高斯老爺子發現了最小二乘法。最小二乘法(又稱最小平方法)是一種通過最小化誤差的平方和,尋找數據最佳函數匹配的優化策略。  上式就是最小二乘法的公式,其中ai 和 bi是已知的,表示約等方程組中第 個方程的相關係數。
  • 最小二乘法(附MATLAB代碼)
    前幾天有一些小夥伴需要小編講一下最小二乘法,小編依稀記得當年數值計算這門課學習過這個知識點,但無奈小編忘得一乾二淨,於是在知乎上看到這位大神對最小二乘法的講解,各位小夥伴如果想直接看這位大神講解的話,可以點擊下方閱讀原文直接進行學習。
  • 線性回歸採用最小二乘作為loss的解釋
    同理,回歸方程可表示如下:   對線性回歸比較熟悉的小夥伴們都知道,計算回歸參數時,使用的損失函數為最小二乘損失,即 loss = ∑ sqt(h(θ) - y)(預測值與真實值的差的平方和),那麼為什麼要採用最小二乘損失呢?
  • 誤差源和方程解算——最小二乘與控制網平差
    59.最小二乘平差平差方法有很多種,但最小二乘平差是最精確,為此,GPS測量中最常用這種平差方法。最小二乘平差原則是基於所有殘差平方和最小的思想,對GPS基線矢量最後平差時,保持其絕對最小。然而,要使殘差平方和最小,首先需要近似地定義這些殘差。
  • 線上直播 | 偏最小二乘法是個什麼鬼?
    偏最小二乘法剛看到這個名稱學長也是...
  • 基於A/D轉換最小二乘法的數據採集應用
    基於此,本文給出了基於A/D 轉換器TLC2543 的軟硬體 設計,並結合最小二乘法將輸出數據進行修正,達到了環保部分對有機汙染物監測數據精度 的要求。http://www.eepw.com.cn/article/188361.htm  1 系統硬體設計介紹  如圖1所示,是系統電路圖, A/D轉換器採用TLC2543,它是12位串行模數轉換器,使用 開關電容逐次逼近技術完成A/D轉換過程,由於是串行輸入結構,能夠節省51系列單片機I/O 資源;且價格適中,解析度較高,因此在儀器儀表中有較為廣泛的應用