matlab训练器,用matlab兑现感知机学习算法,训练分类器并解决井字游戏

function ganzhiji()

%利用感知机学习算法训练分类器解决tic tac toe游戏问题

%样本数据digitdata2.txt文件中,×是1,o是-1,b是0,positive是1,negative是-1

%样本数据顺序进行了调整,1-250个是第一类,251-500个是第二类

%利用前500个样本训练分类器,剩下458个样本做测试

%digitdata中,×是1,o是2,b是3,positive是1,negative是-1

A = importdata('digitdata2.txt');%导入样本数据为一个958行10列的矩阵

%A = importdata('digitdata.txt');%导入样本数据为一个958行10列的矩阵

%A = importdata('littledata.txt');%少量数据,调试用

% B保存剩下用来测试的样本

for i = 501:958

B(i-500,:) = A(i,:);

end

%将矩阵A的第10列置为1,得到每个样本的增广向量

for i = 1:958

A(i,10) = 1;

end

%disp(A);

%初始化一些参数

w = rand(10,1);%初始权向量,10维列向量

%disp(w);

p = 1;%梯度下降的步长

ox1 = -1;%符号系数,保证代价函数大于0

ox2 = 1;

s = 1;%迭代标志位

n = 0;%迭代次数

w1 = [0 0 0 0 0 0 0 0 0 0]';%10维列向量,临时权向量

%disp(w1);

%迭代过程

while s

J = 0;%代价函数的初值

j = [0 0 0 0 0 0 0 0 0 0]';%用于每次迭代过程中临时累加下降量

%for i = 1:5

for i = 1:250 %第一类样本

if( A(i,:)*w >0 )%x属于第一类且w'x>0,分类正确

w1 = w;%权向量不变

else %分类错误

j = j + ox1 * A(i,:)';%累加下降量

J = J + ox1 * A(i,:) * w;%更新代价函数

end

end

%for i = 6:10

for i = 251:500 %第二类样本

if( A(i,:)*w <0 )%x属于第二类且w'x<0,分类正确

w1 = w;%权向量不变

else %分类错误

j = j + ox2 * A(i,:)';%累加下降量

J = J + ox2 * A(i,:) * w;%更新代价函数

end

end

if J==0 %代价函数为0,即没有错分的样本了

s = 0;%迭代终止

disp('迭代终止');

else

w1 = w - p*j;%得到新的权向量

p = p + 0.1;%增加步长

n = n + 1;

%disp(n);

%disp(J);

end

w = w1;%将临时权向量w1赋值给w

end %while s

disp('迭代次数:');disp(n);%输出迭代次数

disp('权向量:');w%输出权向量

%迭代结束后,w即为所得最优分类面

count = 0;%测试样本分类正确的个数

for i = 501:958

if( A(i,:) * w >0 ) %第一类

B(i-500,11) = 1;

if( B(i-500,10) == 1 ) %分类正确

count = count + 1;

end

else %第二类

B(i-500,11) = -1;

if( B(i-500,10) == -1 ) %分类正确

count = count + 1;

end

end

end

%disp(B);

disp('正确率:');

disp(count/458);%输出正确率

end %function ganzhiji()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值