Perceptron实践

一、题目:使用自己写的感知机Perceptron实现对鸢尾花数据的分类。

  数据来源:

from sklearn.datasets import load_iris
dataSet = load_iris()

二、注意事项:

  1)该数据中一共有三类,而感知机是个二分类器,因此,可以将该数据两两分成三次。

  2)第二类数据与第三类数据很相近,所以可以对数据进行升维处理,再做平方处理。

    例如:一种升维方式: 若x=(x1,x2,...xn) ,x_new=(x1*x1,x1*x2,...x1*xn,x2*x1,x2*x2,...x2*xn,....xn*xn)

        平方处理:  若x=(x1,x2,...xn),x_new=(x1*x1,x2*x2,x3*x3,...,xn*xn)

三、代码实现

 1 from sklearn.datasets import load_iris
 2 import numpy as np
 3 dataSet = load_iris()
 4 data=dataSet['data'] #数据预处理
 5 labelNum=dataSet['target']
 6 label=dataSet['target_names']
 7 x=[];
 8 for i in range( 0,len(data) ):  #数据升维
 9     y=[]
10     for j in range(0,len(data[i])):
11         for k in range(0,len(data[i])):
12             y.append(data[i][j]*data[i][k])
13     x.append(y)
14 data=np.array(x);
15 data=data**2           
16 def perceptron(data,label,eta=0.05,times=1000):
17     b=0;
18     w=np.zeros(len(data[0]))
19     while(times>0):
20         for i in range(0,len(label)):
21             if( label[i]*(sum(data[i]*w)+b ) <= 0 ):
22                 w=w+eta*data[i]*label[i]
23                 b=b+eta*label[i];
24         times-=1;
25     return w,b
26 def multi_classifier(data,labelNum,label):   
27     w={}            
28     b={} 
29     #多个感知机
30     for i in range(0,len(label)):
31         labelDuplicate=labelNum.copy();
32         #标签分类
33         for j in range(0,len(labelDuplicate)):
34             if(labelDuplicate[j]!=i):
35                 labelDuplicate[j]=-1;
36             else:
37                 labelDuplicate[j]=1;
38         if(i==1):
39             w[ label[i] ],b[ label[i] ]=perceptron(data,labelDuplicate,times=1000);
40         else:
41             w[ label[i] ],b[ label[i] ]=perceptron(data,labelDuplicate,times=100);
42     return w,b
43 def classify(data,w,b,label,labelNum):
44     sumLabel={};    #每类总数
45     corLabel={};  #正确数量
46     for j in label: #初始化
47         sumLabel[j]=0
48         corLabel[j]=0
49         
50     for i in range(0,len(data)):
51         print('',i+1,'个样本')
52         for j in label:
53             if( sum(w[j]*data[i])+b[j]>=0  ):
54                 if(j==label[labelNum[i]]):
55                     corLabel[j]+=1;
56                 sumLabel[  label[ labelNum[i]]  ]+=1
57                 print(j)
58                 break;
59     for j in label:
60         print(' {0} 类正确率:{1}'.format(j, corLabel[j]/ sumLabel[j]));
61 w,b=multi_classifier(data,labelNum,label);
62 classify(data,w,b,label,labelNum);

 四、运行结果

 

posted @ 2018-10-10 11:36  bear_ge  阅读(214)  评论(0编辑  收藏  举报