Python
【慕课】Python 实现人工神经网络 - part.1 人工神经元
5/19/2018
·
43
·
profile photo
这篇文章是我在慕课网课程 机器学习-实现简单神经网络 是的学习笔记与老师讲课内容的整理,主要整理了算法的数学表达式部分,使用 LaTeX 进行了重新排版并通过 Katex 渲染,感兴趣并需要的同学可以查看文章的源码以获取。
人工神经网络是一种重要的机器学习算法,其本质是实现了一种称为 "人工神经元" 的仿生学结构,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。和其他机器学习方法一样,神经网络已经被用于解决各种各样的问题,例如机器视觉和语音识别。这些问题都是很难被传统基于规则的编程所解决的。
示意图
示意图

数学表达

激活函数

一些数学运算的概念介绍

  • 向量点乘(内积)
例如:
  • 矩阵转置
例如:

感知器数据分类算法步骤

权重向量 ,训练样本 
  1. 把权重初始化为 ,火把每个分量初始化为  间的任意小数
  1. 把训练样本输入感知器,得分类结果 ()
  1. 根据分类结果更新权重向量

步调函数(激活函数)与阈值

权重更新算法

  • 表示学习率,是一个 间的小数
  • 是输入样本的正确分类, 是感知器计算出来的分类
示例:
  • 更新后的权重向量

阈值的更新

感知器算法适用范围

要求: 待预测的数据线性可分
notion image

算法步骤总结

notion image
import numpy as np

class Perception(object):
  """
  eta: 学习率
  n_iter: 权重向量训练次数
  w_: 神经分叉权重向量
  errors_: 用于记录神经元判断出错次数
  """
  def __init__(self, eta=0.01, n_iter=10):
    self.eta = eta;
    self.n_iter = n_iter;

  """
  X: 输入样本向量
  y: 对应样本分类
  """
  def fit(self, X, y):
    """
    输入训练数据,培训神经元

    X:shape[0_samples, n_features]
    eg: X:[[1, 2, 3], [4, 5, 6]] ===> n_samples: 2, n_features: 3

    y: [1, -1]
    """

    """
    初始化权重向量为 0
    +1: 根据算法,将 w0 设置为步调函数的初始阈值
    """
    self.w_ = np.zeros(1 + X.shape[1]);
    self.errors_ = [];

    for _ in range(self.n_iter):
      errors = 0
      """
      X:[[1,2,3], [4,5,6]]
      y:[1,-1]
      zip(X,y) = [[1,2,3, 1], [4,5,6, -1]]
      """
      for xi, target in zip(X, y):
        """
        update = η * (y - y')
        """
        update = self.eta * (target - self.predict(xi))

        """
        xi 是一个向量(数组)
        update * xi 等价于:
        [W(1) = X[1] * update,W(2) = X[2] * update,W(3) = X[3] * update]
        """
        self.w_[1:] += update * xi
        self.w_[0] += update;

        errors += int(update != 0.0)
        self.errors_.append(errors)

  def net_input(self, X):
    """
    z = w0 * 1 + w1*x1 + ... + wn*xn
    """
    return np.dot(X, self.w_[1:]) + self.w_[0]

  def predict(self, X):
    return np.where(self.net_input(X) >= 0.0 , 1, -1)
💡
数据集还是使用 Iris 数据集
file = "assets/iris.data.csv"

import pandas as pd

df = pd.read_csv(file, header=None)
df.head(10)
import matplotlib.pyplot as plt

y = df.iloc[0:100, 4].values
# print(y)
y = np.where(y == 'Iris-setosa', -1, 1)
# print(y)

X = df.iloc[0:100, [0, 2]].values

plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setasa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
plt.xlabel('花瓣长度')
plt.ylabel('花茎长度')
plt.legend(loc='upper left')
plt.show()
notion image
ppn = Perception(eta=0.1, n_iter=10)
ppn.fit(X, y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('错误分类次数')
plt.show()
notion image
from matplotlib.colors import ListedColormap

def plot_decision_regions(X, y, classifier, resolution=0.02):
  markers = ('s', 'x', 'o', 'v')
  colors = ('red', 'blue', 'lightgreen', 'grey', 'cyan')
  cmap = ListedColormap(colors[:len(np.unique(y))])

  x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max()
  x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max()

  xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                        np.arange(x2_min, x2_max, resolution))

  z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)

  z = z.reshape(xx1.shape)
  plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
  plt.xlim(xx1.min(), xx1.max())
  plt.ylim(xx2.min(), xx2.max())

  for idx, cl in enumerate(np.unique(y)):
    plt.scatter(x=X[y==cl, 0], y = X[y==cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)
plot_decision_regions(X, y, ppn, resolution=0.02)
plt.xlabel('花瓣长度')
plt.ylabel('花茎长度')
plt.legend(loc='upper left')
plt.show()
notion image