自适应线性神经网络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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
Python中字典的基础知识归纳小结
Aug 19 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python3实现定时任务的四种方式
Jun 03 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
Python接口测试结果集实现封装比较
May 01 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 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
ajax缓存问题解决途径
2006/12/06 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
解放web程序员的输入验证
2006/10/06 Javascript
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python如何处理程序无法打开
2020/06/16 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
年终考核实施方案
2014/05/26 职场文书
团队队名口号大全
2014/06/06 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
英语读书笔记
2015/07/02 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
创业计划书之美容店
2019/09/16 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python