當前位置:首頁 » 操作系統 » 對偶的演算法

對偶的演算法

發布時間: 2023-06-08 07:52:54

⑴ 支持向量機原理講解(一)

支持向量機(Support Vector Machine,以下簡稱SVM),作為傳統機器學習的一個非常重要的分類演算法,它是一種通用的前饋網路類型,最早是由Vladimir N.Vapnik 和 Alexey Ya.Chervonenkis在1963年提出,目前的版本(soft margin)是Corinna Cortes 和 Vapnik在1993年提出,1995年發表。深度學習(2012)出現之前,如果不考慮集成學習的演算法,不考慮特定的訓練數據集,在分類演算法中的表現SVM說是排第一估計是沒有什麼異議的。

SVM本來是一種線性分類和非線性分類都支持的二元分類演算法,但經過演變,現在也支持多分類問題,也能應用到了回歸問題。本篇文章重點講解線性支持向量機的模型原理和目標函數優化原理。

在講解SVM模型之前,我們可以先簡單了解感知機模型的原理,因為這兩個模型有一些相同的地方。在二維平面中,感知機模型是去找到一條直線,盡可能地將兩個不同類別的樣本點分開。同理,在三維甚至更高維空間中,就是要去找到一個超平面。定義這個超平面為wTx+b=0(在二維平面中,就相當於直線w_1 x+w_1 y+b=0),而在超平面上方的點,定義為y=1,在超平面下方的點,定義為y=-1。而這樣的超平面可能是不唯一的,那麼感知機是怎麼定期最優超平面呢?從感知機模型的目標函數中,我們了解到它是希望讓所有誤分類的點(定義為M)到超平面的距離和最小。其目標函數如下:

(註:加入 是因為點若在超平面下, 為負數,需要乘上對應的 )

當w和b成比例增加了之後,比如都擴大N倍,會發現,分子和分母都會同時擴大N倍,這對目標函數並不影響。因此,當我們將W擴大或縮小一定倍數使得,||w||=1,分子也會相應的擴大或縮小,這樣,目標函數就能簡化成以下形式:

這個思想將會應用到支持向量機的目標函數優化上,後文將會詳細講解。

正如上文所說,線性支持向量機的思想跟感知機的思想很相似。其思想也是對給定的訓練樣本,找到一個超平面去盡可能的分隔更多正反例。不同的是其選擇最優的超平面是基於正反例離這個超平面盡可能遠。

從上圖可以發現,其實只要我們能保證距離超平面最近的那些點離超平面盡可能遠,就能保證所有的正反例離這個超平面盡可能的遠。因此,我們定義這些距離超平面最近的點為支持向量(如上圖中虛線所穿過的點)。並且定義正負支持向量的距離為Margin。

對SVM思想有一定理解之後,設超平面為 。我們講解一下函數間隔和幾何間隔的區別。

給定一個樣本 , 表示點x到超平面的距離。通過觀察 和 是否同號,我們判斷分類是否正確。所以函數間隔定義 為:

而函數間隔不能正常反應點到超平面的距離,因為當我們等比例擴大 和 的時候,函數間隔也會擴大相應的倍數。因此,我們引入幾何間隔。

幾何間隔就是在函數間隔的基礎下,在分母上對 加上約束(這個約束有點像歸一化),定義為 :


其實參考點到直線的距離,我們可以發現幾何間隔就是高維空間中點到超平面的距離,才能真正反映點到超平面的距離。

根據SVM的思想,我們可以知道是要取最大化支持向量到超平面的幾何間隔,所以目標函數可以表示為:

在感知機模型最後,我們知道當同時擴大w和b,分子分母都會同樣擴大,對目標函數不影響,所以在這里我們將分子(支持向量到超平面的函數間隔)擴大或壓縮等於1,則目標函數可以轉化為:

但是上式並不是凸函數,不好求解,再進一步轉化為:

上式就是一個凸函數,並且不等式約束為仿射函數,因此可以使用拉格朗日對偶去求解該問題。

根據拉格朗日乘子法,引入拉格朗日乘子α,且α≥0我們可以知道,先不考慮min,(2)問題等價於:

然後再考慮min,則有:

應用拉格朗日對偶性,通過求解對偶問題得到最優解,則對偶問題的目標函數為:

這就是線性可分條件下支持向量機的對偶演算法。這樣做的優點在於:一是原問題的對偶問題往往更容易求解,二者可以自然的引入核函數,進而推廣到非線性分類問題。

從(4)中,我們可以先求目標函數對於 和 的極小值,再求拉格朗日乘子 的極大值。

首先,分別對 和 分別求偏導數,並令為0:


得:

將(5)和(6)代入(4)得到:

對(7)取反得到:

只要我們可以求出(8)中極小化的 向量,那麼我們就可以對應的得到 和 ,而求解 需要使用SMO演算法,由於該演算法比較復雜,我們將在下一篇文章專門講解。假設我們現在已經使用SMO演算法得到了最優的 值,記為

再求 :

對於任一樣本 有:

注意到任一樣本都有 ,則將右式的1用 代:

將(9)代入上式,可以得到:

這樣,我們就能夠求解得到線性支持向量機的目標函數的各個參數,進而得到最優的超平面,將正負樣本分隔開。但是在上文中我們沒有講解求 向量的SMO演算法,在下篇文章,將會詳細講解SMO演算法,歡迎繼續關注。

⑵ 支持向量機(SVM)基本原理

看了很多關於SVM的博客,但是常常只能保存書簽之後看,有時候有的博客就突然沒了,這里就作為搬運工總結一下之後自己看吧。主要內容來自於:
支持向量機通俗導論(理解SVM的三層境界)

線性回歸
給定數據集 , 其中, ,線性回歸試圖學習到一個線性模型,盡可能地輸出正確標記.

如果我們要用線性回歸演算法來解決一個分類問題,(對於分類,y 取值為 0 或者 1),但如果你使用的是線性回歸,那麼假設函數的輸出值可能遠大於 1,或者遠小於 0,就算所有訓練樣本的標簽 y 都是 0 或 1但是如果演算法得到的值遠大於 1 或者遠小於 0 的話,就會感覺很奇怪。所以我們在接下來的要研究的演算法就叫做邏輯回歸演算法,這個演算法的性質是:它的輸出值永遠在 0 到 1 之間。

所以邏輯回歸就是一個分類演算法,這個演算法的輸出值永遠在 0 到 1 之間.
我們先看二分類的LR,具體做法是:利用sigmoid 函數,將每一個點的回歸值映射到0,1之間.sigmoid函數特性如下:

如圖所示,令 , 當 z > 0 , z 越大, sigmoid 返回值越接近1(但永遠不會超過1). 反之,當z < 0時,z 越小, sigmoid 返回值越接近0(但永遠不會小於0).

支持向量機 ,因其英文名為support vector machine,故一般簡稱SVM,通俗來講,它是一種二類分類模型,其基本模型定義為 特徵空間 上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。

線性分類器
給定一些數據點,它們分別屬於兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。如果用x表示數據點,用y表示類別(y可以取1或者-1,分別代表兩個不同的類),一個線性分類器的學習目標便是要在n維的數據空間中找到一個超平面(hyper plane),這個超平面的方程可以表示為( wT中的T代表轉置):

logistic回歸目的是從特徵學習出一個0/1分類模型,而這個模型是將特性的線性組合作為自變數,由於自變數的取值范圍是負無窮到正無窮。因此,使用logistic函數(或稱作sigmoid函數)將自變數映射到(0,1)上,映射後的值被認為是屬於y=1的概率。
假設函數:

其中x是n維特徵向量,函數g就是logistic函數。

圖像為:

在超平面w x+b=0確定的情況下,|w x+b|能夠表示點x到距離超平面的遠近,而通過觀察w x+b的符號與類標記y的符號是否一致可判斷分類是否正確,所以,可以用(y (w*x+b))的正負性來判定或表示分類的正確性。於此,我們便引出了函數間隔(functional margin)的概念。
定義函數間隔 (用表示)為

而超平面(w,b)關於T中所有樣本點(xi,yi)的函數間隔最小值(其中,x是特徵,y是結果標簽,i表示第i個樣本),便為超平面(w, b)關於訓練數據集T的函數間隔:

但這樣定義的函數間隔有問題,即如果成比例的改變w和b(如將它們改成2w和2b),則函數間隔的值f(x)卻變成了原來的2倍(雖然此時超平面沒有改變),所以只有函數間隔還遠遠不夠。

事實上,我們可以對法向量w加些約束條件,從而引出真正定義點到超平面的距離--幾何間隔(geometrical margin)的概念。

假定對於一個點 x ,令其垂直投影到超平面上的對應點為 x0 ,w 是垂直於超平面的一個向量, 為樣本x到超平面的距離,如下圖所示:

根據平面幾何知識,有

其中||w||為w的二階范數(范數是一個類似於模的表示長度的概念), 是單位向量(一個向量除以它的模稱之為單位向量)。

又由於x0 是超平面上的點,滿足 f(x0)=0,代入超平面的方程 ,可得 ,即

隨即讓此式 的兩邊同時乘以 ,再根據 和 ,即可算出 :

為了得到 的絕對值,令 乘上對應的類別 y,即可得出幾何間隔(用 表示)的定義:

從上述函數間隔和幾何間隔的定義可以看出:幾何間隔就是函數間隔除以||w||,而且函數間隔y (wx+b) = y f(x)實際上就是|f(x)|,只是人為定義的一個間隔度量,而幾何間隔|f(x)|/||w||才是直觀上的點到超平面的距離。

對一個數據點進行分類,當超平面離數據點的「間隔」越大,分類的確信度(confidence)也越大。所以,為了使得分類的確信度盡量高,需要讓所選擇的超平面能夠最大化這個「間隔」值。這個間隔就是下圖中的Gap的一半。

通過由前面的分析可知:函數間隔不適合用來最大化間隔值,因為在超平面固定以後,可以等比例地縮放w的長度和b的值,這樣可以使得 的值任意大,亦即函數間隔 可以在超平面保持不變的情況下被取得任意大。但幾何間隔因為除上了 ,使得在縮放w和b的時候幾何間隔的值 是不會改變的,它只隨著超平面的變動而變動,因此,這是更加合適的一個間隔。換言之,這里要找的最大間隔分類超平面中的「間隔」指的是幾何間隔。

於是最大間隔分類器(maximum margin classifier)的目標函數可以定義為

同時需滿足一些條件,根據間隔的定義,有

回顧下幾何間隔的定義 ,可知:如果令函數間隔 等於1(之所以令等於1,是為了方便推導和優化,且這樣做對目標函數的優化沒有影響),則有 = 1 / ||w||且 ,從而上述目標函數轉化成了:

相當於在相應的約束條件 下,最大化這個1/||w||值,而1/||w||便是幾何間隔。

據了解,

由於這個問題的特殊結構,還可以通過拉格朗日對偶性(Lagrange Duality)變換到對偶變數 (al variable) 的優化問題,即通過求解與原問題等價的對偶問題(al problem)得到原始問題的最優解,這就是線性可分條件下支持向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題。

那什麼是拉格朗日對偶性呢?簡單來講,通過給每一個約束條件加上一個拉格朗日乘子 ,(Lagrange multiplier),定義拉格朗日函數(通過拉格朗日函數將約束條件融合到目標函數里去,從而只用一個函數表達式便能清楚的表達出我們的問題)

然後令:

容易驗證,當某個約束條件不滿足時,例如 ,那麼顯然有 (只要令 即可)。而當所有約束條件都滿足時,則最優值為 ,亦即最初要最小化的量。

因此,在要求約束條件得到滿足的情況下最小化 ,實際上等價於直接最小化 (當然,這里也有約束條件,就是 ≥0,i=1,…,n) ,因為如果約束條件沒有得到滿足, 會等於無窮大,自然不會是我們所要求的最小值。

具體寫出來,目標函數變成了:

這里用 表示這個問題的最優值,且和最初的問題是等價的。如果直接求解,那麼一上來便得面對w和b兩個參數,而 又是不等式約束,這個求解過程不好做。不妨把最小和最大的位置交換一下,變成:

交換以後的新問題是原始問題的對偶問題,這個新問題的最優值用 來表示。而且有 ≤ ,在滿足某些條件的情況下,這兩者相等,這個時候就可以通過求解對偶問題來間接地求解原始問題。

換言之,之所以從minmax 的原始問題,轉化為maxmin 的對偶問題,一者因為 是 的近似解,二者,轉化為對偶問題後,更容易求解。

下面可以先求L 對w、b的極小,再求L對 的極大。

KKT條件
≤ 在滿足某些條件的情況下,兩者等價,這所謂的「滿足某些條件」就是要滿足KKT條件。

要讓兩者等價需滿足strong ality (強對偶),而後有學者在強對偶下提出了KKT條件,且KKT條件的成立要滿足constraint qualifications,而constraint qualifications之一就是Slater條件。所謂Slater 條件,即指:凸優化問題,如果存在一個點x,使得所有等式約束都成立,並且所有不等式約束都嚴格成立(即取嚴格不等號,而非等號),則滿足Slater 條件。對於此處,Slater 條件成立,所以 ≤ 可以取等號。

一般地,一個最優化數學模型能夠表示成下列標准形式:

其中,f(x)是需要最小化的函數,h(x)是等式約束,g(x)是不等式約束,p和q分別為等式約束和不等式約束的數量。
KKT條件的意義:它是一個非線性規劃(Nonlinear Programming)問題能有最優化解法的必要和充分條件。

而KKT條件就是指上面最優化數學模型的標准形式中的最小點 x* 必須滿足下面的條件:

我們這里的問題是滿足 KKT 條件的(首先已經滿足Slater條件,再者f和gi也都是可微的,即L對w和b都可導),因此現在我們便轉化為求解第二個問題。

也就是說,原始問題通過滿足KKT條件,已經轉化成了對偶問題。而求解這個對偶學習問題,分為3個步驟:首先要讓L(w,b,a) 關於 w 和 b 最小化,然後求對 的極大,最後利用SMO演算法求解對偶問題中的拉格朗日乘子。

對偶問題求解的3個步驟

將以上結果代入之前的L:

得到:

具體推導過程是比較復雜的,如下所示:

最後,得到:

「倒數第4步」推導到「倒數第3步」使用了線性代數的轉置運算,由於ai和yi都是實數,因此轉置後與自身一樣。「倒數第3步」推導到「倒數第2步」使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法運演算法則。最後一步是上一步的順序調整。

從上面的最後一個式子,我們可以看出,此時的拉格朗日函數只包含了一個變數,那就是 (求出了 便能求出w,和b,由此可見,則核心問題:分類函數 也就可以輕而易舉的求出來了)。

上述式子要解決的是在參數上 求最大值W的問題,至於 和 都是已知數。要了解這個SMO演算法是如何推導的,請跳到下文第3.5節、SMO演算法。

總結
讓我們再來看看上述推導過程中得到的一些有趣的形式。首先就是關於我們的 hyper plane ,對於一個數據點 x 進行分類,實際上是通過把 x 帶入到 算出結果然後根據其正負號來進行類別劃分的。而前面的推導中我們得到:

因此分類函數為:

這里的形式的有趣之處在於,對於新點 x的預測,只需要計算它與訓練數據點的內積即可(表示向量內積),這一點至關重要,是之後使用 Kernel 進行非線性推廣的基本前提。此外,所謂 Supporting Vector 也在這里顯示出來——事實上,所有非Supporting Vector 所對應的系數 都是等於零的,因此對於新點的內積計算實際上只要針對少量的「支持向量」而不是所有的訓練數據即可。

為什麼非支持向量對應的 等於零呢?直觀上來理解的話,就是這些「後方」的點——正如我們之前分析過的一樣,對超平面是沒有影響的,由於分類完全有超平面決定,所以這些無關的點並不會參與分類問題的計算,因而也就不會產生任何影響了。

回憶一下我們通過 Lagrange multiplier得到的目標函數:

注意到如果 xi 是支持向量的話,上式中紅顏色的部分是等於 0 的(因為支持向量的 functional margin 等於 1 ),而對於非支持向量來說,functional margin 會大於 1 ,因此紅顏色部分是大於零的,而 又是非負的,為了滿足最大化, 必須等於 0 。這也就是這些非Supporting Vector 的點的局限性。

至此,我們便得到了一個maximum margin hyper plane classifier,這就是所謂的支持向量機(Support Vector Machine)。當然,到目前為止,我們的 SVM 還比較弱,只能處理線性的情況,不過,在得到了對偶al 形式之後,通過 Kernel 推廣到非線性的情況就變成了一件非常容易的事情了(通過求解對偶問題得到最優解,這就是線性可分條件下支持向量機的對偶演算法,這樣做的優點在於:一者對偶問題往往更容易求解;二者可以自然的引入核函數,進而推廣到非線性分類問題」)。

事實上,大部分時候數據並不是線性可分的,這個時候滿足這樣條件的超平面就根本不存在。在上文中,我們已經了解到了SVM處理線性可分的情況,那對於非線性的數據SVM咋處理呢?對於非線性的情況,SVM 的處理方法是選擇一個核函數 κ(⋅,⋅) ,通過將數據映射到高維空間,來解決在原始空間中線性不可分的問題。

具體來說,在線性不可分的情況下,支持向量機首先在低維空間中完成計算,然後通過核函數將輸入空間映射到高維特徵空間,最終在高維特徵空間中構造出最優分離超平面,從而把平面上本身不好分的非線性數據分開。如圖所示,一堆數據在二維空間無法劃分,從而映射到三維空間里劃分:

而在我們遇到核函數之前,如果用原始的方法,那麼在用線性學習器學習一個非線性關系,需要選擇一個非線性特徵集,並且將數據寫成新的表達形式,這等價於應用一個固定的非線性映射,將數據映射到特徵空間,在特徵空間中使用線性學習器,因此,考慮的假設集是這種類型的函數:

這里ϕ:X->F是從輸入空間到某個特徵空間的映射,這意味著建立非線性學習器分為兩步:

首先使用一個非線性映射將數據變換到一個特徵空間F,
然後在特徵空間使用線性學習器分類。

而由於對偶形式就是線性學習器的一個重要性質,這意味著假設可以表達為訓練點的線性組合,因此決策規則可以用測試點和訓練點的內積來表示:

如果有一種方式可以在特徵空間中直接計算內積〈φ(xi · φ(x)〉,就像在原始輸入點的函數中一樣,就有可能將兩個步驟融合到一起建立一個非線性的學習器,這樣直接計演算法的方法稱為核函數方法:
核是一個函數K,對所有x,z,滿足 ,這里φ是從X到內積特徵空間F的映射。

來看個核函數的例子。如下圖所示的兩類數據,分別分布為兩個圓圈的形狀,這樣的數據本身就是線性不可分的,此時咱們該如何把這兩類數據分開呢(下文將會有一個相應的三維空間圖)?

事實上,上圖所述的這個數據集,是用兩個半徑不同的圓圈加上了少量的噪音生成得到的,所以,一個理想的分界應該是一個「圓圈」而不是一條線(超平面)。如果用 和 來表示這個二維平面的兩個坐標的話,我們知道一條二次曲線(圓圈是二次曲線的一種特殊情況)的方程可以寫作這樣的形式:

注意上面的形式,如果我們構造另外一個五維的空間,其中五個坐標的值分別為 ,那麼顯然,上面的方程在新的坐標系下可以寫作:

關於新的坐標 ,這正是一個 hyper plane 的方程!也就是說,如果我們做一個映射 ,將 按照上面的規則映射為 ,那麼在新的空間中原來的數據將變成線性可分的,從而使用之前我們推導的線性分類演算法就可以進行處理了。這正是 Kernel 方法處理非線性問題的基本思想。

再進一步描述 Kernel 的細節之前,不妨再來看看上述例子在映射過後的直觀形態。當然,你我可能無法把 5 維空間畫出來,不過由於我這里生成數據的時候用了特殊的情形,所以這里的超平面實際的方程是這個樣子的(圓心在 軸上的一個正圓)

因此我只需要把它映射到 ,這樣一個三維空間中即可,下圖即是映射之後的結果,將坐標軸經過適當的旋轉,就可以很明顯地看出,數據是可以通過一個平面來分開的

核函數相當於把原來的分類函數:

映射成:

而其中的 可以通過求解如下 al 問題而得到的:

這樣一來問題就解決了嗎?似乎是的:拿到非線性數據,就找一個映射

⑶ 求解原始問題和對偶問題常用的優化演算法有哪些

1. 支持向量機的目的是什麼?
對於用於分類的支持向量機來說,給定一個包含正例和反例(正樣本點和負樣本點)的樣本集合,支持向量機的目的是尋找一個超平面來對樣本進行分割,把樣本中的正例和反例用超平面分開,但是不是簡單地分看,其原則是使正例和反例之間的間隔最大。
超平面是什麼呢?簡單地說,超平面就是平面中的直線在高維空間中的推廣。那麼,對於三維空間,超平面就是平面了。對於更高維的空間,我們只能用公式來表達,而缺少直觀的圖形了。總之,在n維空間中的超平面是n-1維的。
超平面的公式為。公式中的w為可以調整的系數向量,b為bias。注意我們的表達習慣,所有的向量都是列向量,所以在第一項的內積中向量w需要進行轉置。
現在考慮樣本集合{xi,di},xi是輸入的特徵,di是樣本對應的分類。現在規定當樣本xi屬於第一類時,di為1,當xi屬於第二類時,di為-1。
那麼,線性可分的意思就是一個超平面可以把兩類樣本完全地分割開來。用公式表達就是:

你現在可能會問,那麼如果不是線性可分的情況應該怎麼辦呢?事實是這些會在後面處理到。在這里我們首先討論線性可分的情況,然後將其拓展到線性不可分的情況.
現在假設對於線性可分的樣本集,我們有了一個分割超平面,現在我們想通過調整w0和b0讓它分割的正樣本和負樣本保持最大的間隔,這樣我們就獲得了最優的超平面。實際上在操作過程中,我們最大化的是離超平面最近的點到超平面的距離。也就是說,我們要讓超平面盡量遠離最近的點。從圖中可見超平面到正樣本最近點的距離和超平面到負樣本最近點的距離是相等的。這是個巧合么?
假設我們已經找到了一個超平面,它離正樣本最近點的距離大於離負樣本最近點的距離,那麼這個離超平面最近的點就是負樣本中的最近點。而考慮到我們的目標,我們還會調整超平面的位置使它還可以增大一些,即使這樣會犧牲離正樣本最近點的距離。所以調整到最後的結果肯定是超平面離兩側最近點的距離是等距的。

為了更形象地表現正負樣本的間隔,我們可以在分割超平面的兩側再定義兩個超平面H1和H2(如圖中虛線所示),這兩個超平面分別通過正樣本和負樣本中離分割超平面最近的樣本點(圖中加了外圈)。從以上分析可以知道,超平面H1和H2離分割超平面是等距的。
我們定義超平面H1和H2上面的點叫做支持向量。正負樣本的間隔可以定義為超平面H1和H2之間的間隔,它是分割超平面距最近正樣本點距離和最近負樣本點距離之和。
從圖中可以看出,支持向量對於分割超平面的位置是起到關鍵作用的。在優化分割超平面位置之後,支持向量也顯露出來,而支持向量之後的樣本點則對分類並不關鍵。為什麼這樣說呢?因為即使把支持向量以外的樣本點全部刪除,再找到最優的分割超平面,這個超平面的位置跟原先的分割超平面的位置也是一樣的。總結起來就是:
支持向量包含著重構分割超平面所需要的全部信息!
2. 樣本點到超平面距離的表示
如何求一點到超平面的距離呢?
現在我們來看看系數向量w0是什麼含義?回憶一下,w0實際上是超平面的法向量!
那麼,對於任意一個樣本點x,它可以表示為:

其中xp是x在超平面上的投影,r是x到超平面的幾何距離(幾何間隔)。
設 ,
現在由定義有g(xp)為0,則有。
現在我們開看,g(x)實際上度量了樣本點x到超平面的距離,在||w0||恆定的情況下,g(x)絕對值的大小反映了幾何間隔r的大小。我們給g(x)起個名字叫做函數間隔。注意幾何間隔r和函數間隔g(x)都是有正負號的,代表著處於超平面的不同側。

3. 最大化間隔
我們已經知道了函數間隔和幾何間隔的表示,現在回到正題,我們需要最大化支持向量到分割超平面的距離,當然在最開始我們不知道哪些向量是支持向量。
我們的目的是最大化支持向量到分割超平面的幾何間隔r,而不是最大化函數間隔g(x),為什麼呢?因為超平面方程的系數可以同比例增大或者減小,而不改變超平面本身。所以||w0||是不固定的,這就會影響函數間隔g(x)的大小。
所以我們需要最大化的是幾何間隔r,這等價於我們固定||w0||,然後最大化函數間隔g(x)。但是實際上我們不會這么做,通常的處理方法是固定函數間隔g(x)的絕對值為1,然後最小化||w0||。也就是說我們把支持向量到分割超平面的函數間隔g(x)的絕對值設定為1,然後最小化||w0||。

4. 正式的表述
現在我們可以正式地表述這個問題了。我們需要最小化||w0||,也就是最小化超平面權重向量w0的歐幾里得范數。但是有沒有限定條件呢?還記得上一節最後一句話么?
「也就是說我們把支持向量到分割超平面的函數間隔g(x)設定為1,然後最小化||w0||」
所以最小化||w0||是有限定條件的,如何表述限制條件呢?我們把支持向量對應的g(x)定為+1或者-1(取決於支持向量處於分割超平面的哪一側,也就是說是正樣本還是負樣本),也就表明了對於所有的正樣本點來說,g(x)是>=+1的,而對於負樣本來說,g(x)是<=-1的。
回想g(x)的定義:

我們可以把限制條件寫下來:

現在我們可以把上面的問題寫的更簡練:
目標函數:

限制:

1/2是為了以後計算方便所加的,N是樣本點的個數。
現在我們的第一個任務結束了,我們把要尋找最優的分割超平面的問題轉化為帶有一系列不等式約束的優化問題。這個最優化問題被稱作原問題。我們不會直接解它,而是把它轉化為對偶問題進行解決。至於如何將其轉化為對偶問題,這是以後幾節的內容。
等式約束極小的最優性條件
對支持向量機的求解都是將上節說的原問題轉化為對偶問題進行求解的,這些內容都是最優化課程中的內容。
回憶上節的內容,我們的目標是尋找函數在若干約束條件下的最小值。在上節的原問題中,約束條件是包含不等式的,本節先考慮簡單的問題,即考慮只包含等式約束的最優化問題:
(1)
其中f(x)被稱作目標函數,而下面是一系列的等式約束。回想一下,當沒有任何約束存在的時候,應該怎樣尋找最優點呢?事實上x*是最優點的必要條件是:

而如果函數f(x)是凸函數的話,這個條件也是充分條件。
插入一個說明,如果函數f(x)是一個實值函數,x是一個n維向量,那麼f(x)對向量x的導數被定義為:

回到目前的問題,當我們尋找約束存在時的最優點的時候,約束的存在雖然減小了需要搜尋的范圍,但是卻使問題變得更加復雜。為了使問題變得易於處理,我們的方法是把目標函數和約束全部融入一個新的函數,即拉格朗日函數,再通過這個函數來尋找最優點。
為了形象化地分析這個問題,我們考慮目標函數是三變數的函數並且只有一個約束的情況:
(2)
從幾何上來看,上面的問題(2)就是從曲面上來尋找函數的最小值。假設問題(2)的最優解是。我們現在做曲面Ω上任一條通過點x的光滑曲線l:(由於曲線l是在曲面Ω上的,所以自然有)。
令最優點對應的t為t*。因為x*是曲面Ω上的最優點,所以x*也是曲線l上的最優點,所以t*是一元函數的最優點,所以在這一點它的導數是0。通過鏈式法則我們得到:

這個式子說明了在x*這一點,函數的梯度向量 和曲線l在x*處的切線是垂直的。由於曲線l是任意的,所以梯度向量和曲面Ω是垂直的。
回憶高等數學的結論,的方向就是曲面Ω的法線方向,所以和必然在同一直線的方向上,所以必定存在一個常數μ*,有。
我們可以把它寫成更加精煉的形式。如果我們構造二元函數,上面的結論就可以表達為必定存在著常數μ*,使。
我們把構造的函數稱作拉格朗日函數,而其中的μ稱作拉格朗日乘子。

關於只有等式約束的拉格朗日函數的引入,也可以參考維基網路中的兩個變數函數的例子。
以上是一個特殊情形的分析,並且只包含了一個約束。那麼包含等式約束的一般情況,也就是問題(1)來說,我們同樣可以構造拉格朗日函數,不過由於包括多個等式約束,表達稍微不同:

也就是說,每一個等式約束都對應著一個拉格朗日乘子。那麼x*是最優點的必要條件就是,存在相應的拉格朗日乘子μ*,使得以下兩個式子成立:
(實際上就是原問題(1)的約束條件換了種寫法)
這兩個式子就是最優點的必要條件,當然如果函數是凸函數的話,這兩個式子也是充分條件。
現在我們的目標達到了,也就是把目標函數和一系列的等值約束融合到了一個函數(拉格朗日函數)裡面,這樣只需要解(3)和(4)這兩個式子就可以找到最優點,其優點是不言而喻的。而在下一節中我們將會討論包含不等式約束的最優化問題。
尋找最優值的下界
我們首先要引入包含不等式約束的優化問題,標准形式如下:
(1)
f(x)是目標函數,而後面分別是一系列的不等式約束和等式約束。
我們首先明確幾個概念:
可行點(可行解):所有滿足約束的點x。
可行域:所有可行點組成的點集,記為R。正式寫出來就是:

最優點(最優解):滿足約束(也就是處於可行域之內)並且使目標函數達到最小的點,記為x*。
最優值:如果找到了x*,p* = f(x*) 就是最優值。
明確了這些概念以後我們就接著說下面的內容了。
與上節所說的只包含等式約束的情況類似,我們定義拉格朗日函數如下:

我們來看看,這與上節的拉格朗日函數有什麼不同?多了一系列的不等式約束對應的項,所以也多了一系列的拉格朗日乘子。在這里需要強調的是,所有的λi必須是大於等於0的(也即是不等式約束對應的乘子要求大於等於0,我們記為λ≥0,意思是每個都λi≥0)。至於為什麼要這樣要求,後面自然可以看出來。
接下來我們定義一個重要的函數,我們定義拉格郎日對偶函數(the Lagrange al function)如下:
(2)
所以拉格朗日對偶函數就是把看成x的函數所找到的最小值。找到這個最小值有什麼意義呢?
我們先把結論寫下來,這個結論十分重要,是本節論述的目的:
對偶函數產生了原問題(1)最優值p*的一個下界,也就是說,對於任意的λ≥0和任意的μ來說,有:
(3)
那麼如何證明(3)呢?
這個證明步驟十分簡潔。假設x*是原問題(1)中的最優解,也就是f(x*) = p*。

最後兩行的推導是考慮到x*是在可行域R內的,所以肯定有,當然前提是λ≥0,這也就是為什麼在一開始要做這個規定的原因了。
我們如何理解這個不等式(3)呢?下面給出兩個直觀的解釋:
解釋一:線性逼近的解釋

我們首先重寫問題(1),就是把問題(1)換個更加緊湊的方式來表達,首先我們定義示性函數:

同樣我們也可以定義另外一個示性函數:

有了這兩個示性函數的幫助,現在我們可以把問題(1)重新寫成一個沒有約束的形式:
(4)
我們來看看這個優化問題(4)和問題(1)是等價的么?我們可以把(4)的後面兩大項看做是對違反約束條件的x的懲罰函數。起的作用是對違反不等式約束的x進行「無限的」懲罰,也就一旦,懲罰就等於無窮大。而起的作用是對違反等式約束的x進行懲罰,一旦,懲罰就為無窮大。這樣對(4)中目標函數的優化跟對(1)中目標函數在約束條件下的優化就是同一回事,是不是?也就是說,(1)和(4)這兩個問題是等價的問題,但是在(4)中約束被融合到目標函數中來了。

現在我們再回頭看看(2),也就是拉格朗日對偶函數,它也是個優化問題,我們對比它所優化的函數和(4)中所優化的函數,把它們重寫在一起:
(2)中的目標函數
(4)中的目標函數
可見在問題(2)和問題(4)中,我們優化的目標函數區別在於懲罰項不同,(4)中的懲罰項是無限的,就是說一旦違反約束,就施加無窮大的懲罰;而在(2)中我們的懲罰項是線性的,就是說隨著gi(x)和hi(x)的不同,懲罰項是線性變化的。所以(2)和(4)中需要優化的目標函數有很大的不同,用(2)來逼近(4)是很不準確的。但是我們可以看出,對於任意的u,任意的λ≥0和任意的μ來說都有:
(我們把λ限制為大於等於0了)
所以在任意點,(2)中的目標函數的值都是小於(4)中的目標函數的值,所以(2)中找到的最優值肯定是小於(4)中找到的最優值的。再結合前面說的(1)和(4)是等價的問題,所以不等式(3)是成立的。

解釋二:交換max和min的次序
我們首先可以看出:

為什麼會有這個結果呢?當x滿足約束的時候,也就是對所有的i來說有並且,如果我們想通過調整λ和μ讓變大怎麼辦呢?只有讓λ全部為0(注意λ只能大於等於0),這樣就消去了小於0的項,至於,無論μ怎麼變都是沒有影響的。所以當x屬於可行域的時候上式的結果是f(x)。如果x違反了約束呢?在做sup運算的時候只需要對滿足和的項對應的乘子定為+∞,而把其他的項對應的乘子設為0,就可以讓整個式子的結果變為無窮大。
所以我們可以看出來,在問題(1)中的帶約束的優化問題和直接優化是一回事,也就是說:

現在我們把inf和sup兩個運算符調換次序,顯然有:

我們重寫(2)式:
(2)
可以看出結論了,也就是λ≥0時(3)式成立:
(3)
好了,費了半天的勁我們說明了一個問題,就是不等式(3)是怎麼來的。
總結一下,不等式(3)用文字敘述就是:
如果我們把拉格朗日函數看做是x的函數,然後取下確界(注意:是在整個定義域里取下確界,而不是僅僅在可行域里取值,也就是說取下確界時對x是沒有約束的),那麼得到的結果就是原優化問題(1)的最優值的一個下界。

至於我們得到這個結果有什麼用,下節再說。
對偶問題
回憶上一節,對如下的原問題:
(1)
我們定義了拉格朗日對偶函數:

然後我們證明了:,其中p*是原問題的最優值。
也就是說我們找到了原問題最優值的一個下界。既然我們找到了一個下界,顯然我們要找到它最好的下界。什麼是最好的下界的?顯然就是所有下界當中最大的那一個。所以我們要把最大化,當然我們還要記得我們需要限制。我們把要優化的函數和約束條件正式寫下來就是:
(2)
與原問題(1)相對應,我們把上面的問題(2)稱作拉格朗日對偶問題(Lagrange al problem)。顯然,對偶問題的最優值d*就是我們可以獲得的p*的最優下界,也就是所有下界中離p*最近的一個,它們的關系是:
(3)
我們把這個不等式叫做弱對偶性質(Weak Duality)。
順其自然,我們可以引出一個重要的概念,對偶間隙,其定義為,用文字敘述就是原問題的最優值與通過拉個郎日對偶函數獲得的其最好(最大)的下界之差。由不等式(3)可以看出,對偶間隙肯定是大於等於0的。
那麼有沒有可能在某種情況下,對偶間隙消失了呢?也就是說對偶問題的最優值與原問題的最優值相等了呢?
我們將要敘述一下Slater條件:
Slater條件:
存在x滿足:
Slater條件即是說存在x,使不等式約束中的「小於等於號」要嚴格取到「小於號」。
可以證明,對於凸優化問題(關於凸優化問題,請參考維基網路),如果Slater條件滿足了,則:

這種情況稱為強對偶性質(Strong Duality)。
下面的問題是,如果對偶間隙消失了,會發生什麼有趣的現象呢?
如果對偶間隙消失了,也就是說,如果對偶問題存在著最優點λ*,μ*並且使其對應的最優值等於p*,這時會發生什麼情況呢?還記得上一節我們證明的過程么:
(4)
在對偶間隙消失的情況下,中間所有的不等號都要變成等號:
(5)
注意,(5)中的λ和μ都加了星號,表示它們是對偶問題的最優點。(5)中有兩個重要的等號,已經加了標記。
我們能得出什麼結論?
1 .我們先來看等號1:
它說明了原問題的最優點x*是使取得最小值的點。
2. 我們再來看等號2:
它說明了:

由於我們限制了每一個λi≥0,所以上式中每一項都是非正的。這樣我們又可以得出結論:
(6)
等式(6)被稱作是互補性條件,我們可以把它換種寫法:

或者寫成它的等價形式(逆否命題):

也就是說,只要一個不為0,另一個就必為0!
互補性條件有著重要的意義。它說明了當時,x*是處於可行域的內部的,這時不等式約束並不起作用,此時;而的點肯定是可行域邊界的點()。也就是說只有積極約束才有不為0的對偶變數。而這在支持向量機中有著重要的意義。回想在第一節我們最後的結論,支持向量機尋找最大間隔超平面可以歸結為一個優化問題:
目標函數:

限制:

那麼哪些不等式約束對應著不為0的對偶變數呢?顯然,只有當時,這個約束對應的對偶變數才可能不為0,而意味著什麼?意味著這個約束對應的樣本點xi是支持向量!也就是說:
只有支持向量才對應不為0的拉格朗日乘子!

⑷ 小球大間隔模型存在的對偶問題

軟間隔
在上文當中我們說了,在實際的場景當中,數據不可能是百分百線性可分的,即使真的能硬生生地找到這樣的一個分隔平面區分開樣本,那麼也很有可能陷入過擬合當中,也是不值得追求的。

因此,我們需要對分類器的標准稍稍放鬆,允許部分樣本出錯。但是這就帶來了一個問題,在硬間隔的場景當中,間隔就等於距離分隔平面最近的支持向量到分隔平面的距離。那麼,在允許出錯的情況下,這個間隔又該怎麼算呢?

為了解決這個問題,我們需要對原本的公式進行變形,引入一個新的變數叫做鬆弛變數。鬆弛變數我們用希臘字母𝜉
ξ
來表示,這個鬆弛變數允許我們適當放鬆$y_i(\omega^T x_i + b) \ge 1 這個限制條件,我們將它變成













y_i(\omega^T x_i + b) \ge 1-\xi_i $。

也就是說對於每一條樣本我們都會有一個對應的鬆弛變數𝜉𝑖
ξ
i
,它一共有幾種情況。

𝜉=0
ξ
=
0
,表示樣本能夠正確分類
0<𝜉<1
0
<
ξ
<
1
,表示樣本在分割平面和支持向量之間
𝜉=1
ξ
=
1
,表示樣本在分割平面上
𝜉≥1
ξ

1
,表示樣本異常
我們可以結合下面這張圖來理解一下,會容易一些:

鬆弛變數雖然可以讓我們表示那些被錯誤分類的樣本,但是我們當然不希望它隨意鬆弛,這樣模型的效果就不能保證了。所以我們把它加入損失函數當中,希望在鬆弛得盡量少的前提下保證模型盡可能劃分正確。這樣我們可以重寫模型的學習條件:

min12||𝜔||2+𝐶∑𝑖=1𝑚𝜉𝑖𝑠.𝑡.𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏)≥1−𝜉𝑖,𝜉𝑖≥0,𝑖=1,2,3…,𝑛𝑖=1,2,3…,𝑛
min
1
2
|
|
ω
|
|
2
+C

i
=
1
m
ξ
i
s.t.
y
i
(
ω
T
x
i
+b)≥1−
ξ
i
, i=1,2,3…,n
ξ
i
≥0, i=1,2,3…,n
這里的C是一個常數,可以理解成懲罰參數。我們希望||𝜔||2
|
|
ω
|
|
2
盡量小,也希望∑𝜉𝑖

ξ
i
盡量小,這個參數C就是用來協調兩者的。C越大代表我們對模型的分類要求越嚴格,越不希望出現錯誤分類的情況,C越小代表我們對鬆弛變數的要求越低。

從形式上來看模型的學習目標函數和之前的硬間隔差別並不大,只是多了一個變數而已。這也是我們希望的,在改動盡量小的前提下讓模型支持分隔錯誤的情況。

模型推導
對於上面的式子我們同樣使用拉格朗日公式進行化簡,將它轉化成沒有約束的問題。

首先,我們確定幾個值。第一個是我們要優化的目標:𝑓(𝑥)=min𝜔,𝑏,𝜉12||𝜔||2+𝐶∑𝑚𝑖=1𝜉𝑖
f
(
x
)
=
min
ω
,
b
,
ξ
1
2
|
|
ω
|
|
2
+
C

i
=
1
m
ξ
i

第二個是不等式約束,拉格朗日乘子法當中限定不等式必須都是小於等於0的形式,所以我們要將原式中的式子做一個簡單的轉化:

𝑔(𝑥)=1−𝜉𝑖−𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏)≤0ℎ(𝑥)=−𝜉𝑖≤0
g(x)=1−
ξ
i

y
i
(
ω
T
x
i
+b)≤0 h(x)=−
ξ
i
≤0
最後是引入拉格朗日乘子: 𝛼=(𝛼1,𝛼2,⋯,𝛼𝑚),𝛽=(𝛽1,𝛽2,⋯,𝛽𝑚)
α
=
(
α
1
,
α
2
,

,
α
m
)
,
β
=
(
β
1
,
β
2
,

,
β
m
)

我們寫出廣義拉格朗日函數:𝐿(𝜔,𝑏,𝜉,𝛼,𝛽)=12||𝜔||2+𝐶∑𝑚𝑖=1𝜉𝑖,+∑𝑚𝑖=1𝛼𝑖(1−𝜉𝑖−𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏))−∑𝑚𝑖=1𝛽𝑖𝜉𝑖
L
(
ω
,
b
,
ξ
,
α
,
β
)
=
1
2
|
|
ω
|
|
2
+
C

i
=
1
m
ξ
i
,
+

i
=
1
m
α
i
(
1

ξ
i

y
i
(
ω
T
x
i
+
b
)
)


i
=
1
m
β
i
ξ
i

我們要求的是這個函數的最值,也就是min𝜔,𝑏,𝜉max𝛼≥0,𝛽≥0𝐿(𝜔,𝑏,𝜉,𝛼,𝛽)
min
ω
,
b
,
ξ
max
α

0
,
β

0
L
(
ω
,
b
,
ξ
,
α
,
β
)


在處理硬間隔的時候,我們講過對偶問題,對於軟間隔也是一樣。我們求L函數的對偶函數的極值。

對偶問題
原函數的對偶問題是max𝛼≥0,𝛽≥0min𝜔,𝑏,𝜉𝐿(𝜔,𝑏,𝜉,𝛼,𝛽)
max
α

0
,
β

0
min
ω
,
b
,
ξ
L
(
ω
,
b
,
ξ
,
α
,
β
)
,這個對偶問題要成立需要滿足KKT條件。

我們先把這個KKT條件放一放,先來看一下對偶問題當中的內部的極小值。這個極小值沒有任何約束條件,所以我們可以放心大膽地通過求導來來計算極值。這個同樣是高中數學的內容,我們分別計算∂𝐿∂𝜔

L

ω
,∂𝐿∂𝑏

L

b
和∂𝐿∂𝜉

L

ξ


求導之後,我們可以得到:

∂𝐿∂𝜔=0∂𝐿∂𝑏=0∂𝐿∂𝜉=0→𝜔=∑𝑖=1𝑚𝛼𝑖𝑦𝑖𝑥𝑖→∑𝑖=1𝑚𝛼𝑖𝑦𝑖=0→𝛽𝑖=𝐶−𝛼𝑖

L

ω
=0 →ω=

i
=
1
m
α
i
y
i
x
i

L

b
=0 →

i
=
1
m
α
i
y
i
=0

L

ξ
=0 →
β
i
=C−
α
i

我們把這三個式子帶入對偶函數可以得到:

𝐿(𝜔,𝑏,𝜉,𝛼,𝛽)=12∑𝑖=1𝑚∑𝑗=1𝑚𝛼𝑖𝛼𝑗𝑦𝑖𝑦𝑗𝑥𝑇𝑖𝑥𝑗+𝐶∑𝑖=1𝑚𝜉𝑖+∑𝑖=1𝑚𝛼𝑖(1−𝜉𝑖)−∑𝑖=1𝑚(𝐶−𝛼𝑖)𝜉𝑖=∑𝑖=1𝑚𝛼𝑖−12∑𝑖=1𝑚∑𝑗=1𝑚𝛼𝑖𝛼𝑗𝑦𝑖𝑦𝑗𝑥𝑇𝑖𝑥𝑗
L(ω,b,ξ,α,β) =
1
2

i
=
1
m

j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
+C

i
=
1
m
ξ
i
+

i
=
1
m
α
i
(1−
ξ
i
)−

i
=
1
m
(C−
α
i
)
ξ
i
=

i
=
1
m
α
i

1
2

i
=
1
m

j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j

由於𝛽𝑖≥0
β
i

0
,所以我們可以得到0≤𝛼𝑖≤𝐶
0

α
i

C
,所以最後我們可以把式子化簡成:

max𝛼∑𝑖=1𝑚𝛼𝑖−12∑𝑖=1𝑚∑𝑗=1𝑚𝛼𝑖𝛼𝑗𝑦𝑖𝑦𝑗𝑥𝑇𝑖𝑥𝑗𝑠.𝑡.∑𝑚𝑖=1𝛼𝑖𝑦𝑖=00≤𝛼𝑖≤𝐶,𝑖=1,2,3…,𝑚
max
α

i
=
1
m
α
i

1
2

i
=
1
m

j
=
1
m
α
i
α
j
y
i
y
j
x
i
T
x
j
s.t.

i
=
1
m
α
i
y
i
=0 0≤
α
i
≤C, i=1,2,3…,m
將原始化簡了之後,我們再回過頭來看KKT條件。KKT條件單獨理解看起來有點亂,其實我們可以分成三個部分,分別是原始問題可行:

1−𝜉𝑖−𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏)≤0−𝜉𝑖≤0
1−
ξ
i

y
i
(
ω
T
x
i
+b)≤0 −
ξ
i
≤0
對偶問題可行:

𝛼𝑖≥0𝛽𝑖=𝐶−𝛼𝑖
α
i
≥0
β
i
=C−
α
i

以及鬆弛可行:

𝛼𝑖(1−𝜉−𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏))=0𝛽𝑖𝜉𝑖=0
α
i
(1−ξ−
y
i
(
ω
T
x
i
+b))=0
β
i
ξ
i
=0
我們觀察一下倒數第二個條件:𝛼𝑖(1−𝜉−𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏))=0
α
i
(
1

ξ

y
i
(
ω
T
x
i
+
b
)
)
=
0


這是兩個式子相乘並且等於0,無非兩種情況,要麼𝛼𝑖=0
α
i
=
0
,要麼後面那串等於0。我們分情況討論。

如果𝛼𝑖=0
α
i
=
0
,那麼𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏)−1≥0
y
i
(
ω
T
x
i
+
b
)

1

0
,樣本分類正確,不會對模型產生影響。
如果𝛼𝑖>0
α
i
>
0
,那麼𝑦𝑖(𝜔𝑇𝑥𝑖+𝑏)=1−𝜉𝑖
y
i
(
ω
T
x
i
+
b
)
=
1

ξ
i
,則樣本是支持向量。由於𝐶=𝛼𝑖+𝛽𝑖
C
=
α
i
+
β
i
,並且𝛽𝑖𝜉𝑖=0
β
i
ξ
i
=
0
。我們又可以分情況:
𝛼𝑖<𝐶
α
i
<
C
,那麼𝛽𝑖>0
β
i
>
0
,所以𝜉𝑖=0
ξ
i
=
0
,那麼樣本在邊界上
如果𝛼𝑖=𝐶
α
i
=
C
,那麼𝛽𝑖=0
β
i
=
0
,如果此時𝜉≤1
ξ

1
,那麼樣本被正確分類,否則樣本被錯誤分類
經過了化簡之後,式子當中只剩下了變數𝛼
α
,我們要做的就是找到滿足約束條件並且使得式子取極值時的𝛼
α
,這個𝛼
α
要怎麼求呢?我們這里先放一放,將在下一篇文章當中詳解講解。

熱點內容
家用伺服器怎麼選 發布:2024-03-29 00:49:18 瀏覽:400
Ap6510dn如何配置 發布:2024-03-29 00:38:47 瀏覽:332
安卓和蘋果哪個更佔用內存 發布:2024-03-29 00:37:02 瀏覽:423
編譯錯誤算bug嗎 發布:2024-03-29 00:23:03 瀏覽:33
c語言干什麼 發布:2024-03-29 00:05:35 瀏覽:314
香港中轉伺服器搭建 發布:2024-03-29 00:05:16 瀏覽:673
安卓手機怎麼在桌面上顯示鍾表 發布:2024-03-28 23:48:22 瀏覽:5
分析代碼能編譯嗎 發布:2024-03-28 23:48:16 瀏覽:767
c語言與易語言 發布:2024-03-28 23:46:25 瀏覽:588
ai壓縮腳本 發布:2024-03-28 23:41:10 瀏覽:988