自适应线性神经网络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 with用法实例
Apr 14 Python
python学习 流程控制语句详解
Jun 01 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
python多线程之事件Event的使用详解
Apr 27 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
Oct 30 Python
python装饰器使用实例详解
Dec 14 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python 字典和列表嵌套用法详解
Jun 29 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
PHP学习之PHP表达式
2006/10/09 PHP
php db类库进行数据库操作
2009/03/19 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
Symfony的安装和配置方法
2016/03/17 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
详解VSCode配置启动Vue项目
2019/05/14 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
大学四年个人的自我评价
2014/02/26 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
博士生专家推荐信
2015/03/25 职场文书
离职告别感言
2015/08/04 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫