感知器基础原理及python实现过程详解


Posted in Python onSeptember 30, 2019

简单版本,按照李航的《统计学习方法》的思路编写

感知器基础原理及python实现过程详解

数据采用了著名的sklearn自带的iries数据,最优化求解采用了SGD算法。

预处理增加了标准化操作。

'''
perceptron classifier

created on 2019.9.14
author: vince
'''
import pandas 
import numpy 
import logging
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

'''
perceptron classifier

Attributes
w: ld-array = weights after training
l: list = number of misclassification during each iteration 
'''
class Perceptron:
  def __init__(self, eta = 0.01, iter_num = 50, batch_size = 1):
    '''
    eta: float = learning rate (between 0.0 and 1.0).
    iter_num: int = iteration over the training dataset.
    batch_size: int = gradient descent batch number, 
      if batch_size == 1, used SGD; 
      if batch_size == 0, use BGD; 
      else MBGD;
    '''

    self.eta = eta;
    self.iter_num = iter_num;
    self.batch_size = batch_size;

  def train(self, X, Y):
    '''
    train training data.
    X:{array-like}, shape=[n_samples, n_features] = Training vectors, 
      where n_samples is the number of training samples and 
      n_features is the number of features.
    Y:{array-like}, share=[n_samples] = traget values.
    '''
    self.w = numpy.zeros(1 + X.shape[1]);
    self.l = numpy.zeros(self.iter_num);
    for iter_index in range(self.iter_num):
      for sample_index in range(X.shape[0]): 
        if (self.activation(X[sample_index]) != Y[sample_index]):
          logging.debug("%s: pred(%s), label(%s), %s, %s" % (sample_index, 
            self.net_input(X[sample_index]) , Y[sample_index],
            X[sample_index, 0], X[sample_index, 1]));
          self.l[iter_index] += 1;
      for sample_index in range(X.shape[0]): 
        if (self.activation(X[sample_index]) != Y[sample_index]):
          self.w[0] += self.eta * Y[sample_index];
          self.w[1:] += self.eta * numpy.dot(X[sample_index], Y[sample_index]);
          break;
      logging.info("iter %s: %s, %s, %s, %s" %
          (iter_index, self.w[0], self.w[1], self.w[2], self.l[iter_index]));

  def activation(self, x):
    return numpy.where(self.net_input(x) >= 0.0 , 1 , -1);

  def net_input(self, x): 
    return numpy.dot(x, self.w[1:]) + self.w[0];

  def predict(self, x):
    return self.activation(x);

def main():
  logging.basicConfig(level = logging.INFO,
      format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
      datefmt = '%a, %d %b %Y %H:%M:%S');

  iris = load_iris();

  features = iris.data[:99, [0, 2]];
  # normalization
  features_std = numpy.copy(features);
  for i in range(features.shape[1]):
    features_std[:, i] = (features_std[:, i] - features[:, i].mean()) / features[:, i].std();

  labels = numpy.where(iris.target[:99] == 0, -1, 1);

  # 2/3 data from training, 1/3 data for testing
  train_features, test_features, train_labels, test_labels = train_test_split(
      features_std, labels, test_size = 0.33, random_state = 23323);
  
  logging.info("train set shape:%s" % (str(train_features.shape)));

  p = Perceptron();

  p.train(train_features, train_labels);
    
  test_predict = numpy.array([]);
  for feature in test_features:
    predict_label = p.predict(feature);
    test_predict = numpy.append(test_predict, predict_label);

  score = accuracy_score(test_labels, test_predict);
  logging.info("The accruacy score is: %s "% (str(score)));

  #plot
  x_min, x_max = train_features[:, 0].min() - 1, train_features[:, 0].max() + 1;
  y_min, y_max = train_features[:, 1].min() - 1, train_features[:, 1].max() + 1;
  plt.xlim(x_min, x_max);
  plt.ylim(y_min, y_max);
  plt.xlabel("width");
  plt.ylabel("heigt");

  plt.scatter(train_features[:, 0], train_features[:, 1], c = train_labels, marker = 'o', s = 10);

  k = - p.w[1] / p.w[2];
  d = - p.w[0] / p.w[2];

  plt.plot([x_min, x_max], [k * x_min + d, k * x_max + d], "go-");

  plt.show();
  

if __name__ == "__main__":
  main();

感知器基础原理及python实现过程详解

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

Python 相关文章推荐
python 将字符串转换成字典dict
Mar 24 Python
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
Python调用命令行进度条的方法
May 05 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
Python Pandas 箱线图的实现
Jul 23 Python
python如何绘制疫情图
Sep 16 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 #Python
Window10下python3.7 安装与卸载教程图解
Sep 30 #Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 #Python
Python3 合并二叉树的实现
Sep 30 #Python
自适应线性神经网络Adaline的python实现详解
Sep 30 #Python
softmax及python实现过程解析
Sep 30 #Python
python根据时间获取周数代码实例
Sep 30 #Python
You might like
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
图片之间的切换
2006/06/26 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
python 性能提升的几种方法
2016/07/15 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
Python类及获取对象属性方法解析
2020/06/15 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
自主招生自荐书
2013/11/29 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
实习证明格式范文
2015/06/16 职场文书