這種檔案格式最大的好處就是可以使用 sparse matrix, 或說有些 data svm 的 attribute 可以不存在。
这里暂时不展开关于使用SMO算法求解以上优化问题的细节,下一篇文章再加以详细推导。 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。 Svmpredict 依照已經 train 好的 model, 再加上給定的輸入 (新值), 輸出 predict (預測) 新值所對應的類別 .
svm: 支持向量迴歸(Support Vector Regression, SVR) 模型
這裡的迴歸模型採用非線性的資料進行數據擬合的實驗。 我們可以發現線性的核函數無法有效的預測所有數據點的趨勢。 而非線性的模型中 RBF 的模型對於此資料有比較好的預測結果。 跟线性可分求解的思路一致,同样这里先用拉格朗日乘子法得到拉格朗日函数,再求其对偶问题。 看到這裡,基本上你應該已經可以利用 svm 來作事了: 你只要寫程式輸出正確格式的資料,交給 svm 去 train, 後來再 predict 並讀入結果即可。
除了進行線性分類之外 SVM 還可以使用核技巧有效地進行非線性分類,將其輸入的資料投到更高維度的空間,並在高維度的空間進行高維度的分類或降維。 簡單來說透過多維度的投影技巧,將原本在二維空間中不可分的點到了三維空間就可分了。 但是隨著資料量增加其運算也會變多,相對的執行速度就會變慢。
svm: Using SVM
想想也很合理, 假定 train 本身是很耗時的動作, 而 train 好可以以某種形式存起內部資料, 那下次要 predict 時直接把那些內部資料 load 進來就快多了. 解開來後, 假定是 UNIX 系統, 直接打 make 就可以了; 編不出來的話請 詳讀說明和運用常識. 因為這是 tutorial, 所以我不花時間細談, 而且 會編不出來的情形真是少之又少, 通常一定是你的系統有問題或你太笨了.
在這裡我們不細談了,有興趣的人請再 參考 SVM 與 libsvm 的其它文件。 SVM 演算法最初是為二元分類問題所設計的,但是現實生活中的例子一定不只有兩類的問題要解決。 他的解決方式與 [Day 9 邏輯迴歸] 所提到的多元分類邏輯迴歸是一樣的。 常見方法包括 one-vs-rest 和 many-vs-many 兩種。 对于这个问题,我们有更高效的优化算法,即序列最小优化(SMO)算法。
svm: [Day 11] 核模型 – 支持向量機 (SVM)
其他的子目錄可以不管, 只要 svm-train, svm-scale, svm-predict三個執行檔有編出來就可以了. 聽起來是很神奇的事(如果你覺得不神奇,請重想一想這句話代表什麼: 分類的依據是未知的!,還是不神奇的話就請你寫個程式 解解看這個問題), 也很像要 AI 之類的高等技巧… 不過 svm SVM 基於 統計學習理論 可以在合理的時間內漂亮的解決這個問題。 ,所对应的样本点位于最大间隔边界上,是一个支持向量。
也就是說,如果我有一堆已經分好類的東西 (可是分類的依據是未知的!) ,那當收到新的東西時, SVM svm 可以預測 新的資料要分到哪一堆去。 當然現實生活中的資料往往稍微複雜,那如果不是線性可分集合怎麼辦呢? SVM 分類器與 SVR 迴歸器手把手實作藉由圖形化的邊界,來了解使用不同的 Kernel 及不同參數的意義。 这是一个含有不等式约束的凸二次规划问题,可以对其使用拉格朗日乘子法得到其对偶问题(dual problem)。 總而言之,regression 是非常有趣的東西,不過也是比較 進階的用法。
svm: SVM: What is it and what can it do for me?
支持向量機 是一個基於統計學習的監督式演算法,透過找出一個超平面,使之將兩個不同的集合分開。 一般的分類問題我們就是要,找出在不同的資料類別中的分隔線。 然而 SVM 就是要在這很多種的可能當中找出最佳的解。 SVM svm 演算法的精神就是找出一條分隔線使所有在邊界上的點離得越遠越好,使模型抵抗雜訊的能力更佳。 支持向量機(SVM)是專門處理分類的問題,還有另一個名詞稱為支持向量迴歸(Support Vector svm Regression, SVR)專門處理迴歸問題。
我們藉由圖形化的邊界,來了解使用不同的 Kernel 及不同參數的意義。 以下範例將原先 鳶尾花朵資料集四個特徵透過 PCA 降成二維,以利我們做視覺化觀察。 透過四種不同的 SVC 實驗我們可以發現不同的核技巧所預測出來的決策邊線都不盡相同。 然而越複雜的模型相對的邊界就會變得越扭曲,因為非線性的模型能夠有比較好的擬合使得錯誤率降低。
svm: 非線性可分支持向量機
線性可分支持向量機就是在下圖範例的二維圖形中找出一條線,目標讓這條直線與兩個類別之間的間隔寬度距離最大化。 其中離兩條虛線(間隔超平面)距離最近的點,就稱為支持向量 。 Svmtrain Train (訓練) data. 跑 SVM 被戲稱為 “開火車” 也是由於這個程式名而來. Train 會接受特定格式的輸入, 產生一個 “Model” 檔. 這個 model 你可以想像成 SVM 的內部資料, 因為 predict 要 model 才能 predict, 不能直接吃原始資料.
这显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。 (直接執行 svm-train 不指定輸入檔與參數會列出所有參數及語法說明) 這些參數對應到原始 SVM 公式的一些參數,所以會影響 predict 的正確與否。 也所以,我們可以拿原 training set 當做 test_file再丟給 svmpredict 去 predict (因為格式一樣),看看正確率有多高, 方便後面調參數。 或許你會不太懂,為什麼會是 value1,value2,…. 這些值就是 valueN,而 x 的 n 就是 由 indexN 指定。 SVM, Support Vector Machine, 簡而言之它是個起源跟類神經網路有點像的東西, 不過現今最常拿來就是做分類 。
svm: svmtrain
到此我已經簡單的說明了 libsvm 的使用方式, 更完整的用法請參考 libsvm 的說明跟cjlin 的網站、 SVM 的相關文件,或是去上 cjlin 的課。 等找到一組不錯的參數後,就拿這組參數來建 model 並用來做最後對未知資料的 predict。 這整個過程叫 cross validation , 也就是交叉比對。 Svm-scale 目前不太好用,不過它有其必要性。 因為 適當的scale有助於參數的選擇(後述)還有解svm的速度。 後面可以說是一些稍微進階的部份,我可能不會講的很清楚, 因為我的重點是想表達一些觀念和解釋一些你看相關文件時 svm 很容易碰到的名詞。
由香港SEO公司 https://featured.com.hk/ 提供SEO服務