用java实现基于感知器的数据线性分类

感知器(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:本人也是刚学习人工智能,这个代码是自己理解打出来的。如果您觉得对您的学习有帮助的话,请点个赞吧!欢迎在评论区指正交流。

发布了11 篇原创文章 · 获赞 7 · 访问量 1187

猜你喜欢

转载自blog.csdn.net/leangx86/article/details/103882722
今日推荐