感知器基础原理及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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
python网络编程之文件下载实例分析
May 20 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
Django如何将URL映射到视图
Jul 29 Python
python取均匀不重复的随机数方式
Nov 27 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
Django用内置方法实现简单搜索功能的方法
Dec 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
javascript操作数组详解
2014/12/17 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
使用python远程操作linux过程解析
2019/12/04 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
写自荐信要注意什么
2013/12/26 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
统计员岗位职责范本
2015/04/14 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫