感知机算法的实现

感知机算法原始形式

//数据
public class data {
    int x[] = new int[2];
    int y = 0;
    public data(int[] x,int y){
        this.x = x;
        this.y = y;
    }

}

//参数
public class parameter {
    int[] w;
    int b;
    public parameter(int[] w, int b){
        this.w = w;
        this.b = b;
    }
}

// 判断是否为错判数据
public class judge {
    public int result(data data, parameter p) {
        int s = 0;
        for (int i = 0; i < p.w.length; i++) {
            s = s + p.w[i] * data.x[i];
        }
        return data.y * (s + p.b);
    }
}
public class iterator {
//    迭代
    public parameter iter(parameter parameter,  data d, int c){
        for(int i = 0; i<d.x.length; i++){
            d.x[i]=d.x[i]*d.y;
        }
        for(int j = 0; j<parameter.w.length; j++){
            parameter.w[j] = parameter.w[j] + c *d.x[j];
        }
        parameter.b = parameter.b + c * d.y;
        parameter p = new parameter(parameter.w,parameter.b);
//        将改变的x值变回去
        for(int i = 0; i<d.x.length; i++){
            d.x[i]=d.x[i]*d.y;
        }
        return p;
    }

}
import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String[] args) {
        int[] x1 = {3,3};
        int[] x2 = {4,3};
        int[] x3 = {1,1};
        data d1 = new data(x1,1);
        data d2 = new data(x2,1);
        data d3 = new data(x3, -1);
        List<data> list = new ArrayList<data>();
        list.add(d1);
        list.add(d2);
        list.add(d3);
        int[] w ={0};
        w = new int[d1.x.length];
        int b =0;
        int c = 1;
        parameter parameter = new parameter(w,b);
        judge judge = new judge();
        for(int k = 0 ; k<list.size(); k++) {
            for (int i = 0; i < list.size(); i++) {
                judge j = new judge();
                while (j.result(list.get(i), parameter) <= 0) {
                    iterator it = new iterator();
                    parameter = it.iter(parameter, list.get(i), c);
                }
            }
        }
        System.out.println("b="+parameter.b + "," +"w[0]=" + parameter.w[0] + "," +"w[1]=" + parameter.w[1]);
    }
}

感知机算法的对偶形式

public class data {
    int[] x;
    int y;
    public data(int[] x,int y){
        this.x = x;
        this.y = y;
    }
}
//求矩阵
import java.util.List;

public class Gram {
    public int[][] getMatrix(List<data> list){
        int[][] G = new int[list.size()][list.size()];
        for(int i = 0; i<list.size(); i++){
            for(int j=0; j<list.size(); j++){
                G[i][j] = list.get(i).x[0]*list.get(j).x[0]+list.get(i).x[1]*list.get(j).x[1];
            }
        }
        return G;
    }
}
//参数
public class Paramter {
    int[] a;
    int b;
    public Paramter(int[] a, int b){
        this.a = a;
        this.b = b;
    }
}

import java.util.List;

public class judge {
    public int result(List<data> list, int[][] M, Paramter p, int i){
        int[] x = new int[M.length];
        int sum =0;
        for(int k = 0; k<x.length; k++){
            x[k] = M[i][k];
            x[k] = x[k] * list.get(k).y;
        }
        for(int j = 0; j<p.a.length; j++){
            sum = sum + p.a[j] * x[j];
        }
        sum =sum +p.b;
        return list.get(i).y*sum;

    }

}

import java.util.List;

public class iterator {
    public Paramter iter(Paramter p, List<data> list, int i){
        p.a[i] = p.a[i] + 1;
        p.b = p.b + list.get(i).y;
        Paramter paramter = new Paramter(p.a,p.b);
        return  paramter;
    }
}
import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String[] args) {
        int[] x1 = {3,3};
        data d1 = new data(x1,1);
        int[] x2 = {4,3};
        data d2 = new data(x2,1);
        int[] x3 = {1,1};
        data d3 = new data(x3,-1);
        List<data> list = new ArrayList<data>();
        list.add(d1);
        list.add(d2);
        list.add(d3);
        Gram gram = new Gram();
        int[] a = {0};
         a = new int[list.size()];
         int b = 0;
         Paramter p = new Paramter(a,b);
        int[][] M = gram.getMatrix(list);
       judge j = new judge();
       for(int k=0; k<list.size();k++) {
           for (int i = 0; i < list.size(); i++) {
               while(j.result(list, M, p, i) <= 0) {
                   iterator it = new iterator();
                   p = it.iter(p, list, i);
               }
           }
       }
      for(int k=0; k<p.a.length; k++){
          System.out.print("a[k]=" +p.a[k] + "   ");
      }
      System.out.println("");
      System.out.println("b=" + p.b);

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值