python实现感知器算法(批处理)


Posted in Python onJanuary 18, 2019

本文实例为大家分享了Python感知器算法实现的具体代码,供大家参考,具体内容如下

先创建感知器类:用于二分类

# -*- coding: utf-8 -*-
 
import numpy as np
 
 
class Perceptron(object):
  """
  感知器:用于二分类
  参照改写 https://blog.csdn.net/simple_the_best/article/details/54619495
  
  属性:
  w0:偏差
  w:权向量
  learning_rate:学习率
  threshold:准则阈值
  """
  
  def __init__(self,learning_rate=0.01,threshold=0.001):
    self.learning_rate=learning_rate
    self.threshold=threshold
    
  def train(self,x,y):
    """训练
    参数:
    x:样本,维度为n*m(样本有m个特征,x输入就是m维),样本数量为n
    y:类标,维度为n*1,取值1和-1(正样本和负样本)
    
    返回:
    self:object
    """
    self.w0=0.0
    self.w=np.full(x.shape[1],0.0)
    
    k=0
    while(True):
      k+=1
      dJw0=0.0
      dJw=np.zeros(x.shape[1])
      err=0.0
      for i in range(0,x.shape[0]):
        if not (y[i]==1 or y[i]==-1):
          print("类标只能为1或-1!请核对!")
          break
        update=self.learning_rate*0.5*(y[i]-self.predict(x[i]))
        dJw0+=update
        dJw+=update*x[i]
        err+=np.abs(0.5*(y[i]-self.predict(x[i])))
      self.w0 += dJw0
      self.w += dJw
      if np.abs(np.sum(self.learning_rate*dJw))<self.threshold or k>500:
        print("迭代次数:",k," 错分样本数:",err)
        break
    return self
    
    
  def predict(self,x):
    """预测类别
    参数:
    x:样本,1*m维,1个样本,m维特征
    
    返回:
    yhat:预测的类标号,1或者-1,1代表正样本,-1代表负样本
    """
    if np.matmul(self.w,x.T)+self.w0>0:
      yhat=1
    else:
      yhat=-1
    return yhat 
  
  def predict_value(self,x):
    """预测值
    参数:
    x:样本,1*m维,1个样本,m维特征
    
    返回:
    y:预测值
    """
    y=np.matmul(self.w,x.T)+self.w0
    return y

然后为Iris数据集创建一个Iris类,用于产生5折验证所需要的数据,并且能产生不同样本数量的数据集。

# -*- coding: utf-8 -*-
"""
Author:CommissarMa
2018年5月23日 16点52分
"""
import numpy as np
import scipy.io as sio
 
 
class Iris(object):
  """Iris数据集
  参数:
  data:根据size裁剪出来的iris数据集
  size:每种类型的样本数量
  way:one against the rest || one against one
  
  注意:
  此处规定5折交叉验证(5-cv),所以每种类型样本的数量要是5的倍数
  多分类方式:one against the rest
  """
  
  def __init__(self,size=50,way="one against the rest"):
    """
    size:每种类型的样本数量
    """
    data=sio.loadmat("C:\\Users\\CommissarMa\\Desktop\\模式识别\\课件ppt\\PR实验内容\\iris_data.mat")
    iris_data=data['iris_data']#iris_data:原数据集,shape:150*4,1-50个样本为第一类,51-100个样本为第二类,101-150个样本为第三类
    self.size=size
    self.way=way
    self.data=np.zeros((size*3,4))
    for r in range(0,size*3):
      self.data[r]=iris_data[int(r/size)*50+r%size]
    
  
  def generate_train_data(self,index_fold,index_class,neg_class=None):
    """
    index_fold:5折验证的第几折,范围:0,1,2,3,4
    index_class:第几类作为正类,类别号:负类样本为-1,正类样本为1
    """
    if self.way=="one against the rest":
      fold_size=int(self.size/5)#将每类样本分成5份
      train_data=np.zeros((fold_size*4*3,4))
      label_data=np.full((fold_size*4*3),-1)
      for r in range(0,fold_size*4*3):
        n_class=int(r/(fold_size*4))#第几类
        n_fold=int((r%(fold_size*4))/fold_size)#第几折
        n=(r%(fold_size*4))%fold_size#第几个
        if n_fold<index_fold:
          train_data[r]=self.data[n_class*self.size+n_fold*fold_size+n]
        else:
          train_data[r]=self.data[n_class*self.size+(n_fold+1)*fold_size+n]
        
      label_data[fold_size*4*index_class:fold_size*4*(index_class+1)]=1
    elif self.way=="one against one":
      if neg_class==None:
        print("one against one模式下需要提供负类的序号!")
        return
      else:
        fold_size=int(self.size/5)#将每类样本分成5份
        train_data=np.zeros((fold_size*4*2,4))
        label_data=np.full((fold_size*4*2),-1)
        for r in range(0,fold_size*4*2):
          n_class=int(r/(fold_size*4))#第几类
          n_fold=int((r%(fold_size*4))/fold_size)#第几折
          n=(r%(fold_size*4))%fold_size#第几个
          if n_class==0:#放正类样本
            if n_fold<index_fold:
              train_data[r]=self.data[index_class*self.size+n_fold*fold_size+n]
            else:
              train_data[r]=self.data[index_class*self.size+(n_fold+1)*fold_size+n]
          if n_class==1:#放负类样本
            if n_fold<index_fold:
              train_data[r]=self.data[neg_class*self.size+n_fold*fold_size+n]
            else:
              train_data[r]=self.data[neg_class*self.size+(n_fold+1)*fold_size+n]
        label_data[0:fold_size*4]=1
    else:
      print("多分类方式错误!只能为one against one 或 one against the rest!")
      return
    
    return train_data,label_data
        
    
    
  def generate_test_data(self,index_fold):
    """生成测试数据
    index_fold:5折验证的第几折,范围:0,1,2,3,4
    
    返回值:
    test_data:对应于第index_fold折的测试数据
    label_data:类别号为0,1,2
    """
    fold_size=int(self.size/5)#将每类样本分成5份
    test_data=np.zeros((fold_size*3,4))
    label_data=np.zeros(fold_size*3)
    for r in range(0,fold_size*3):
      test_data[r]=self.data[int(int(r/fold_size)*self.size)+int(index_fold*fold_size)+r%fold_size]
    label_data[0:fold_size]=0
    label_data[fold_size:fold_size*2]=1
    label_data[fold_size*2:fold_size*3]=2
    
    return test_data,label_data

然后我们进行训练测试,先使用one against the rest策略:

# -*- coding: utf-8 -*-
 
from perceptron import Perceptron
from iris_data import Iris
import numpy as np
 
if __name__=="__main__":
   iris=Iris(size=50,way="one against the rest")
   
   correct_all=0
   for n_fold in range(0,5):
     p=[Perceptron(),Perceptron(),Perceptron()]
     for c in range(0,3):
       x,y=iris.generate_train_data(index_fold=n_fold,index_class=c)
       p[c].train(x,y)
     #训练完毕,开始测试
     correct=0
     x_test,y_test=iris.generate_test_data(index_fold=n_fold)
     num=len(x_test)
     for i in range(0,num):
       maxvalue=max(p[0].predict_value(x_test[i]),p[1].predict_value(x_test[i]),
          p[2].predict_value(x_test[i]))
       if maxvalue==p[int(y_test[i])].predict_value(x_test[i]):
         correct+=1
     print("错分数量:",num-correct,"错误率:",(num-correct)/num)
     correct_all+=correct
   print("平均错误率:",(num*5-correct_all)/(num*5))

然后使用one against one 策略去训练测试:

# -*- coding: utf-8 -*-
 
from perceptron import Perceptron
from iris_data import Iris
import numpy as np
 
if __name__=="__main__":
   iris=Iris(size=10,way="one against one")
   
   correct_all=0
   for n_fold in range(0,5):
     #训练
     p01=Perceptron()#0类和1类比较的判别器
     p02=Perceptron()
     p12=Perceptron()
     x,y=iris.generate_train_data(index_fold=n_fold,index_class=0,neg_class=1)
     p01.train(x,y)
     x,y=iris.generate_train_data(index_fold=n_fold,index_class=0,neg_class=2)
     p02.train(x,y)
     x,y=iris.generate_train_data(index_fold=n_fold,index_class=1,neg_class=2)
     p12.train(x,y)
     #测试
     correct=0
     x_test,y_test=iris.generate_test_data(index_fold=n_fold)
     num=len(x_test)
     for i in range(0,num):
       vote0=0
       vote1=0
       vote2=0
       if p01.predict_value(x_test[i])>0:
         vote0+=1
       else:
         vote1+=1
       if p02.predict_value(x_test[i])>0:
         vote0+=1
       else:
         vote2+=1
       if p12.predict_value(x_test[i])>0:
         vote1+=1
       else:
         vote2+=1
       
       if vote0==max(vote0,vote1,vote2) and int(vote0)==int(y_test[i]):
         correct+=1
       elif vote1==max(vote0,vote1,vote2) and int(vote1)==int(y_test[i]):
         correct+=1
       elif vote2==max(vote0,vote1,vote2) and int(vote2)==int(y_test[i]):
         correct+=1
     print("错分数量:",num-correct,"错误率:",(num-correct)/num)
     correct_all+=correct
   print("平均错误率:",(num*5-correct_all)/(num*5))

实验结果如图所示:

python实现感知器算法(批处理)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
讲解Python中fileno()方法的使用
May 24 Python
TensorFlow实现MLP多层感知机模型
Mar 09 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
基于python实现上传文件到OSS代码实例
May 09 Python
如何利用python进行时间序列分析
Aug 04 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
python实现多层感知器
Jan 18 #Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 #Python
基于python实现KNN分类算法
Apr 23 #Python
python实现定时发送qq消息
Jan 18 #Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
Python设计模式之工厂方法模式实例详解
Jan 18 #Python
Python设计模式之原型模式实例详解
Jan 18 #Python
You might like
用PHP调用Oracle存储过程
2006/10/09 PHP
一个SQL管理员的web接口
2006/10/09 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
python中metaclass原理与用法详解
2019/06/25 Python
python对XML文件的操作实现代码
2020/03/27 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
如何进行Linux分区优化
2013/02/12 面试题
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
调查研究项目计划书
2014/04/29 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
品牌转让协议书
2014/08/20 职场文书
会计试用期自我评价
2014/09/19 职场文书
2016继续教育研修日志
2015/11/13 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
python分分钟绘制精美地图海报
2022/02/15 Python