關於線性模型你可能還不知道的二三事(二、也談民主)

来源:http://www.cnblogs.com/jasonfreak/archive/2016/06/16/5554407.html
-Advertisement-
Play Games

目錄 1 如何更新權值向量?2 最小均方法(LMS)與感知機:低效的民主3 最小二乘法:完美的民主4 支持向量機:現實的民主5 總結6 參考資料 1 如何更新權值向量? 在關於線性模型你可能還不知道的二三事(一、樣本)中我已提到如何由線性模型產生樣本,在此前提下,使用不同機器學習演算法來解決回歸問題的 ...


目錄

1 如何更新權值向量?
2 最小均方法(LMS)與感知機:低效的民主
3 最小二乘法:完美的民主
4 支持向量機:現實的民主
5 總結
6 參考資料


1 如何更新權值向量?

  在關於線性模型你可能還不知道的二三事(一、樣本)中我已提到如何由線性模型產生樣本,在此前提下,使用不同機器學習演算法來解決回歸問題的本質都是求解該線性模型的權值向量W。同時,我們常使用線性的方式來解決分類問題:求解分隔不同類別個體的超平面的法向量W。不論回歸還是分類,都是求解向量W,而求解的核心思想也英雄所見略同:向量W傾向於指向某些“重要”的個體。然而哪些個體是重要的呢?不同的機器學習演算法有不同的定義。

2 最小均方法(LMS)與感知機:低效的民主

  最小均方法(LMS)使用的隨機梯度下降法與感知機的訓練法則類似,兩者都是迭代更新的方式。假設本次迭代中的權值為W,那麼更新後的權值W'為(eta為更新率):

  隨機梯度下降法:

  感知機:

  通過觀察可知,權值更新是一個迭代的過程,不論是回歸(最小均方法)還是分類(感知機),權值更新時視當前輪次中誤差大的個體為“重要”的個體。這種權值更新辦法比較直觀,但是同時也比較低效:人人都有發言的權利,每次只考慮部分人,容易顧此失彼。

3 最小二乘法:完美的民主

  二乘即是平方,最小二乘法旨在於求解權值向量W使得誤差平方和最小:

  通過對權值向量的每個分量進行求導可得:

  至此,我們可以發現最小二乘法可解的條件為特征矩陣X是可逆的。假設特征矩陣X的樣本容量n=m,那麼上式進一步化簡得:

  使用求解出來的權值向量W'對未知個體x'進行預測,本質就是計算:

  在《關於線性模型你可能還不知道的二三事(一、樣本)》中我們已經揭開了特征矩陣X的逆矩陣的意義,因此以上的計算過程可以概括為:首先使用X的逆矩陣乘以未知個體x',得到可以準確描述未知個體x'與特征矩陣X中已知個體相似度的列向量,然後以此為基礎,使用加權求和的方法來計算未知個體x'的目標值。

  到此,最小二乘法所詮釋的完美民主已顯見:在每個人都不能由其他人代表的前提下,看未知的個體與誰更相似,那麼目標值也與之更相似。

  沒錯,之前我們假設了特征矩陣X的樣本容量n=m,但是大多數情況下n是大於m的。這種情況下權值向量計算公式無法進一步化簡。同樣在《關於線性模型你可能還不知道的二三事(一、樣本)》中我們提到,可以轉化原問題為:

  這時,我們可以設新的特征矩陣X'和新的目標值向量Y'為:

  到此,新的特征矩陣X'是m×m的方陣,可以求其逆矩陣了(當然,這還是在原特征矩陣的秩等於m的前提下)。因此有:

  不難看到,上式同樣也是詮釋了完美的民主,只是特征矩陣X變成了X',目標值向量Y變成了Y'而已。

4 支持向量機:現實的民主

  完美的民主可遇而不可求,如果特征矩陣X的秩小於m呢?此時最小二乘法便不奏效了。我們期望無論特征矩陣X的秩是否小於m,仍然可以高效地求解權值向量W。

  我們可以利用支持向量機解決該問題。不妨直接看到權值向量的最終結果(具體推導可參考《支持向量機通俗導論(理解SVM的三層境界)》

  使用上式計算出來的權值向量W對未知個體x'進行預測的原理是顯見的:首先將未知個體與特征矩陣X中的個體相乘得到對應的相似度,然後以此相似度乘以alpha的分量,最後在此基礎上以加權求和的方法來計算未知個體x'的目標值。然而,alpha到底是什麼呢?

  對支持向量機有一定瞭解的同學肯定會有一個基本的認識:支持向量為間隔邊界上的點,相對應的alpha的分量為0。也就是說,最終的權值只會考慮作為支持向量的樣本!然而,進一步,很少有人會去思考:間隔邊界上的點都是支持向量嗎?支持向量所對應的alpha的分量值大小服從什麼規律嗎?支持向量為什麼叫支持向量呢?

  我們通過一個簡單的例子來進一步解答以上的問題,首先生成特征矩陣X和目標向量y:

 1 import numpy as np
 2 from sklearn.svm import SVC
 3 from matplotlib import pyplot as plt 
 4 
 5 X1_positive_border = np.random.uniform(-10, 10, size=10)
 6 X2_positive_border = X1_positive_border + 1
 7 X_positive_border = np.hstack((X1_positive_border.reshape(-1,1), X2_positive_border.reshape(-1,1)))
 8 
 9 X1_positive = np.random.uniform(-10, 10, size=10)
10 X2_positive = X1_positive + np.random.uniform(2, 10, size=10)
11 X_positive = np.hstack((X1_positive.reshape(-1,1), X2_positive.reshape(-1,1)))
12 
13 X1_negative_border = np.random.uniform(-10, 10, size=10)
14 X2_negative_border = X1_negative_border - 1
15 X_negative_border = np.hstack((X1_negative_border.reshape(-1,1), X2_negative_border.reshape(-1,1)))
16 
17 X1_negative = np.random.uniform(-10, 10, size=10)
18 X2_negative = X1_negative + np.random.uniform(-10, -2, size=10)
19 X_negative = np.hstack((X1_negative.reshape(-1,1), X2_negative.reshape(-1,1)))
20 
21 X = np.vstack((X_positive_border, X_positive, X_negative_border, X_negative))
22 y = np.hstack((np.ones(20), -np.ones(20)))

  使用線性核的SVC進行訓練:

1 model = SVC(C=0.1, kernel='linear')
2 model.fit(X, y)

  對訓練的結果繪圖:

 1 #繪製邊界正例
 2 plt.plot(X_positive_border[:,0], X_positive_border[:,1], 'g.', markersize=12, label='Positive X At Border')
 3 #繪製正例
 4 plt.plot(X_positive[:,0], X_positive[:,1], 'g^', markersize=12, label='Positive X')
 5 #繪製邊界反例
 6 plt.plot(X_negative_border[:,0], X_negative_border[:,1], 'r.', markersize=12, label='Negative X At Border')
 7 #繪製反例
 8 plt.plot(X_negative[:,0], X_negative[:,1], 'rv', markersize=12, label='Negative X')
 9 #繪製正邊界
10 plt.plot(np.arange(-10, 11), np.arange(-10, 11) + 1, 'c--')
11 #繪製超平面
12 plt.plot(np.arange(-10, 11), np.arange(-10, 11), 'k-')
13 #繪製負邊界
14 plt.plot(np.arange(-10, 11), np.arange(-10, 11) - 1, 'm--')
15 #繪製座標軸
16 plt.plot(np.arange(-10, 11), np.zeros(21), 'k-')
17 plt.plot(np.zeros(41), np.arange(-20, 21), 'k-')
18 #給每個支持向量進行標註
19 for i in range(len(model.support_vectors_)):
20     x = model.support_vectors_[i]
21     a = model.dual_coef_[0][i] * y[model.support_[i]]
22     plt.annotate('a[%d]=%.2f' % (i, a), xy=(x[0], x[1]), xytext=(x[0]-1, x[1]+1), arrowprops=dict(arrowstyle="->",connectionstyle="arc3"))23 
24 plt.legend(loc='best', shadow=True)
25 plt.show()

  顯示結果如下:

   我們可以看到,當參數C=0.1時,邊界上幾乎所有的點都是支持向量。再設C=1.0時,顯示結果如下:

  此時,只有少數邊界上幾個點是支持向量了。參數C的變化為什麼會影響支持向量的個數呢?官方文檔中對參數C的說明是懲罰繫數,不同於對權值向量的懲罰,這裡的懲罰是針對於alpha的。C越大,懲罰就越大,那麼alpha的非零項就越少。當邊界上只有少數點為支持向量時,通常來說,邊界上靠近兩端的點更適合作為支持向量,例如上圖中的a[0]至a[3]。如何解釋呢?

  先看負邊界上靠近兩端的點,當它們與目標向量y的分量(值為-1,反向)相乘後,相當於正邊界上的點。正邊界上,對靠近兩端的點進行向量求和,這樣便可方便得到超平面的法向量,即權值向量。通俗一點說,靠近兩端的點都是一些特色的點(不能被其他點代表),其他點可以由這些有特色的點的線性表示。或者更通俗一點來說,靠近兩端的點可以看成是各行各業的先進人士,由於職業不同,他們都不能被彼此代表,但是他們可以代表自己的行業的其他人,他們的組合甚至可以代表一些跨行業的人!

  此時,我們可以引出結論:支持向量機代表的是一種現實的民主,我國的人民代表大會制也是如此。

  最後,我們還需要回答一個顯見問題,支持向量的名稱由來:一組能夠”撐起“分隔邊界的向量。

5 總結

  這次,我們探討了3種常見的線性模型權值向量求解思路。從LMS和隨機梯度下降到最小二乘,再到支持向量機,人們求解自然科學問題的思路與求解社會科學問題的思路走到了一起。最近的一件小事帶給我啟發:居住的小區需要對某一些問題進行決策,一開始由熱心居民每家每戶聽取意見,結果遲遲拿不定主意,越聽越糊塗。到最後,只好選出業主委員會,由業主委員會代表各個特色群體,問題才得以解決。

  之前對線性模型的權值求解過程和結果都“記得”非常熟悉,但是其真正意義(特別是最小二乘)沒有去深究。而這次能夠受到啟發,並且聯繫到現實生活中,也算是對線性模型有了更進一步的認識吧。

6 參考資料

  1. 關於線性模型你可能還不知道的二三事(一、樣本)
  2. 支持向量機通俗導論(理解SVM的三層境界)
  3. sklearn svc model

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • FileAccess Enumeration 定義用於文件讀取、寫入訪問許可權的常數。此枚舉有一個FlagsAttribute特性,通過該特性可使其成員值按位組合。(命名空間:System.IO) 語法 [SerializableAttribute] [FlagsAttribute] [ComVisi... ...
  • 今天遇到了一個關於日期的問題,需要將2016-6-15 20:23:23這種形式的時間字元串轉換為2016年6月15日,由於學習經驗少,但是懵逼了0.0, 後來百度找到了相關方法。同時,也將常用的日期轉換方法的用法保存下來。供大家學習查閱。 我的代碼: 運行結果: ...
  • Private Sub textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress If e.KeyChar ...
  • 1、設置父窗體: 如果要將某個窗體設置為父窗體,只需將該窗體的IsMdiContainer屬性設置為True即可。 2、設置子窗體: 通過設為某個窗體的MdiParent屬性來確定該窗體是那個窗體的子窗體。 語法如下: 3、排列MDI子窗體: 語法如下: value:是MdiLayout的枚舉值之一 ...
  • 問題:如下代碼 想獲取某兩個Decimal類型數之間的商的大小,結果偶爾出錯(請註意是 偶爾) Decima t1; Decima t2; int shang =Convert.ToInt32(t1 / t2) ; 解決方法:將Decimal類型數據強制轉換成INT整型時 會有四捨五入的過程。如下, ...
  • 本文參考Roslyn項目Issue:#206,及Docs:#patterns。 1. C# 7.0 新特性1: 基於Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 模式匹配也許能算的上C#本次更新最重量級的升級,也是最受關註的特性(也 ...
  • 參考鏈接:C 標準庫 - <string.h> string.h中主要有兩類函數: memxxx 和 strxxx,其中memxxx是針對記憶體操作的函數,在遇到'\0'的時候並不會停下來,而通常是設置一個size_t類型(其實是unsigned int)的參數來表示位元組大小; 而strxxx是針對字 ...
  • 安裝篇 第一步:配置防火牆(預設情況下,埠80和3306是拒絕訪問的,在防火牆上進行配置): vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下兩句) -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...