用matlab实现感知机学习算法,训练分类器并解决井字游戏
来源:互联网 发布:下载淘宝网2016版 编辑:程序博客网 时间:2024/06/05 05:48
问题描述:
附件中包含的数据是传统游戏过三关(tic-tac-toe)的900余种棋局, 目的是要通过统计学习的方法让机器自动判别出胜负。数据文件中, 玩家是'x',对手是'o',每行数据包含3*3九宫格的布局情况('x'代表玩家棋子的位置, 'o'代表对手棋子的位置, 'b'代表空格), 'positive'代表玩家赢, 'negative代表玩家负。整个问题可以看做是一个输入特征为9维的二分类问题。
样本数据digitdata2.txt文件中,×是1,o是-1,b是0,positive是1,negative是-1。
1-250个是第一类,251-500个是第二类,利用前500个样本训练分类器,剩下458个样本做测试
(1)权向量设为w,初始值随机生成,满足:
(2)代价函数为J(w):
其中,δ是符号系数,x为第一类时δ是-1,x为第二类时δ是1,以保证代价函数为正。Y是分错类的样本的集合。
(3)利用梯度下降进行迭代:
化简后是:
其中ρ是每次下降的步长
(4)不断更新权向量w值,同时计算代价函数J(w),直到代价函数值为0,迭代结束。
此时的权向量w即为所求。利用w和测试样本x相乘,结果为正属第一类,结果为负属第二类。
由于随机初始化的权向量w不同,各次运行结果有所不同。
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()
matlab源文件及样本数据下载:http://download.csdn.net/detail/masikkk/4747593
from: http://blog.csdn.net/masibuaa/article/details/8163750
0 0
- 用matlab实现感知机学习算法,训练分类器并解决井字游戏
- 用matlab实现感知机学习算法,训练分类器并解决井字游戏
- matlab实现感知器学习算法
- 基于简单感知器分类算法(matlab实现)
- 感知器算法----Matlab实现
- matlab实现简单的感知器分类
- 感知机算法的matlab实现
- 感知器分类算法
- 感知机学习算法实现
- 感知机学习算法实现
- matlab训练分类器
- 感知机分类学习
- 神经网络 感知器训练算法
- 机器学习算法(分类算法)—Rosenblatt感知机
- 连续多输出感知器训练算法的实现
- 感知器数据分类算法
- 感知机(perceptron)算法与MATLAB实现
- Fisher线性判别与感知器算法Matlab实现
- 三言两语说shader(九)钻石
- %s与%c
- 数组作数据成员-工资类。
- 错误解决-----java was started but returned exit code=13
- crontab 日志
- 用matlab实现感知机学习算法,训练分类器并解决井字游戏
- 通过日期查看星期
- 直方图均衡(Histogram Equalization)
- 【DFS/DP】HDU1501Zipper
- JS原型详解
- iOS之调用系统自带语音功能
- 机器学习10大经典算法
- hdu 5667 sequence
- 第7周项目1-成员函数、友元函数和一般函数有区别(3)