❶ 有誰下過Matlab的SVM-KM中的m-svm代碼嗎新手求助
向量機類型應是最經典簡單的svm,核函數可以是多項式,高斯,小波等核函數,向量機求解用的是二次規劃演算法,也就是QP演算法(quadratic programming algorithm )
❷ 求一完整的SVM分類器的程序,matlab編寫的。感激不盡。。。。
這個是非線性svm的:
1.命令函數部分:
clear;%清屏
clc;
X =load('data.txt');
n = length(X);%總樣本數量
y = X(:,4);%類別標志
X = X(:,1:3);
TOL = 0.0001;%精度要求
C = 1;%參數,對損失函數的權重
b = 0;%初始設置截距b
Wold = 0;%未更新a時的W(a)
Wnew = 0;%更新a後的W(a)
for i = 1 : 50%設置類別標志為1或者-1
y(i) = -1;
end
a = zeros(n,1);%參數a
for i = 1 : n%隨機初始化a,a屬於[0,C]
a(i) = 0.2;
end
%為簡化計算,減少重復計算進行的計算
K = ones(n,n);
for i = 1 :n%求出K矩陣,便於之後的計算
for j = 1 : n
K(i,j) = k(X(i,:),X(j,:));
end
end
sum = zeros(n,1);%中間變數,便於之後的計算,sum(k)=sigma a(i)*y(i)*K(k,i);
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k);
end
end
while 1%迭代過程
%啟發式選點
n1 = 1;%初始化,n1,n2代表選擇的2個點
n2 = 2;
%n1按照第一個違反KKT條件的點選擇
while n1 <= n
if y(n1) * (sum(n1) + b) == 1 && a(n1) >= C && a(n1) <= 0
break;
end
if y(n1) * (sum(n1) + b) > 1 && a(n1) ~= 0
break;
end
if y(n1) * (sum(n1) + b) < 1 && a(n1) ~=C
break;
end
n1 = n1 + 1;
end
%n2按照最大化|E1-E2|的原則選取
E1 = 0;
E2 = 0;
maxDiff = 0;%假設的最大誤差
E1 = sum(n1) + b - y(n1);%n1的誤差
for i = 1 : n
tempSum = sum(i) + b - y(i);
if abs(E1 - tempSum)> maxDiff
maxDiff = abs(E1 - tempSum);
n2 = i;
E2 = tempSum;
end
end
%以下進行更新
a1old = a(n1);
a2old = a(n2);
KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2);
a2new = a2old + y(n2) *(E1 - E2) / KK;%計算新的a2
%a2必須滿足約束條件
S = y(n1) * y(n2);
if S == -1
U = max(0,a2old - a1old);
V = min(C,C - a1old + a2old);
else
U = max(0,a1old + a2old - C);
V = min(C,a1old + a2old);
end
if a2new > V
a2new = V;
end
if a2new < U
a2new = U;
end
a1new = a1old + S * (a2old - a2new);%計算新的a1
a(n1) = a1new;%更新a
a(n2) = a2new;
%更新部分值
sum = zeros(n,1);
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k);
end
end
Wold = Wnew;
Wnew = 0;%更新a後的W(a)
tempSum = 0;%臨時變數
for i = 1 : n
for j = 1 : n
tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);
end
Wnew= Wnew+ a(i);
end
Wnew= Wnew - 0.5 * tempSum;
%以下更新b:通過找到某一個支持向量來計算
support = 1;%支持向量坐標初始化
while abs(a(support))< 1e-4 && support <= n
support = support + 1;
end
b = 1 / y(support) - sum(support);
%判斷停止條件
if abs(Wnew/ Wold - 1 ) <= TOL
break;
end
end
%輸出結果:包括原分類,辨別函數計算結果,svm分類結果
for i = 1 : n
fprintf('第%d點:原標號 ',i);
if i <= 50
fprintf('-1');
else
fprintf(' 1');
end
fprintf(' 判別函數值%f 分類結果',sum(i) + b);
if abs(sum(i) + b - 1) < 0.5
fprintf('1\n');
else if abs(sum(i) + b + 1) < 0.5
fprintf('-1\n');
else
fprintf('歸類錯誤\n');
end
end
end
2.名為f的功能函數部分:
function y = k(x1,x2)
y = exp(-0.5*norm(x1 - x2).^2);
end
3.數據:
0.8871 -0.3491 8.3376 0
1.2519 1.2083 6.5041 0
-1.1925 1.9338 1.8790 0
-0.1277 2.4371 2.6971 0
1.9697 3.0906 6.0391 0
0.7603 0.8241 1.5323 0
1.6382 3.5516 4.4694 0
1.3438 -0.4539 5.9366 0
-1.3361 -2.0201 1.6393 0
-0.3886 3.3041 8.0450 0
-0.6780 6.0196 -0.4084 0
0.3552 -0.1051 1.2458 0
1.6560 4.0786 0.8521 0
0.8117 3.5451 6.8925 0
1.4773 -1.9340 3.9256 0
-0.0732 -0.9526 0.4609 0
0.1521 4.3711 2.2600 0
1.4820 0.7493 0.3475 0
0.6140 4. 8.3776 0
0.5721 3.3460 3.7853 0
0.5269 4.1452 4.3900 0
1.7879 -0.5390 2.5516 0
0.9885 5.7625 0.1832 0
-0.3318 2.4373 -0.6884 0
1.3578 5.4709 3.4302 0
2.7210 -1.1268 4.7719 0
0.5039 -0.1025 2.3650 0
1.1107 1.6885 3.7650 0
0.7862 1.3587 7.3203 0
1.0444 -1.5841 3.6349 0
1.7795 1.7276 4.9847 0
0.6710 1.4724 -0.5504 0
0.2303 0.2720 -1.6028 0
1.7089 -1.7399 4.8882 0
1.0059 0.5557 5.1188 0
2.3050 0.8545 2.8294 0
1.9555 0.9898 0.3501 0
1.7141 1.5413 3.8739 0
2.2749 5.3280 4.9604 0
1.6171 0.5270 3.3826 0
3.6681 -1.8409 4.8934 0
1.1964 1.8781 1.4146 0
0.7788 2.1048 0.0380 0
0.7916 5.0906 3.8513 0
1.0807 1.8849 5.9766 0
0.6340 2.6030 3.6940 0
1.9069 -0.0609 7.4208 0
1.6599 4.9409 8.1108 0
1.3763 0.8899 3.9069 0
0.8485 1.4688 6.7393 0
3.6792 6.1092 4.9051 1
4.3812 7.2148 6.1211 1
4.3971 3.4139 7.7974 1
5.0716 7.7253 10.5373 1
5.3078 8.8138 6.1682 1
4.1448 5.5156 2.8731 1
5.3609 6.0458 4.0815 1
4.7452 6.6352 1.3689 1
6.0274 6.5397 -1.9120 1
5.3174 3.0134 6.7935 1
7.2459 3.6970 3.1246 1
6.1007 8.1087 5.5568 1
5.9924 6.9238 5.7938 1
6.0263 5.3333 7.5185 1
3.6470 8.0915 6.4713 1
3.6543 7.2264 7.5783 1
5.0114 6.5335 3.5229 1
4.4348 7.4379 -0.0292 1
3.6087 3.7351 3.0172 1
3.5374 5.5354 7.6578 1
6.0048 2.0691 10.4513 1
3.1423 4.0003 5.4994 1
3.4012 7.1536 8.3510 1
5.5471 5.1372 -1.5090 1
6.5089 5.4911 8.0468 1
5.4583 6.7674 5.9353 1
4.1727 2.9798 3.6027 1
5.1672 8.4136 4.8621 1
4.8808 3.5514 1.9953 1
5.4938 4.1998 3.2440 1
5.4542 5.8803 4.4269 1
4.8743 3.9641 8.1417 1
5.9762 6.7711 2.3816 1
6.6945 7.2858 1.8942 1
4.7301 5.7652 1.6608 1
4.7084 5.3623 3.2596 1
6.0408 3.3138 7.7876 1
4.6024 8.3517 0.2193 1
4.7054 6.6633 -0.3492 1
4.7139 5.6362 6.2330 1
4.0850 10.7118 3.3541 1
6.1088 6.1635 4.2292 1
4.9836 5.4042 6.7422 1
6.1387 6.1949 2.5614 1
6.0700 7.0373 3.3256 1
5.6881 5.1363 9.9254 1
7.2058 2.3570 4.7361 1
4.2972 7.3245 4.7928 1
4.7794 8.1235 3.1827 1
3.9282 6.4092 -0.6339 1
❸ matlab中使用libsvm如何實現參數尋優
可以利用libsvm工具箱中自帶的k折交叉驗證方法進行參數的尋優。
k折交叉驗證的基本思想如下:
k個子集,每個子集均做一次測試集,其餘的作為訓練集。交叉驗證重復k次,每次選擇一個子集作為測試集,並將k次的平均交叉驗證識別正確率作為結果。
libsvm工具箱中交叉驗證的使用方法如下:
predict=trian(data_label,data_train,cmd);
%train_label表示訓練輸出樣本數據;
%data_train表示訓練輸入樣本數據;
%cmd就是訓練參數的設置,如設置為cmd='-v5'就表示進行5折交叉驗證(該設置中省略了其他參數的設置,即保存默認設置)。
❹ 請問MIMLBOOST & MIMLSVM演算法的matlab代碼如何使用
bags格式是元胞數組,target是n*1的矩陣,自己劃分訓練集測試集代入就行了
❺ 請問在matlab中如何實現支持向量機(SVM)演算法
matlab自帶svmtrain,進去看help,照著例子做就懂了
❻ matlab如何svm實現圖像分類輸出像素點
matlab如何svm實現圖像分類輸出像素點,這里分享下操作方法。
設備:華碩筆記本
系統:win10
軟體:matlab2012
1、首先雙擊桌面matlab圖標,打開matlab軟體。
❼ 人工智慧要做實驗了,題目是數字識別,用matlab實現svm演算法,就是支持向量機
使用Matlab中的LIBSVM工具箱。
❽ 跪求用MATLAB編寫的svm源程序,可以實現支持向量機用於特徵分類或提取
用LIBSVM工具箱,它是由台灣大學林智仁(Chih-Jen Lin)等開發和設計的,它是一個簡單、易於使用並且快速有效的SVM軟體工具包,可以解決C-支持向量分類(C-SVC)、v-支持向量分類(v-SVC)、分布估計(one-class SVM)、e-支持向量回歸(e-SVR)和v-支持向量回歸(v-SVR)問題。
軟體下載網址:http://www.csie.ntu.e.tw/~cjlin/libsvm/index.html#matlab
頁面上有MATLAB版的,只要在matlab中安裝一下就可以用了!
❾ 支持向量機基本原理 matlab程序及其應用
支持向量機
1 簡介
支持向量機基本上是最好的有監督學習演算法了。最開始接觸SVM是去年暑假的時候,老師要求交《統計學習理論》的報告,那時去網上下了一份入門教程,裡面講的很通俗,當時只是大致了解了一些相關概念。這次斯坦福提供的學習材料,讓我重新學習了一些SVM知識。我看很多正統的講法都是從VC 維理論和結構風險最小原理出發,然後引出SVM什麼的,還有些資料上來就講分類超平面什麼的。這份材料從前幾節講的logistic回歸出發,引出了SVM,既揭示了模型間的聯系,也讓人覺得過渡更自然。
2 重新審視logistic回歸
Logistic回歸目的是從特徵學習出一個0/1分類模型,而這個模型是將特性的線性組合作為自變數,由於自變數的取值范圍是負無窮到正無窮。因此,使用logistic函數(或稱作sigmoid函數)將自變數映射到(0,1)上,映射後的值被認為是屬於y=1的概率。
形式化表示就是
假設函數
其中x是n維特徵向量,函數g就是logistic函數。
的圖像是
可以看到,將無窮映射到了(0,1)。
而假設函數就是特徵屬於y=1的概率。
當我們要判別一個新來的特徵屬於哪個類時,只需求 ,若大於0.5就是y=1的類,反之屬於y=0類。
再審視一下 ,發現 只和 有關, >0,那麼 ,g(z)只不過是用來映射,真實的類別決定權還在 。還有當 時, =1,反之 =0。如果我們只從 出發,希望模型達到的目標無非就是讓訓練數據中y=1的特徵 ,而是y=0的特徵 。Logistic回歸就是要學習得到 ,使得正例的特徵遠大於0,負例的特徵遠小於0,強調在全部訓練實例上達到這個目標。
圖形化表示如下:
中間那條線是 ,logistic回顧強調所有點盡可能地遠離中間那條線。學習出的結果也就中間那條線。考慮上面3個點A、B和C。從圖中我們可以確定A是×類別的,然而C我們是不太確定的,B還算能夠確定。這樣我們可以得出結論,我們更應該關心靠近中間分割線的點,讓他們盡可能地遠離中間線,而不是在所有點上達到最優。因為那樣的話,要使得一部分點靠近中間線來換取另外一部分點更加遠離中間線。我想這就是支持向量機的思路和logistic回歸的不同點,一個考慮局部(不關心已經確定遠離的點),一個考慮全局(已經遠離的點可能通過調整中間線使其能夠更加遠離)。這是我的個人直觀理解。
3 形式化表示
我們這次使用的結果標簽是y=-1,y=1,替換在logistic回歸中使用的y=0和y=1。同時將 替換成w和b。以前的 ,其中認為 。現在我們替換 為b,後面替換 為 (即 )。這樣,我們讓 ,進一步 。也就是說除了y由y=0變為y=-1,只是標記不同外,與logistic回歸的形式化表示沒區別。再明確下假設函數
上一節提到過我們只需考慮 的正負問題,而不用關心g(z),因此我們這里將g(z)做一個簡化,將其簡單映射到y=-1和y=1上。映射關系如下:
4 函數間隔(functional margin)和幾何間隔(geometric margin)
給定一個訓練樣本 ,x是特徵,y是結果標簽。i表示第i個樣本。我們定義函數間隔如下:
可想而知,當 時,在我們的g(z)定義中, , 的值實際上就是 。反之亦然。為了使函數間隔最大(更大的信心確定該例是正例還是反例),當 時, 應該是個大正數,反之是個大負數。因此函數間隔代表了我們認為特徵是正例還是反例的確信度。
繼續考慮w和b,如果同時加大w和b,比如在 前面乘個系數比如2,那麼所有點的函數間隔都會增大二倍,這個對求解問題來說不應該有影響,因為我們要求解的是 ,同時擴大w和b對結果是無影響的。這樣,我們為了限制w和b,可能需要加入歸一化條件,畢竟求解的目標是確定唯一一個w和b,而不是多組線性相關的向量。這個歸一化一會再考慮。
剛剛我們定義的函數間隔是針對某一個樣本的,現在我們定義全局樣本上的函數間隔
說白了就是在訓練樣本上分類正例和負例確信度最小那個函數間隔。
接下來定義幾何間隔,先看圖
假設我們有了B點所在的 分割面。任何其他一點,比如A到該面的距離以 表示,假設B就是A在分割面上的投影。我們知道向量BA的方向是 (分割面的梯度),單位向量是 。A點是 ,所以B點是x= (利用初中的幾何知識),帶入 得,
進一步得到
實際上就是點到平面距離。
再換種更加優雅的寫法:
當 時,不就是函數間隔嗎?是的,前面提到的函數間隔歸一化結果就是幾何間隔。他們為什麼會一樣呢?因為函數間隔是我們定義的,在定義的時候就有幾何間隔的色彩。同樣,同時擴大w和b,w擴大幾倍, 就擴大幾倍,結果無影響。同樣定義全局的幾何間隔
5 最優間隔分類器(optimal margin classifier)
回想前面我們提到我們的目標是尋找一個超平面,使得離超平面比較近的點能有更大的間距。也就是我們不考慮所有的點都必須遠離超平面,我們關心求得的超平面能夠讓所有點中離它最近的點具有最大間距。形象的說,我們將上面的圖看作是一張紙,我們要找一條折線,按照這條折線折疊後,離折線最近的點的間距比其他折線都要大。形式化表示為:
這里用 =1規約w,使得 是幾何間隔。
到此,我們已經將模型定義出來了。如果求得了w和b,那麼來一個特徵x,我們就能夠分類了,稱為最優間隔分類器。接下的問題就是如何求解w和b的問題了。
由於 不是凸函數,我們想先處理轉化一下,考慮幾何間隔和函數間隔的關系, ,我們改寫一下上面的式子:
這時候其實我們求的最大值仍然是幾何間隔,只不過此時的w不受 的約束了。然而這個時候目標函數仍然不是凸函數,沒法直接代入優化軟體里計算。我們還要改寫。前面說到同時擴大w和b對結果沒有影響,但我們最後要求的仍然是w和b的確定值,不是他們的一組倍數值,因此,我們需要對 做一些限制,以保證我們解是唯一的。這里為了簡便我們取 。這樣的意義是將全局的函數間隔定義為1,也即是將離超平面最近的點的距離定義為 。由於求 的最大值相當於求 的最小值,因此改寫後結果為:
這下好了,只有線性約束了,而且是個典型的二次規劃問題(目標函數是自變數的二次函數)。代入優化軟體可解。
到這里發現,這個講義雖然沒有像其他講義一樣先畫好圖,畫好分類超平面,在圖上標示出間隔那麼直觀,但每一步推導有理有據,依靠思路的流暢性來推導出目標函數和約束。
接下來介紹的是手工求解的方法了,一種更優的求解方法。
6 拉格朗日對偶(Lagrange ality)
先拋開上面的二次規劃問題,先來看看存在等式約束的極值問題求法,比如下面的最優化問題:
目標函數是f(w),下面是等式約束。通常解法是引入拉格朗日運算元,這里使用 來表示運算元,得到拉格朗日公式為
L是等式約束的個數。
然後分別對w和 求偏導,使得偏導數等於0,然後解出w和 。至於為什麼引入拉格朗日運算元可以求出極值,原因是f(w)的dw變化方向受其他不等式的約束,dw的變化方向與f(w)的梯度垂直時才能獲得極值,而且在極值處,f(w)的梯度與其他等式梯度的線性組合平行,因此他們之間存在線性關系。(參考《最優化與KKT條件》)
然後我們探討有不等式約束的極值問題求法,問題如下:
我們定義一般化的拉格朗日公式
這里的 和 都是拉格朗日運算元。如果按這個公式求解,會出現問題,因為我們求解的是最小值,而這里的 已經不是0了,我們可以將 調整成很大的正值,來使最後的函數結果是負無窮。因此我們需要排除這種情況,我們定義下面的函數:
這里的P代表primal。假設 或者 ,那麼我們總是可以調整 和 來使得 有最大值為正無窮。而只有g和h滿足約束時, 為f(w)。這個函數的精妙之處在於 ,而且求極大值。
因此我們可以寫作
這樣我們原來要求的min f(w)可以轉換成求 了。
我們使用 來表示 。如果直接求解,首先面對的是兩個參數,而 也是不等式約束,然後再在w上求最小值。這個過程不容易做,那麼怎麼辦呢?
我們先考慮另外一個問題
D的意思是對偶, 將問題轉化為先求拉格朗日關於w的最小值,將 和 看作是固定值。之後在 求最大值的話:
這個問題是原問題的對偶問題,相對於原問題只是更換了min和max的順序,而一般更換順序的結果是Max Min(X) <= MinMax(X)。然而在這里兩者相等。用 來表示對偶問題如下:
下面解釋在什麼條件下兩者會等價。假設f和g都是凸函數,h是仿射的(affine, )。並且存在w使得對於所有的i, 。在這種假設下,一定存在 使得 是原問題的解, 是對偶問題的解。還有 另外, 滿足庫恩-塔克條件(Karush-Kuhn-Tucker, KKT condition),該條件如下:
所以如果 滿足了庫恩-塔克條件,那麼他們就是原問題和對偶問題的解。讓我們再次審視公式(5),這個條件稱作是KKT al complementarity條件。這個條件隱含了如果 ,那麼 。也就是說, 時,w處於可行域的邊界上,這時才是起作用的約束。而其他位於可行域內部( 的)點都是不起作用的約束,其 。這個KKT雙重補足條件會用來解釋支持向量和SMO的收斂測試。
這部分內容思路比較凌亂,還需要先研究下《非線性規劃》中的約束極值問題,再回頭看看。KKT的總體思想是將極值會在可行域邊界上取得,也就是不等式為0或等式約束里取得,而最優下降方向一般是這些等式的線性組合,其中每個元素要麼是不等式為0的約束,要麼是等式約束。對於在可行域邊界內的點,對最優解不起作用,因此前面的系數為0。
7 最優間隔分類器(optimal margin classifier)
重新回到SVM的優化問題:
我們將約束條件改寫為:
從KKT條件得知只有函數間隔是1(離超平面最近的點)的線性約束式前面的系數 ,也就是說這些約束式 ,對於其他的不在線上的點( ),極值不會在他們所在的范圍內取得,因此前面的系數 .注意每一個約束式實際就是一個訓練樣本。
看下面的圖:
實線是最大間隔超平面,假設×號的是正例,圓圈的是負例。在虛線上的點就是函數間隔是1的點,那麼他們前面的系數 ,其他點都是 。這三個點稱作支持向量。構造拉格朗日函數如下:
注意到這里只有 沒有 是因為原問題中沒有等式約束,只有不等式約束。
下面我們按照對偶問題的求解步驟來一步步進行,
首先求解 的最小值,對於固定的 , 的最小值只與w和b有關。對w和b分別求偏導數。
並得到
將上式帶回到拉格朗日函數中得到,此時得到的是該函數的最小值(目標函數是凸函數)
代入後,化簡過程如下:
最後得到
由於最後一項是0,因此簡化為
這里我們將向量內積 表示為
此時的拉格朗日函數只包含了變數 。然而我們求出了 才能得到w和b。
接著是極大化的過程 ,
前面提到過對偶問題和原問題滿足的幾個條件,首先由於目標函數和線性約束都是凸函數,而且這里不存在等式約束h。存在w使得對於所有的i, 。因此,一定存在 使得 是原問題的解, 是對偶問題的解。在這里,求 就是求 了。
如果求出了 ,根據 即可求出w(也是 ,原問題的解)。然後
即可求出b。即離超平面最近的正的函數間隔要等於離超平面最近的負的函數間隔。
關於上面的對偶問題如何求解,將留給下一篇中的SMO演算法來闡明。
這里考慮另外一個問題,由於前面求解中得到
我們通篇考慮問題的出發點是 ,根據求解得到的 ,我們代入前式得到
也就是說,以前新來的要分類的樣本首先根據w和b做一次線性運算,然後看求的結果是大於0還是小於0,來判斷正例還是負例。現在有了 ,我們不需要求出w,只需將新來的樣本和訓練數據中的所有樣本做內積和即可。那有人會說,與前面所有的樣本都做運算是不是太耗時了?其實不然,我們從KKT條件中得到,只有支持向量的 ,其他情況 。因此,我們只需求新來的樣本和支持向量的內積,然後運算即可。這種寫法為下面要提到的核函數(kernel)做了很好的鋪墊。這是上篇,先寫這么多了。
7 核函數(Kernels)
考慮我們最初在「線性回歸」中提出的問題,特徵是房子的面積x,這里的x是實數,結果y是房子的價格。假設我們從樣本點的分布中看到x和y符合3次曲線,那麼我們希望使用x的三次多項式來逼近這些樣本點。那麼首先需要將特徵x擴展到三維 ,然後尋找特徵和結果之間的模型。我們將這種特徵變換稱作特徵映射(feature mapping)。映射函數稱作 ,在這個例子中
我們希望將得到的特徵映射後的特徵應用於SVM分類,而不是最初的特徵。這樣,我們需要將前面 公式中的內積從 ,映射到 。
至於為什麼需要映射後的特徵而不是最初的特徵來參與計算,上面提到的(為了更好地擬合)是其中一個原因,另外的一個重要原因是樣例可能存在線性不可分的情況,而將特徵映射到高維空間後,往往就可分了。(在《數據挖掘導論》Pang-Ning Tan等人著的《支持向量機》那一章有個很好的例子說明)
將核函數形式化定義,如果原始特徵內積是 ,映射後為 ,那麼定義核函數(Kernel)為
到這里,我們可以得出結論,如果要實現該節開頭的效果,只需先計算 ,然後計算 即可,然而這種計算方式是非常低效的。比如最初的特徵是n維的,我們將其映射到 維,然後再計算,這樣需要 的時間。那麼我們能不能想辦法減少計算時間呢?
先看一個例子,假設x和z都是n維的,
展開後,得
這個時候發現我們可以只計算原始特徵x和z內積的平方(時間復雜度是O(n)),就等價與計算映射後特徵的內積。也就是說我們不需要花 時間了。
現在看一下映射函數(n=3時),根據上面的公式,得到
也就是說核函數 只能在選擇這樣的 作為映射函數時才能夠等價於映射後特徵的內積。
再看一個核函數
對應的映射函數(n=3時)是
更一般地,核函數 對應的映射後特徵維度為 。(這個我一直沒有理解)。
由於計算的是內積,我們可以想到IR中的餘弦相似度,如果x和z向量夾角越小,那麼核函數值越大,反之,越小。因此,核函數值是 和 的相似度。
再看另外一個核函數
這時,如果x和z很相近( ),那麼核函數值為1,如果x和z相差很大( ),那麼核函數值約等於0。由於這個函數類似於高斯分布,因此稱為高斯核函數,也叫做徑向基函數(Radial Basis Function 簡稱RBF)。它能夠把原始特徵映射到無窮維。
既然高斯核函數能夠比較x和z的相似度,並映射到0到1,回想logistic回歸,sigmoid函數可以,因此還有sigmoid核函數等等。
下面有張圖說明在低維線性不可分時,映射到高維後就可分了,使用高斯核函數。
來自Eric Xing的slides
注意,使用核函數後,怎麼分類新來的樣本呢?線性的時候我們使用SVM學習出w和b,新來樣本x的話,我們使用 來判斷,如果值大於等於1,那麼是正類,小於等於是負類。在兩者之間,認為無法確定。如果使用了核函數後, 就變成了 ,是否先要找到 ,然後再預測?答案肯定不是了,找 很麻煩,回想我們之前說過的
只需將 替換成 ,然後值的判斷同上。
❿ 如何將hog 特徵進行svm matlab
(1)准備訓練樣本集合;包括正樣本集和負樣本集;根據機器學習的基礎知識我們知道,要利用機器學習演算法進行樣本訓練,從而得到一個性能優良的分類器,訓練樣本應該是無限多的,而且訓練樣本應該覆蓋實際應用過程中可能發生的各種情況。(很多朋友,用10來個正樣本,10來
個負樣本進行訓練,之後,就進行測試,發現效果沒有想像中的那麼好,就開始發牢騷,抱怨。。。對於這些人,我只能抱歉的說,對於機器學習、模式識別的認
識,你還處於沒有入門的階段);實際應用過程中,訓練樣本不可能無限多,但無論如何,三五千個正樣本,三五千個負樣本,應該不是什麼難事吧?(如果連這個
都做不到,建議你別搞機器學習,模式識別了;訓練素材都沒有,怎麼讓機器學習到足夠的信息呢?)
(2)收集到足夠的訓練樣本之後,你需要手動裁剪樣本。例如,你想用Hog+SVM來對商業步行街的監控畫面中進行行人檢測,那麼,你就應該用收集到的訓練樣本集合,手動裁剪畫面中的行人(可以寫個簡單程序,只需要滑鼠框選一下,就將框選區域保存下來)。
(3)裁剪得到訓練樣本之後,將所有正樣本放在一個文件夾中;將所有負樣本放在另一個文件夾中;並將所有訓練樣本縮放到同樣的尺寸大小。OpenCV自帶的例子在訓練時,就是將樣本縮放為64*128進行訓練的;
(4)提取所有正樣本的Hog特徵;
(5)提取所有負樣本的Hog特徵;
(6)對所有正負樣本賦予樣本標簽;例如,所有正樣本標記為1,所有負樣本標記為0;
(7)將正負樣本的Hog特徵,正負樣本的標簽,都輸入到SVM中進行訓練;Dalal在論文中考慮到速度問題,建議採用線性SVM進行訓練。這里,不妨也採用線性SVM;
(8)SVM訓練之後,將結果保存為文本文件。
(9)線性SVM進行訓練之後得到的文本文件裡面,有一個數組,叫做support vector,還有一個數組,叫做alpha,有一個浮點數,叫做rho;將alpha矩陣同support vector相乘,注意,alpha*supportVector,將得到一個列向量。之後,再該列向量的最後添加一個元素rho。如此,變得到了一個分類器,利用該分類器,直接替換opencv中行人檢測默認的那個分類器(cv::HOGDescriptor::setSVMDetector()),就可以利用你的訓練樣本訓練出來的分類器進行行人檢測了。