matlab自带SVM算法例子(附函数详解)

一、程序

SVM理论的学习,见文章:http://blog.csdn.net/ckzhb/article/details/68941695

load fisheriris                                                     %fisheriris  是一个数据集。

X = [meas(:,1), meas(:,2)];                               %提取前两个特征。

Y = nominal(ismember(species,'setosa'));    %只能识别两类,获取Setosa类数据在species中的标记,Y中存储的相应位置的出现或不出现(True or False)。

P = cvpartition(Y,'Holdout',0.20);                     %Y20%作为测试数据,其余为训练数据。

svmStruct =svmtrain(X(P.training,:),Y(P.training),'showplot',true);

C =svmclassify(svmStruct,X(P.test,:),'showplot',true);

errRate = sum(Y(P.test)~=C)/P.TestSize        %统计分类错误率

conMat = confusionmat(Y(P.test),C)                % t计算混淆矩阵

注:

(1)matlab中关于SVM的函数有:svmtrain和svmclassify。

(2)适用于两类问题。多类问题可以参考论文文献。


二、详解

(1)ismember():

[tf index]=ismember(a,b); %判断a中的元素有没有在b中出现。

tf返回一个和a同样大小的矩阵,a的元素在b中出现,tf上的相应位置元素值为1,没有出现则为0;index也是返回一个和a同样大小的矩阵,其相应位置的值为a相应位置的元素在b中出现的第一次标号,若某元素在b中出现多次,则记录的是第一次出现的标号,若该位置上的a的元素没有在b中出现,则返回0.


(2)nominal():

具体见帮助文档。实际上,这里可以不用的。

比较:

Y = ismember(species,'setosa');

svmStruct =svmtrain(X(P.training,:),Y(P.training),'showplot',1);

Y = nominal(ismember(species,'setosa'));

svmStruct =svmtrain(X(P.training,:),Y(P.training),'showplot',true);

结果:

两者分类识别对象不同,一个是“1”,另一个是“true”,最终影响的只是plot中的标签。





(3) C = cvpartition(N,'HoldOut',P):

数据分类,取N乘P为测试集,其余为训练集,进行交叉验证

所谓交叉验证,即例如10折交叉验证(10-fold cross validation),将数据集分成十份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计。

Holdout 验证并非一种交叉验证,因为数据并没有交叉使用。 随机从最初的样本中选出部分,形成交叉验证数据,而剩余的就当做训练数据。

cvpartition properties:

TestSize:测试集的大小。这里是30。(150*20%=30)

cvpartition methods:

test:交叉验证分区的测试集。返回一个逻辑向量。

training:交叉验证分区的训练集。返回一个逻辑向量。

详细:P.training是150x1 logical,而且P.test也是150x1logical,两者逻辑相反。即P.training中有120行是逻辑1,30个是逻辑0。P.test与之相反。

则X(P.training,:)——将X中选出的训练集挑选出来。120行2列。

 

(4)SVMSTRUCT = svmtrain(TRAINING, Y,'PARAM1',val1, 'PARAM2',val2, ...)

TRAINING:预测数据。行表示数据个数,列表示特征的个数。

Y:针对TRAINING的数据的类别。即已知的类别。

TRAINING和Y的行数必须一致,每一行代表一组数据及其结果。(这与matlab中BP算法程序正好相反)。

'PARAM1',val1, 'PARAM2',val2, ... :具体可见帮助文档。

这里使用参数'showplot':A logical value specifying whether or not to show a plot. When thevalue is true, svmtrain creates a plot of the grouped data and the separatingline for the classifier, when using data with 2 features (columns). Default isfalse.

注意:The display option can only plot 2D training data.所以前面X只提取两个特征。


(5)svmclassify(SVMSTRUCT, TEST)

C =svmclassify(svmStruct,X(P.test,:),'showplot',true);

使用之前的训练数据训练出来的支持向量机,对测试数据进行分类。要求TEST的列数与前面训练支持向量机的数据的列数一致。


(6)~= 是 “不等于”的意思。

如a ~= b 判断a和b是否不等,若不等,值为1

Y(P.test)表示测试集的实际分类结果;C表示测试集经支持向量机分类后的结果。


(7)混淆矩阵

它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。

混淆即一个class被预测成另一个class,对两类问题,显然是一个2X2矩阵。









支持向量机(SVM)是一种常用的分类和回归算法,其在机器学习领域具有广泛的应用。在MATLAB中,可以使用SVM函数构建一个简单的SVM分类模型。 首先,我们需要准备训练数据和对应的标签。假设我们有一个二维的训练数据集X和对应的标签y。我们可以使用rand函数生成一组随机数据作为例子: ``` X = rand(100, 2); % 生成100个随机二维数据点 y = randi([0, 1], 100, 1); % 随机生成100个0/1标签 ``` 接下来,我们可以使用svmtrain函数训练SVM模型: ``` model = svmtrain(X, y); ``` 第一个参数X是训练数据,第二个参数y是对应的标签。训练过程会根据数据和标签自动选择合适的内核类型和参数。 训练完成后,我们可以使用svmpredict函数对新样本进行预测: ``` X_test = rand(10, 2); % 生成10个新的随机二维数据点 [predict_label, accuracy, decision_values] = svmpredict(zeros(10, 1), X_test, model); ``` 第一个参数是预测结果的标签向量(在这个例子中我们设为全0向量),第二个参数是待预测的新样本数据,第三个参数是之前训练得到的模型。预测结果存储在predict_label中,accuracy表示预测的准确率,decision_values是每个样本的分类结果。 除了二分类,SVM也可以用于多分类问题。在MATLAB中,可以使用multisvm函数训练一个多类别的SVM模型。 以上就是使用MATLAB简单实现SVM算法的示例。当然,SVM还有很多参数可以调整和功能可以扩展,可以根据具体的问题和需求进行进一步学习和实践。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值