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不具有伸缩不变性,所以如果样本各个特征分布范围不一致的话,使用这样的数据集训练出来的模型性能会很差,分类正确率会很低。
不管训练什么机器学习模型,最好都先对数据集进行归一化,这是因为,归一化不仅可以提高模型正确率(针对不具有伸缩不变性的机器学习算法),还可以加快模型收敛,提升训练速度。