机器学习-支持向量机-解决兵王问题(附matlab程序)

机器学习-⽀持向量机-解决兵王问题(附matlab程序)
⼀、前提tamall
本⽂内容是在学习浙江⼤学胡浩基“机器学习-⽀持向量机”视频过程中整理出来的,具体可以观看。
最终使⽤matlab程序解决了兵王问题。
⼆、兵王问题
国际象棋的兵王问题:棋盘上⿊⽅只剩⼀个王,⽩⽅剩⼀个王 ⼀个兵,棋局只有两个结果:“⽩⽅将死⿊⽅获胜”或者“和棋”,这个问题属于⼆分类的问题。这⾥要利⽤⽀持向量机解决这个问题,实现在不告诉计算机国际象棋规则的前提下,让计算机可以根据棋⼦位置判断棋局的结果。
三、数据
⽤到的数据集为,检索关键词为Chess (King-Rook vs. King),,点进去之后可看到krkopt.data。
数据集⼀共包含28056个数据,具体内容解释如下图所⽰,数据集中⼀共有2796个“和棋”样本(正样本),25260个“⽩⽅胜”样本(负样本)。
四、LIBSVM⼯具包
LibSVM是⽀持向量机的⼯具包,当前版本3.25,
matlab安装LibSVM,⽹上有很多教程,可以参考
五、程序设计
1. 随机取5000个样本进⾏训练,其余的样本进⾏测试;
2. 对所有样本进⾏归⼀化操作;
3. 设置⽀持向量机的各种参数,;
(1)“-s”参数:表⽰SVM的不同形式,根据⽬标函数进⾏选择,这⾥选择0;
(2)“-t”参数:表⽰⽀持向量机的核函数K(X1,X2),
   0:表⽰线性内核(linear),该内核的计算结果 与 不使⽤核函数结果⼀致,张少川
   1:表⽰多项式内核(ploy),复杂度可以调节,指数d越⼤,映射维度也越⾼,
   2:表⽰⾼斯径向积内核(rbf核),σ是⼈为设置的超参数,映射函数的维度是⽆限的,实际中最常⽤,
   3:表⽰sigmoid内核(tanh),β和B是⼈为设置的超参数,映射函数的维度也是⽆限的,
   4:表⽰⾃定义内核,需要知道矩阵K;
(3)“-c”参数cValue:原问题中的C或对偶问题限制条件中的C;
(4)“-g”参数gammaValue:与核函数相对应,不同的核函数g的设定都不⼀样。
六、Matlab程序
经测试,视频中的程序不能正确运⾏,研究代码后发现,问题主要出现在数据读取和预处理过程中,我在源程序的基础上进⾏了修改,并加上了⼀些备注。修改后程序顺利运⾏,共⽤时295秒。需要的⼤家可以测试⼀下,有问题评论交流。
备注:我使⽤的是matlab 2016a;测试集来⾃UCI Machine Learning Repository;LibSVM⼯具箱为3.24版本。
具体代码如下:
clear all;
% Read the data.
fid  =fopen('krkopt.DATA');
%c =fread(fid,3);%这⾏注释掉
vec =zeros(6,1);
xapp =[];%⽤来存放棋⼦的位置
yapp =[];%⽤来存放棋局结果
while~feof(fid)%检测流上的⽂件结束符,如果⽂件结束,则返回⾮0值,否则返回0
string=[];%⽤来存放每次读取的⼀⾏六个数据
c =fread(fid,1);%每次读取⼀个字节的数据
%flag = flag+1;%可以注释掉,没发挥作⽤
while c~=10%每⾏读取结束后,最后⼀个字节数据为10
string=[string, c];%将读取到的数据保存到string[]中
c=fread(fid,1);%继续读取下⼀个字节的数据
end;
%fread(fid,1);%这⾏注释掉
if length(string)>10
vec(1)=string(1)-96;%以下六⾏是棋⼦坐标数据的转换,具体可以看ascii码对照表,
政如农工
vec(2)=string(3)-48;
vec(3)=string(5)-96;
vec(4)=string(7)-48;
vec(5)=string(9)-96;
vec(6)=string(11)-48;
xapp =[xapp,vec];%将转换后的数据存⼊xapp[]
if string(13)==100%判断每⾏最后⼀个单词⾸字母是否为⼩写的d,是则标记为1,否则标记为-1
yapp =[yapp,1];
else
yapp =[yapp,-1];
yapp =[yapp,-1];
end;
end;
end;
fclose(fid);
[N,M]=size(xapp);
p =randperm(M);%打乱训练样本福建财会管理干部学院
numberOfSamplesForTraining =5000;
xTraining =[];
yTraining =[];
for i=1:numberOfSamplesForTraining          %获得训练集
江新蓉
xTraining  =[xTraining,xapp(:,p(i))];
yTraining =[yTraining,yapp(p(i))];
end;
xTraining = xTraining';
yTraining = yTraining';
xTesting =[];
yTesting =[];
for i=numberOfSamplesForTraining+1:M        %获得测试集
xTesting  =[xTesting,xapp(:,p(i))];
yTesting =[yTesting,yapp(p(i))];
end;
xTesting = xTesting';
yTesting = yTesting';
%%%%%%%%%%%%%%%%%%%%%%%%
%Normalization归⼀化
[numVec,numDim]=size(xTraining);
avgX =mean(xTraining);%求均值
stdX =std(xTraining);%QQ⽅差
for i =1:numVec                            %训练集归⼀化:每个样本都减掉均值再除以⽅差
xTraining(i,:)=(xTraining(i,:)-avgX)./stdX;
end;
[numVec,numDim]=size(xTesting);
for i =1:numVec                            %测试集归⼀化
xTesting(i,:)=(xTesting(i,:)-avgX)./stdX;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%SVM Gaussian kernel ⾼斯径向积内核
%Search for the optimal C and gamma,K(x1,x2)= exp{-||x1-x2||^2/gamma} to
%make the recognition rate maximum.
%⾸先需要对C和Gamma两个参数的取值进⾏初步搜索,c的取值范围是:2^-5--2^15,gamma的取值范围:2^-15--2^3,该范围是基于⼈⼯的经验;%对数据进⾏交叉验证,初步出识别率最⾼的c与gamma的组合
CScale =[-5,-3,-1,1,3,5,7,9,11,13,15];
gammaScale =[-15,-13,-11,-9,-7,-5,-3,-1,1,3];
C =2.^CScale;
gamma =2.^gammaScale;
maxRecognitionRate =0;
for i =1:length(C)
for j =1:length(gamma)
cmd=['-t 2 -c ',num2str(C(i)),' -g ',num2str(gamma(j)),' -v 5'];%设置⽀持向量机的参数
recognitionRate =svmtrain(yTraining,xTraining,cmd);
if recognitionRate>maxRecognitionRate
maxRecognitionRate = recognitionRate
maxCIndex = i;
maxGammaIndex = j;
end;
end;
end;
%进⼀步缩⼩搜索范围,再次进⾏交叉验证,出识别率最⾼的更精确的c与gamma的组合
n =10;
n =10;
minCScale =0.5*(CScale(max(1,maxCIndex-1))+CScale(maxCIndex));
maxCScale =0.5*(CScale(min(length(CScale),maxCIndex+1))+CScale(maxCIndex));
newCScale =[minCScale:(maxCScale-minCScale)/n:maxCScale];
minGammaScale =0.5*(gammaScale(max(1,maxGammaIndex-1))+gammaScale(maxGammaIndex)); maxGammaScale =0.5*(gammaScale(min(length(gammaScale),maxGammaIndex+1))+gammaScale(maxGammaIndex)); n
ewGammaScale =[minGammaScale:(maxGammaScale-minGammaScale)/n:maxGammaScale];
newC =2.^newCScale;
newGamma =2.^newGammaScale;
maxRecognitionRate =0;
for i =1:length(newC)
for j =1:length(newGamma)
cmd=['-t 2 -c ',num2str(newC(i)),' -g ',num2str(newGamma(j)),' -v 5'];%设置⽀持向量机的参数
recognitionRate =svmtrain(yTraining,xTraining,cmd);
if recognitionRate>maxRecognitionRate
maxRecognitionRate = recognitionRate
maxC =newC(i);
maxGamma =newGamma(j);
end;
end;
end;
%Train the SVM model by the optimal C and gamma.
%使⽤最优的c与gamma的组合训练数据,保存结果
cmd=['-t 2 -c ',num2str(maxC),' -g ',num2str(maxGamma)];
model =svmtrain(yTraining,xTraining,cmd);
save model.mat model;%存储最终训练好的模型
save xTesting.mat xTesting;
save yTesting.mat yTesting;
新疆出血热% test the model on the remaining testing data and obtain the recognition rate.
%加载训练结果并进⾏测试,保存结果
load model.mat;
[yPred,accuracy,decisionValues]=svmpredict(yTesting,xTesting,model);
save yPred.mat yPred;
save decisionValues.mat decisionValues;

本文发布于:2024-09-22 05:23:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/569956.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   问题   向量
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议