大纲
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
-
模型图解释:Net Input Function 网络输入,是向量乘积的形式
-
模型图解释:Activation Function 激活函数
-
模型图解释: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]
观察每次迭代以后对应的错误分类数量,发现第5次迭代以后,算法收敛
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]