感知器(perceptron) 是比较简单的二分类器,通过对训练样本集的学习,从而得到判别函数权值的解,产生线性可分的样本判别函数。该算法属于非参数算法,优点是不需要对各类样本的统计性质作任何假设,属于确定性方法。
下面是算法步骤:
步骤1:初始化。设置权重w1, w2,…, wn和阈值sita的初值。初始权重可以随意赋值,取值范围通常为[-0.5, 0.5],然后通过训练样本调整
步骤2:激活。通过用输入x1( p), x2( p),…,xn ( p)以及期望输出Yd( p)来激活感知器。迭代p时的实际输出为
步骤3:权重训练。修改感知器的权重为:
wi(p+1)= wi( p)+ wi( p)
其中wi( p)=xi( p)*e( p)
步骤4:迭代。迭代p加1,回到步骤2,重复以上过程直至收敛
给出本例训练用例:
本例测试用例:
下面给出代码
public class perception {
static double sita,a; //阈值 学习率
static double[] w,red,diameter,weight;//鲜红值 直径 质量
static int[] type; //0樱桃1车厘子
public static void main(String[] args) {
int y=0,e=0;//输出 输出误差
init();//初始化
for(int k=0;k<2000;k++) {//下面是训练过程
for(int i=0;i<8;i++) {
y=w[0]*red[i]+w[1]*diameter[i]+w[2]*weight[i]>sita?1:0;
e=type[i]-y;
w[0]+=a*red[i]*e;
w[1]+=a*diameter[i]*e;
w[2]+=a*weight[i]*e;
}
//System.out.println(w[0]+" "+w[1]+" "+w[2]);
}
test();//测试
}
public static void init() {
sita=10;
a=0.1;
w=new double[]{0,0,0};
red=new double[] {0.81,0.82,0.78,0.79,0.56,0.58,0.59,0.57};
diameter=new double[] {1.02,0.98,0.99,1.01,0.85,0.86,0.83,0.84};
weight=new double[] {8.85,8.67,8.75,8.80,7.32,7.33,7.29,7.31};
type=new int[] {1,1,1,1,0,0,0,0};//0樱桃1车厘子
}
public static void test() {
double[] test1= {0.60,0.8,7.45};//测试用例1
double test=test1[0]*w[0]+test1[1]*w[1]+test1[2]*w[2];
System.out.println("适应值"+test);
if(test>sita) {
System.out.println("车厘子");
}else {
System.out.println("樱桃");
}
double[] test2= {0.76,1.00,8.78};//测试用例2
test=test2[0]*w[0]+test2[1]*w[1]+test2[2]*w[2];
System.out.println("适应值"+test);
if(test>sita) {
System.out.println("车厘子");
}else {
System.out.println("樱桃");
}
}
}
PS:本人也是刚学习人工智能,这个代码是自己理解打出来的。如果您觉得对您的学习有帮助的话,请点个赞吧!欢迎在评论区指正交流。