感知器算法

感知器算法由 Rosenblatt 提出,其主要功能是通过设计分类器来判别样本所属的类别;通过对训练样本集的学习,从而得到判别函数权值的解,产生线性可分的样本判别函数。该算法属于非参数算法,优点是不需要对各类样本的统计性质作任何假设,属于确定性方法。

感知器算法是非常好的二分类在线算法。该算法求取一个分离超平面,超平面由w∈R  参数化并用来预测。对于一个样本x,感知器算法通过计算y=(wx)预测样本的标签。最终的预测标签通过计算sign(y)来实现。算法仅在预测错误时修正权值w 。如果正确的标签是 y =1,那么权值修正为w +x;如果y =−1 ,权值变为w −x ,可以总结为 w←w +yx;需要注意的是在预测后,尽管算法不能保证修正后的预测准则会正确分类目前的样本,但在目前样本上的分离超平面的间隔会增加,即算法是保守的不是主动的。

算法流程图如下所示:

感知器算法_第1张图片

算法步骤:

感知器算法_第2张图片

2.  感知器算法的实现

我是用Java语言来编写的,实现的比较简单的两类,两特征的感知器算法。该算法的目的是为了计算权向量W。程序开始时输入样本数N,然后程序随机产生N个样本值。

感知器算法_第3张图片

根据感知器算法的过程,程序在进行了15次计算后得到了最终的权向量W=(10,-2,-12)。所以线性分类判别函数是10x-2y-12=0,化简得y=5x-6。为验证该函数是否能正确分类,故把所有的样本值点在XOY平面标出来,并画出y=5x-6的函数图象,结果如下所示:

感知器算法_第4张图片

从上图中可以看出,该判别函数很好地把两类数据分开了,得到的结果还是比较准确的。

源代码:

import java.io.IOException;
import java.util.Scanner;

public class Perceptron {

	public static void main(String[] args) throws IOException {
		int N,C=1,t=1;//N是训练样本数,C是迭代过程中的系数,t为迭代次数
		int[] W=new int[]{-1,1,0};//权向量W,初始设为(-1,1,0)
		int[] temp=new int[3];//作为与上一次迭代的W做比较
		System.out.println("输入样本数");
		Scanner strin=new Scanner(System.in);
		N=strin.nextInt();//输入样本数,随后产生随机样本
		int[][] X=new int[4][N];//样本值
		genesample(X);
		
		//第一次迭代,
		System.arraycopy(W, 0, temp, 0, W.length);//数组的深度复制
		for(int i=0;i=0&&X[3][k]==2){//Xk属于第二类,且Wk*Xk>=0,修正Wk的值
    		for(int i=0;i



你可能感兴趣的:(大数据和机器学习)