自适应线性神经网络Adaline的python实现详解


Posted in Python onSeptember 30, 2019

自适应线性神经网络Adaptive linear network, 是神经网络的入门级别网络。

相对于感知器,采用了f(z)=z的激活函数,属于连续函数。

代价函数为LMS函数,最小均方算法,Least mean square。

自适应线性神经网络Adaline的python实现详解

实现上,采用随机梯度下降,由于更新的随机性,运行多次结果是不同的。

'''
Adaline classifier

created on 2019.9.14
author: vince
'''
import pandas 
import math
import numpy 
import logging
import random
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

'''
Adaline classifier

Attributes
w: ld-array = weights after training
l: list = number of misclassification during each iteration 
'''
class Adaline:
  def __init__(self, eta = 0.001, iter_num = 500, 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 rand_time in range(X.shape[0]): 
        sample_index = random.randint(0, X.shape[0] - 1);
        if (self.activation(X[sample_index]) == Y[sample_index]):
          continue;
        output = self.net_input(X[sample_index]);
        errors = Y[sample_index] - output;
        self.w[0] += self.eta * errors;
        self.w[1:] += self.eta * numpy.dot(errors, X[sample_index]);
        break;
      for sample_index in range(X.shape[0]): 
        self.l[iter_index] += (Y[sample_index] - self.net_input(X[sample_index])) ** 2 * 0.5;
      logging.info("iter %s: w0(%s), w1(%s), w2(%s), l(%s)" %
          (iter_index, self.w[0], self.w[1], self.w[2], self.l[iter_index]));
      if iter_index > 1 and math.fabs(self.l[iter_index - 1] - self.l[iter_index]) < 0.0001: 
        break;

  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)));

  classifier = Adaline();

  classifier.train(train_features, train_labels);
    
  test_predict = numpy.array([]);
  for feature in test_features:
    predict_label = classifier.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 = - classifier.w[1] / classifier.w[2];
  d = - classifier.w[0] / classifier.w[2];

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

  plt.show();
  

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

自适应线性神经网络Adaline的python实现详解

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

Python 相关文章推荐
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
python实现知乎高颜值图片爬取
Aug 12 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python socket聊天脚本代码实例
Jan 02 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
softmax及python实现过程解析
Sep 30 #Python
python根据时间获取周数代码实例
Sep 30 #Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 #Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 #Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 #Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 #Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 #Python
You might like
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
Script的加载方法小结
2011/01/12 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
python动态加载包的方法小结
2016/04/18 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
Python字符串的修改方法实例
2019/12/19 Python
详解pandas映射与数据转换
2021/01/22 Python
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
单位办理社保介绍信
2014/01/10 职场文书
旷课检讨书2000字
2014/01/14 职场文书
运动会跳远广播稿
2015/08/19 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers