自适应线性神经网络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中使用strip()方法删除字符串中空格的教程
May 20 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python进行数据提取的方法总结
Aug 22 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
python实现布隆过滤器及原理解析
Dec 08 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
使用Django框架创建项目
Jun 10 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
PHP高自定义性安全验证码代码
2011/11/27 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
php mysql 封装类实例代码
2016/09/18 PHP
用JS实现的一个include函数
2007/07/21 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python实现低通滤波器代码
2020/02/26 Python
python爬取抖音视频的实例分析
2021/01/19 Python
numpy实现RNN原理实现
2021/03/02 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
应届大学生简历中的自我评价
2014/01/15 职场文书
初二生物教学反思
2014/02/03 职场文书
国培远程培训感言
2014/03/08 职场文书
群众路线调研报告范文
2014/11/03 职场文书
教师节表彰会主持词
2015/07/06 职场文书
教师培训学习心得体会
2016/01/21 职场文书
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
SQL Server中的游标介绍
2022/05/20 SQL Server