1.神经网络(线性,Rosenblatt)

大纲

1. look --- 人工神经网络的理论,计算模型

2. write --- 少量数据栗子

3. code --- python


人工神经网络的理论

历史故事(可以不看)

1943年,美国McCulloch与Pitts从信息处理的角度,合作提出了第一个神经计算模型:二元神经元模型,简称MP模型。1949年,心理学家D.O.Hebb对大脑神经细胞、学习与条件反射作了大胆地假设,提出了著名的Hebb学习规则,即由神经元之间结合强度的改变来实现神经学习的方法。 50年代末期,Rosenblatt提出感知机(Perceptron),首先从工程角度,研究了用于信息处理的神经网络模型。

理论(百度抄的,看了也没啥卵用)

人工神经网络从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

模拟一个简单的线性神经网络

没错,就是呢个大家用烂的感知学习算法:Rosenblatt
用一个简单的二分类问题作为栗子

基于神经元结构模型

算法模型
  • 模型图解释:Input 输入值(x)和权值(w),权值初始化为0
输入的数据和初始化权值.png
  • 模型图解释:Net Input Function 网络输入,是向量乘积的形式
Net Input Function
  • 模型图解释:Activation Function 激活函数
Activation Function
  • 模型图解释:Weight update 权值更新策略
Weight update

栗子出场~

数据的模样

X
[ 4.8 1.4] , [ 5.1 1.6] , [ 4.6 1.4] , [ 5.3 1.5]
[ 5.0 1.4] , [ 7.0 4.7] , [ 6.4 4.5] , [ 6.9 4.9]
[ 5.5 4.0] , [ 6.5 4.6]
y
[-1 -1 -1 -1 -1 1 1 1 1 1]

初始化权值

w = [0,0,0]

学习率设置为0.1

第一次计算就遇到分类错误情况
update = 学习率 * (真实分类 - 预测分类)
    = 0.1 * (-1 - 1)
    = -0.2

w_new = w_old + update • X
    = [0,0,0] + -0.2 • [1 , 4.8 , 1.4]
    = [0,0,0] + [-0.2 , -0.96 , -0.28]
    = [-0.2 , -0.96 , -0.28]

第一次循环过程

第一轮计算过后,被错误分类的点有2个.构分类超平面的公式为


超平面公式

带入第一轮计算的权值得到以下超平面


第一轮迭代得到的超平面
10轮过后...

权值向量w = [-0.4 -0.66 1.38]

Paste_Image.png

观察每次迭代以后对应的错误分类数量,发现第5次迭代以后,算法收敛


Paste_Image.png

Code Time

不是手算的就不呢么寒酸只用十个数据点了~

线性感知器社交网络

# encoding:utf-8
__author__ = 'Matter'

import numpy as np
class Perceptron(object):

    # --------  参数  --------#
    # 参数1   eta:float   学习率
    # 参数2   n_iter:int  循环次数
    # --------  属性  --------#
    # 属性1   w_:1d_array     拟合后权值
    # 属性2   errors_:list    每次迭代的错误分类

    # 初始化
    def __init__(self,eta=0.01,n_iter=10):
        self.eta = eta
        self.n_iter = n_iter

    # 训练模型
    def fit(self,X,y):
        self.w_ = np.zeros(1+X.shape[1])
        self.errors_ = []

        for _ in range(self.n_iter):
            errors = 0
            for xi,target in zip(X,y):
                # 计算误差,并更新权值
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0) # 分类错误的个数
            self.errors_.append(errors) # 记录每次权值修正以后的错误分类个数
        return self
    # 输入和权值的点积,即公式的z函数,图中的net_input
    def net_input(self,X):
        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)

调用进行测试

# encoding:utf-8
__author__ = 'Matter'

import pandas as pd
import numpy as np
from Perceptron import Perceptron

# https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
df = pd.read_csv("iris.data",header=None)

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

ppn = Perceptron(eta=0.1,n_iter=10)
ppn.fit(X,y)
print(ppn.w_)
# ppn.w_ : [-0.4  -0.68  1.82]

推荐阅读更多精彩内容