感知器算法
版权声明:本文为博主原创文章,未经博主允许不得转载。
引例:判断一个人是否长得帅??? 有如下feature: 身高,体重,三围,颜值,学习成绩(帅的人学习成绩好的少...为何要这么一个扯淡的特征下面会讲解)等等。
假设有一个标准:每一个评分项给予多少分的权重,当所有feature与权重相乘的和大于某一个值的时候,那这个人就是帅哥!!
例子: 180*5+150*3+....>1000 帅哥! 小于则.....
感知器任务:通过已知的实例调节权重,使其能够预测出未知实例的结果。
符号表示:
if (w1*x1+w2*x2+.......>b) return true
else return false
由于b是常数,我们可以将b表示为-w0×X0,则可以表示为
if (w1*x1+w2*x2+.......+w0×x0>0) return true
else return false
训练方法:
当预测值等于我们期待的结果时: 什么也不用做
但当其小于的时候,说明我们增加的权值小了,赢补上一个正数数 例如所有xi××2的和数学表达推导如下:
w1*x1+a*x1*x1+w2*x2+a*x2*x2+...... 住:a为学习速率因子,会影响学习速率
w的更新值相当于wi=wi+a×xi
当其大于时候应改为减号,归结起来应为如下表达式:wi=wi+a*(y-h(x))*xi
伪代码表示:
- while(循环结束条件) {#此处可设为让样本循环执行多少次
- delta_w[ ]={0};
- for(每个样本){
- for(每个特征 i){
- delta_w[i]+=a*(y-h(x))*wi;
- }
- }
- for(每个特征 i){
- 更新w权值
- wi+=dealta_w[i]
- }
- }
问题:
1.迭代的停止条件是什么?
答:自己定,可以是某个验证集取得理想结果的时候,或是向上述例子,单纯是循环多少次
2.当训练时候遇到正确样本会发生什么?
答:什么也不发生,当预测结果正确时候,就假定是最好感知器
3.每次迭代调整w或是所有样本迭代完全后调整w(上例)有区别么?
答:区别不大,也许w权值会有所变化,但实际效果没多大区别。
4.某轮迭代后结果一定变好么?
答:不一定,但总体趋势是变好的!
5.a的作用和取值问题
答:作用是控制学习速率,一般选0-1之间,过大不能学习到最优值,过小没有什么变化~~
C语言实现代码如下:
- //此为预测函数
- //注:此处x0皆为1,至少需要是一个定值
- int predict(double x[ ] ,double w[ ],int feature){
- int sum=0;
- for(int i=0;i<feature;i++){
- sum+=w[i]*x[i];
- }
- if(sum>0) return 1;
- else return 0;
- }
- //此为调参函数
- void train(double train_set[ ][ ],int y[ ],double w[ ],int feature_num,int sample_num,int a,int iterator_num){
- while(iterator_num--){
- double* dw=new double[feature_num];
- for(int i=0;i<sample_num;i++){
- for(int j=0;j<feature_num;j++){
- dw[j]+=a*(y-predict(train_set[i]))*train_set[i][j];
- }
- }
- }
- for(int j=0,j<feature_num;j++){
- w[j]+=dw[j];
- }
- }
优化方法:找出训练后结果最好的一组w
由一个计数器,吧每次最好的记录即可!
缺点:只能解决线性可分问题
通过升维度来解决!但是并不一定能取得很好效果,如增加学习成绩这种特征...
更好的解决方法以后再讨论!