感知机算法原始形式
//数据
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);
}
}