svm的參數優化如何更好的提升分類器的性能
A. 為什麼svm參數優化後准確率反而下降
遺傳演算法,差分進化,粒子群,蟻群,模擬退火,人工魚群,蜂群,果蠅優化等都可以優化svm參數
B. SVM演算法,包括演算法原理、演算法實現、核函數參數的選取、優化、系數調整,能通俗地說明下嗎謝謝
SVM 原理,在一個超空間找一個 切分的超平面,
SVM 演算法實現,主要是解決SVM公式對偶問題,常用的是SMO,
SVM 核參數,隱含的將特徵映射到高維空間,有興趣可學習 learn with kernel.
SVM 參數調整分兩部分,1 參數調整,用上述SMO演算法,2 模型選擇。
太累,不想寫太多
C. PSO優化SVM參數的問題
Elapsed time is 64.799304 seconds.
bestc =
45.3915
bestg =
0.0100
bestCVaccuarcy =
97.7528
Accuracy = 97.7528% (87/89) (classification)
trainacc =
97.7528
0.0225
0.9633
Accuracy = 93.2584% (83/89) (classification)
testacc =
93.2584
0.0674
0.9007
代碼:
%% 清空環境
clc
clear
load wine;
train = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];
train_label = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];
test = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];
test_label = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];
[train,pstrain] = mapminmax(train');
pstrain.ymin = 0;
pstrain.ymax = 1;
[train,pstrain] = mapminmax(train,pstrain);
[test,pstest] = mapminmax(test');
pstest.ymin = 0;
pstest.ymax = 1;
[test,pstest] = mapminmax(test,pstest);
train = train';
test = test';
%% 參數初始化
%粒子群演算法中的兩個參數
c1 = 1.6; % c1 belongs to [0,2]
c2 = 1.5; % c2 belongs to [0,2]
maxgen=300; % 進化次數
sizepop=30; % 種群規模
popcmax=10^(2);
popcmin=10^(-1);
popgmax=10^(3);
popgmin=10^(-2);
k = 0.6; % k belongs to [0.1,1.0];
Vcmax = k*popcmax;
Vcmin = -Vcmax ;
Vgmax = k*popgmax;
Vgmin = -Vgmax ;
% SVM參數初始化
v = 3;
%% 產生初始粒子和速度
for i=1:sizepop
% 隨機產生種群
pop(i,1) = (popcmax-popcmin)*rand+popcmin; % 初始種群
pop(i,2) = (popgmax-popgmin)*rand+popgmin;
V(i,1)=Vcmax*rands(1); % 初始化速度
V(i,2)=Vgmax*rands(1);
% 計算初始適應度
cmd = ['-v ',num2str(v),' -c ',num2str( pop(i,1) ),' -g ',num2str( pop(i,2) )];
fitness(i) = svmtrain(train_label, train, cmd);
fitness(i) = -fitness(i);
end
% 找極值和極值點
[global_fitness bestindex]=min(fitness); % 全局極值
local_fitness=fitness; % 個體極值初始化
global_x=pop(bestindex,:); % 全局極值點
local_x=pop; % 個體極值點初始化
tic
%% 迭代尋優
for i=1:maxgen
for j=1:sizepop
%速度更新
wV = 0.9; % wV best belongs to [0.8,1.2]
V(j,:) = wV*V(j,:) + c1*rand*(local_x(j,:) - pop(j,:)) + c2*rand*(global_x - pop(j,:));
if V(j,1) > Vcmax
V(j,1) = Vcmax;
end
if V(j,1) < Vcmin
V(j,1) = Vcmin;
end
if V(j,2) > Vgmax
V(j,2) = Vgmax;
end
if V(j,2) < Vgmin
V(j,2) = Vgmin;
end
%種群更新
wP = 0.6;
pop(j,:)=pop(j,:)+wP*V(j,:);
if pop(j,1) > popcmax
pop(j,1) = popcmax;
end
if pop(j,1) < popcmin
pop(j,1) = popcmin;
end
if pop(j,2) > popgmax
pop(j,2) = popgmax;
end
if pop(j,2) < popgmin
pop(j,2) = popgmin;
end
% 自適應粒子變異
if rand>0.5
k=ceil(2*rand);
if k == 1
pop(j,k) = (20-1)*rand+1;
end
if k == 2
pop(j,k) = (popgmax-popgmin)*rand+popgmin;
end
end
%適應度值
cmd = ['-v ',num2str(v),' -c ',num2str( pop(j,1) ),' -g ',num2str( pop(j,2) )];
fitness(j) = svmtrain(train_label, train, cmd);
fitness(j) = -fitness(j);
end
%個體最優更新
if fitness(j) < local_fitness(j)
local_x(j,:) = pop(j,:);
local_fitness(j) = fitness(j);
end
%群體最優更新
if fitness(j) < global_fitness
global_x = pop(j,:);
global_fitness = fitness(j);
end
fit_gen(i)=global_fitness;
end
toc
%% 結果分析
plot(-fit_gen,'LineWidth',5);
title(['適應度曲線','(參數c1=',num2str(c1),',c2=',num2str(c2),',終止代數=',num2str(maxgen),')'],'FontSize',13);
xlabel('進化代數');ylabel('適應度');
bestc = global_x(1)
bestg = global_x(2)
bestCVaccuarcy = -fit_gen(maxgen)
cmd = ['-c ',num2str( bestc ),' -g ',num2str( bestg )];
model = svmtrain(train_label,train,cmd);
[trainpre,trainacc] = svmpredict(train_label,train,model);
trainacc
[testpre,testacc] = svmpredict(test_label,test,model);
testacc
D. svm的多分類讀數據的方式和二分類一樣么,怎麼訓練啊,正確率好低
我最近也在用SVM做多分類,能不能交流一下呢?
E. 如何改進SVM演算法,最好是自己的改進方法,別引用那些前人改進的演算法
樓主對於這種問題的答案完全可以上SCI了,知道答案的人都在寫論文中,所以我可以給幾個改進方向給你提示一下:
1 SVM是分類器對於它的准確性還有過擬合性都有很成熟的改進,所以採用數學方法來改進感覺很難了,但是它的應用很廣泛 SVMRank貌似就是netflix電影推薦系統的核心演算法,你可以了解下
2 與其他演算法的聯合,boosting是一種集成演算法,你可以考慮SVM作為一種弱學習器在其框架中提升學習的准確率
SVM的本身演算法真有好的改進完全可以在最高等級雜志上發論文,我上面說的兩個方面雖然很簡單但如果你有實驗數據證明,在國內發表核心期刊完全沒問題,本人也在論文糾結中。。
F. 怎麼樣證明svm的分類效果比人工分類更優
理解SVM,咱們必須先弄清楚一個概念:線性分類器。
給定一些數據點,它們分別屬於兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。如果用x表示數據點,用y表示類別(y可以取1或者-1,分別代表兩個不同的類),一個線性分類器的學習目標便是要在n維的數據空間中找到一個超平面(hyper plane),這個超平面的方程可以表示為( wT中的T代表轉置)
G. 增加數據會使svm演算法分類效果更好嗎
數據倉庫,資料庫或者其它信息庫中隱藏著許多可以為商業、科研等活動的決策提供所需要的知識。分類與預測是兩種數據分析形式,它們可以用來抽取能夠描述重要數據集合或預測未來數據趨勢的模型。分類方法(Classification)用於預測數據對象的離散類別(Categorical Label);預測方法(Prediction )用於預測數據對象的連續取值。
分類技術在很多領域都有應用,例如可以通過客戶分類構造一個分類模型來對銀行貸款進行風險評估;當前的市場營銷中很重要的一個特點是強調客戶細分。客戶類別分析的功能也在於此,採用數據挖掘中的分類技術,可以將客戶分成不同的類別,比如呼叫中心設計時可以分為:呼叫頻繁的客戶、偶然大量呼叫的客戶、穩定呼叫的客戶、其他,幫助呼叫中心尋找出這些不同種類客戶之間的特徵,這樣的分類模型可以讓用戶了解不同行為類別客戶的分布特徵;其他分類應用如文獻檢索和搜索引擎中的自動文本分類技術;安全領域有基於分類技術的入侵檢測等等。機器學習、專家系統、統計學和神經網路等領域的研究人員已經提出了許多具體的分類預測方法。下面對分類流程作個簡要描述:
訓練:訓練集——>特徵選取——>訓練——>分類器
分類:新樣本——>特徵選取——>分類——>判決
最初的數據挖掘分類應用大多都是在這些方法及基於內存基礎上所構造的演算法。目前數據挖掘方法都要求具有基於外存以處理大規模數據集合能力且具有可擴展能力。下面對幾種主要的分類方法做個簡要介紹:
(1)決策樹
決策樹歸納是經典的分類演算法。它採用自頂向下遞歸的各個擊破方式構造決策樹。樹的每一個結點上使用信息增益度量選擇測試屬性。可以從生成的決策樹中提取規則。
(2) KNN法(K-Nearest Neighbor)
KNN法即K最近鄰法,最初由Cover和Hart於1968年提出的,是一個理論上比較成熟的方法。該方法的思路非常簡單直觀:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。因此,採用這種方法可以較好地避免樣本的不平衡問題。另外,由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
該方法的不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。另外還有一種Reverse KNN法,能降低KNN演算法的計算復雜度,提高分類的效率。
該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
(3) SVM法SVM法即支持向量機(Support Vector Machine)法,由Vapnik等人於1995年提出,具有相對優良的性能指標。該方法是建立在統計學習理論基礎上的機器學習方法。通過學習演算法,SVM可以自動尋找出那些對分類有較好區分能力的支持向量,由此構造出的分類器可以最大化類與類的間隔,因而有較好的適應能力和較高的分准率。該方法只需要由各類域的邊界樣本的類別來決定最後的分類結果。
支持向量機演算法的目的在於尋找一個超平面H(d),該超平面可以將訓練集中的數據分開,且與類域邊界的沿垂直於該超平面方向的距離最大,故SVM法亦被稱為最大邊緣(maximum margin)演算法。待分樣本集中的大部分樣本不是支持向量,移去或者減少這些樣本對分類結果沒有影響,SVM法對小樣本情況下的自動分類有著較好的分類結果。
(4) VSM法VSM法即向量空間模型(Vector Space Model)法,由Salton等人於60年代末提出。這是最早也是最出名的信息檢索方面的數學模型。其基本思想是將文檔表示為加權的特徵向量:D=D(T1,W1;T2,W2;…;Tn,Wn),然後通過計算文本相似度的方法來確定待分樣本的類別。當文本被表示為空間向量模型的時候,文本的相似度就可以藉助特徵向量之間的內積來表示。
在實際應用中,VSM法一般事先依據語料庫中的訓練樣本和分類體系建立類別向量空間。當需要對一篇待分樣本進行分類的時候,只需要計算待分樣本和每一個類別向量的相似度即內積,然後選取相似度最大的類別作為該待分樣本所對應的類別。
由於VSM法中需要事先計算類別的空間向量,而該空間向量的建立又很大程度的依賴於該類別向量中所包含的特徵項。根據研究發現,類別中所包含的非零特徵項越多,其包含的每個特徵項對於類別的表達能力越弱。因此,VSM法相對其他分類方法而言,更適合於專業文獻的分類。
(5) Bayes法
Bayes法是一種在已知先驗概率與類條件概率的情況下的模式分類方法,待分樣本的分類結果取決於各類域中樣本的全體。
設訓練樣本集分為M類,記為C={c1,…,ci,…cM},每類的先驗概率為P(ci),i=1,2,…,M。當樣本集非常大時,可以認為P(ci)=ci類樣本數/總樣本數。對於一個待分樣本X,其歸於cj類的類條件概率是P(X/ci),則根據Bayes定理,可得到cj類的後驗概率P(ci/X):
P(ci/x)=P(x/ci)·P(ci)/P(x)(1)
若P(ci/X)=MaxjP(cj/X),i=1,2,…,M,j=1,2,…,M,則有x∈ci(2)
式(2)是最大後驗概率判決准則,將式(1)代入式(2),則有:
若P(x/ci)P(ci)=Maxj〔P(x/cj)P(cj)〕,i=1,2,…,M,j=1,2,…,M,則x∈ci
這就是常用到的Bayes分類判決准則。經過長期的研究,Bayes分類方法在理論上論證得比較充分,在應用上也是非常廣泛的。
Bayes方法的薄弱環節在於實際情況下,類別總體的概率分布和各類樣本的概率分布函數(或密度函數)常常是不知道的。為了獲得它們,就要求樣本足夠大。另外,Bayes法要求表達文本的主題詞相互獨立,這樣的條件在實際文本中一般很難滿足,因此該方法往往在效果上難以達到理論上的最大值。
神經網路分類演算法的重點是構造閾值邏輯單元,一個值邏輯單元是一個對象,它可以輸入一組加權系數的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。如有輸入值X1, X2, , Xn 和它們的權系數:W1, W2, , Wn,求和計算出的 Xi*Wi ,產生了激發層 a = (X1 * W1)+(X2 * W2)++(Xi * Wi)++ (Xn * Wn),其中Xi 是各條記錄出現頻率或其他參數,Wi是實時特徵評估模型中得到的權系數。神經網路是基於經驗風險最小化原則的學習演算法,有一些固有的缺陷,比如層數和神經元個數難以確定,容易陷入局部極小,還有過學習現象,這些本身的缺陷在SVM演算法中可以得到很好的解決。
H. 如何用遺傳演算法優化svm的參數
將下屬兩個目標函數分別保存在兩個m文件中 function f1=func1(x) %第一目標函數 f1=x(:,1).*x(:,1)./4+x(:,2).*x(:,2)./4; function f2=func2(x) %第二目標函數 f2=x(:,1).*(1-x(:,2))+10; function GA() clear;clc;close all NIND=100; %個體數...
I. 如何提高SVM分類准確率
請指點!leoluodo(站內聯系TA)根據你使用的核函數不同進行調整。tangmnt(站內回聯系答TA)能否請leoluodo詳細解釋一下?eric2000(站內聯系TA)先測試 樣本特徵集的 可分性 再考慮,做一下可視化分析flybird_fish(站內聯系TA)壇子里應該有很多蟲子用過SVM,但是你的問題問得實在模糊,不知道該怎麼解釋給你聽。當然可以修改參數提高識別率,但是不知道你用的什麼樣的核函數,程序參數是什麼sunway1988(站內聯系TA)我的畢業設計就是做的人臉表情識別,當時識別的准確率也很低,30%左右,不過happiness的識別准確度很高,高達90%。但是,當時由於時間比較緊,就沒有繼續進行完善。不過,要想提高識別准確率,修改SVM參數是其一,但是我用參數尋優找到最優的參數進行分類,效果並沒有得到改善。所以,這種情況,我想要提高識別准確率,就應該在特徵提取上進一步優化,使提取的特徵經降維以後具有更大的區分度,這樣進行SVM分類才能得到更好的效果。
J. 用svm二分類的時候不論參數怎麼變,分類結果都不變,什麼原因
你有沒有做數據的預處理,對數據集進行歸一化了嗎?
SVM不具有伸縮不變性,所以如果樣本各個特徵分布范圍不一致的話,使用這樣的數據集訓練出來的模型性能會很差,分類正確率會很低。
不管訓練什麼機器學習模型,最好都先對數據集進行歸一化,這是因為,歸一化不僅可以提高模型正確率(針對不具有伸縮不變性的機器學習演算法),還可以加快模型收斂,提升訓練速度。