0、

神经网络:Neural Network

1、什么是神经网络算法?

神经网络算法中最著名的算法是1980年的反向传播(backpropagation)算法,其原理是以人脑中的神经网络为启发

2、多层向前神经网络(Multilayer Feed-Forward Neural Network)

2.1 多层向前神经网络使用了反向传播算法,由以下部分组成:

输入层(input layer),隐藏层(hidden layers),输入层(output layers)

2.2 解析

  • 每层由单元(units)组成
  • 输入层是由训练集的实例特征向量传入
  • 经过连接结点的权重(weight)传入下一层,一层的输出是下一层的输入
  • 隐藏层的个数可以是任意的,输入层有一层,输出层有一层
  • 每个单元(unit)也可以被称为神经结点,根据生物学来源定义
  • 以上成为2层的神经网络(输入层不算)
  • 一层中加权的求和,然后根据非线性方程转化输出
  • 作为多次向前神经网络,理论上,如果有足够多的隐藏层(hidden layers)和足够大的训练集,可以模拟出任何方程

3、设计神经网络结构

3.1 使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数

3.2 特征向量在被传入输入层时通常被先标准化(normalize)到0和1之间 (为了加速学习过程)

3.3 离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

比如:特征值A可能取三个值(a0, a1, a2), 可以使用3个输入单元来代表A。

如果A=a0, 那么代表a0的单元值就取1, 其他取0;

如果A=a1, 那么代表a1de单元值就取1,其他取0,以此类推

3.4 神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题

3.4.1 对于分类问题,如果是2类,可以用一个输出单元表示(0和1分别代表2类);如果多余2类,每一个类别用一个输出单元表示。所以输入层的单元数量通常等于类别的数量

3.4.2 没有明确的规则来设计最好有多少个隐藏层。根据实验测试和误差,以及准确度来实验并改进

4、交叉验证方法(Cross-Validation)

将数据集分为n份,每次取k份作为训练集,n-k作为测试集,迭代k次,将最终验证的结果求和除以k,就得到交叉验证的结果

k-fold cross validation

5、反向传播算法(Backpropagation)

5.1 通过迭代性的来处理训练集中的实例

5.2 对比经过神经网络后输入层预测值(predicted value)与真实值(target value)之间

5.3 反方向(从输出层=>隐藏层=>输入层)来以最小化误差(error)来更新每个连接的权重(weight)

5.4 算法详细介绍

  • 输入:D:数据集,l 学习率(learning rate), 一个多层前向神经网络
  • 输出:一个训练好的神经网络(a trained neural network),即一个确定好所有权重参数的模型

5.4.1 初始化权重(weights)和偏向(bias): 随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向

5.4.2 对于每一个训练实例X,执行以下步骤:

  • 由输入层向前传送

更新过程:I_j = \sum_i w_{ij}O_i + \theta_i,I表示单元的值,w表示对应连线上的权重,O表示单元之前的值,\theta表示每一层神经网络的偏向

激活函数f(非线性方程):O_j = \frac{1}{1+e^{-I_j}}

  • 根据误差(error)反向传送

对于输出层:Err_j = O_j(1 - O_j)(T_j - O_j),对于输出层等于该层的预测值*(1-预测值)*(真实值-预测值)

对于隐藏层:Err_j = O_j(1 - O_j)\sum_k Err_k w_{jk},对于隐藏层等于该层的预测值*(1-预测值)*前一层误差与对应权重的积的总和

权重更新:\Delta w_{ij} = (l)*Err_j O_i,l表示learn rate,为手动设置参数(表示迭代/求导步长)

w_{ij} = w_{ij} + \Delta w_{ij}

偏向更新:\Dalta \theta_j = (l)*Err_j

\theta_j = \theta_j + \Dalta \theta_j

5.4.3 终止条件

  • 权重的更新低于某个阈值,表示误差接近最小值
  • 预测的错误率低于某个阈值,表示预测值到达预期目标
  • 达到预设一定的循环次数,表示强制终止条件

6、Backpropagation 算法举例

7、关于非线性转化方程(non-linear transformation function)

sigmoid函数(S 曲线)用来作为activation function:

sigmoid函数的数学公式为(逻辑函数形式) y = f(x) = \frac{1}{1+e^{-x}}

  • 双曲函数(tanh):是一类与常见的三角函数类似的函数。最基本的双曲函数是双曲正弦函数sinh = \frac{e^x - e^{-x}}{2}和双曲余弦函数cosh = \frac{e^x + e^{-x}}{2};这里使用的是双曲正切函数tanh = \frac{sinh x}{cosh x} = \frac{e^x - e^{-x}}{e^x + e^{-x}};tanh x的导数为\frac{d}{dx}tanh x = 1 - tanh^2 x = sech^2 x = 1/cosh^2 x

  • 逻辑函数(logistic function):f(x) = \frac{1}{1 + e^{-x}};f(x)的导数为\frac{d}{dx}f(x) = f(x)(1 - f(x))

8、实现一个简单的神经网络算法

import numpy as np# 激活函数tanh及其导数
def tanh(x):  return np.tanh(x)def tanh_deriv(x):  return 1.0 - np.tanh(x)*np.tanh(x)#激活函数logistic及其导数
def logistic(x):  return 1/(1 + np.exp(-x))def logistic_derivative(x):  return logistic(x)*(1-logistic(x))class NeuralNetwork:   # _init_ 构造函数,self表示指向当前类的指针(相当于java中的this)def __init__(self, layers, activation='tanh'):  """  :param layers: A list containing the number of units in each layer.Should be at least two values  :param activation: The activation function to be used. Can be"logistic" or "tanh"  """  # 选择激活函数及其导数if activation == 'logistic':  self.activation = logistic  self.activation_deriv = logistic_derivative  elif activation == 'tanh':  self.activation = tanh  self.activation_deriv = tanh_derivself.weights = []  for i in range(1, len(layers) - 1):  # 从第二层开始,对所有连线更新weightself.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)  self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)# X表示训练集(一般是二维矩阵,行表示实例,列表示维数/特征值数),y表示class label,epochs表示预设的循环次数# 一般的,当训练集极大的时候,全部使用运算极慢,可以使用抽样方法,每次使用部分/一组训练集来训练# 该函数的目的就是计算得到符合预期的神经网络上所有的weightdef fit(self, X, y, learning_rate=0.2, epochs=10000):         X = np.atleast_2d(X)         # 确认X的最小维度至少是2维矩阵temp = np.ones([X.shape[0], X.shape[1]+1])         # 初始化一个矩阵(行数:X的行数,列数:X的列数+1,多出来一列是为了给bias赋值),初始值全1temp[:, 0:-1] = X         X = temp         # adding the bias unit to the input layer  y = np.array(y)        # 将y转换成numpy的格式# 运行预设循环次数for k in range(epochs):  # 随机抽取一行/一个实例给ai = np.random.randint(X.shape[0])  a = [X[i]]# 正向传播:循环神经网络层数,对于每一层:将当前层的实例与对应权重内积(np.dot),调用激活函数,然后将结果更新到a中for l in range(len(self.weights)):  #going forward network, for each layera.append(self.activation(np.dot(a[l], self.weights[l])))  #Computer the node value for each layer (O_i) using activation function# 计算输出层Errorerror = y[i] - a[-1]  #Computer the error at the top layer  # 计算输出层的误差的(T_j - O_j)deltas = [error * self.activation_deriv(a[-1])] #For output layer, Err calculation (delta is updated error) # 计算出输出层的误差#Staring backprobagation# 计算隐藏层Error# 反向传播:循环次数为从最上一层之前一层(减2,避免计算第一层(输入层)和最后一层(输出层)),到第0层,每次向前一层for l in range(len(a) - 2, 0, -1): # we need to begin at the second to last layer #Compute the updated error (i,e, deltas) for each node going from top layer to input layer deltas.append(self.activation_deriv(a[l])*deltas[-1].dot(self.weights[l].T))  deltas.reverse()  # 权重更新for i in range(len(self.weights)):  layer = np.atleast_2d(a[i])          delta = np.atleast_2d(deltas[i])  deltawij = learning_rate * layer.T.dot(delta)   # \Delta w_ij = (l)*Err_jO_iself.weights[i] = self.weights[i] + deltawij     # w_ij = w_ij + \Delta w_ij# 神经网络/模型训练好了,将新的实例走一遍正向传播的过程def predict(self, x):         x = np.array(x)         temp = np.ones(x.shape[0]+1)         temp[0:-1] = x         a = temp         for l in range(0, len(self.weights)):             a = self.activation(np.dot(a, self.weights[l]))         return a

PS:这里的.py文件要命名为NeuralNetwork.py,否则影响下面示例的使用。

9、神经网络算法的简单应用

9.1 简单非线性关系数据集测试(XOR):

X:                  Y

0 0                 0

0 1                 1

1 0                 1

1 1                 0

from NeuralNetwork import NeuralNetwork
import numpy as npnn = NeuralNetwork([2,2,1], 'tanh')
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in [[0, 0], [0, 1], [1, 0], [1, 1]]:    print(i, nn.predict(i))

结果:

[0, 0] [0.00056865]
[0, 1] [0.9982527]
[1, 0] [0.99830321]
[1, 1] [0.000747]

因为使用的激活函数是tanh,并且该函数在0~1上是连续的,所以得到的预测结果不是直接的0和1,但是我们可以将<0.5的设置为0,>0.5的设置为1:print(i, nn.predict(i)<0.5?0:1)

9.2 手写数字识别

来识别数字:0,1,2,3,4,5,6,7,8,9

# 科学计算矩阵库
import numpy as np
# 使用sklearn.datasets自带的简单数据集(没有就现下)
# 其中使用的是load_digitsa阿拉伯数字库,其中每个数字图片都是8x8的矩阵,64个像素点,一共1797张图片
from sklearn.datasets import load_digits
# sklearn.metrics包是用于对结果进行衡量的工具,confusion_matrix和classification_report分别是绘制准确率的表和记录具体准确率的结果
from sklearn.metrics import confusion_matrix, classification_report
# sklearn不接受0和1以外的数据类型,因此需要使用LabelBinarizer来对阿拉伯数字进行处理:将每一位数字转化为一个二维的数据形式
from sklearn.preprocessing import LabelBinarizer
from NeuralNetwork import NeuralNetwork
# 使用sklearn.cross_validation(交叉验证)包中的train_test_split来对数据进行快速的拆分(训练集和测试集)
from sklearn.cross_validation import train_test_splitdigits = load_digits()
# X 特征点/输入;y 标签/输出;
X = digits.data
y = digits.target
# normalize the values to bring them into the range 0-1
# 转换X的值域为[0, 1]
X -= X.min()
X /= X.max()nn = NeuralNetwork([64,100,10], 'logistic')
X_train, X_test, y_train, y_test = train_test_split(X, y)
# 转换y的值域为[0, 1]
labels_train = LabelBinarizer().fit_transform(y_train)
labels_test = LabelBinarizer().fit_transform(y_test)
print('start fitting')
nn.fit(X_train, labels_train, epochs=3000)
predictions = []
for i in range(X_test.shape[0]):  o = nn.predict(X_test[i] )  predictions.append(np.argmax(o))
print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))

结果:

[[43 0 0 0 1 1 0 0 0 0]

[0 35 0 0 0 0 1 0 3 5]

[0 2 42 3 0 0 0 0 0 0]

[0 0 0 41 0 0 0 0 1 0]

[0 0 0 0 40 0 0 0 2 0]

[0 0 0 0 0 44 0 0 0 1]

[0 0 0 0 0 0 44 0 1 0]

[0 0 0 0 1 0 0 53 0 1]

[0 1 0 2 0 2 0 0 36 0]

[0 0 0 0 0 2 0 3 0 39]]

precision recall f1-score support

0 1.00 0.96 0.98 45

1 0.92 0.80 0.85 44

2 1.00 0.89 0.94 47

3 0.89 0.98 0.93 42

4 0.95 0.95 0.95 42

5 0.90 0.98 0.94 45

6 0.98 0.98 0.98 45

7 0.95 0.96 0.95 55

8 0.84 0.88 0.86 41

9 0.85 0.89 0.87 44

avg / total 0.93 0.93 0.93 450

precision:精确率,测试图片中被预测正确的概率

recall:召回率,所有测试图片中对应数字的图片被正确预测的概率,比如所有数字为0的图片,只有96%被预测为0

f1-score:平衡F分数,是精确率和召回率的调和平均数。F1 = 2 * \frac{precision * recall}{precision + recall}

support:测试图片的数目

PS:材料学习自麦子学院,如有雷同,纯属学习

PS:注意事项,在Python2.7.5中,print推荐使用print()

4、监督学习--分类--神经网络相关推荐

  1. [Python人工智能] 三.theano实现分类神经网络及机器学习基础

    从本篇文章开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前两篇文章讲解了神经网络基础概念.Theano库的安装过程及基础用法.theano实现回归神经网络,这篇文章主要讲解机 ...

  2. 教你如何用Keras搭建分类神经网络

    摘要:本文主要通过Keras实现了一个分类学习的案例,并详细介绍了MNIST手写体识别数据集. 本文分享自华为云社区<[Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图 ...

  3. Lesson 8.38.4 二分类神经网络torch.nn.functional实现单层二分类网络的正向传播

    二.二分类神经网络:逻辑回归 1 二分类神经网络的理论基础 线性回归是统计学经典算法,它能够拟合出一条直线来描述变量之间的线性关系.但在实际中,变量之间的关系通常都不是一条直线,而是呈现出某种曲线关系 ...

  4. TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类

    TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类 目录 输出结果 代码设计 输出结果 代码设计 import tensorflow as tf import ...

  5. svm多分类代码_监督学习——分类算法I

    本文是监督学习分类算法的第一部分,简单介绍对样本进行分类的算法,包括 判别分析(DA) 支持向量机(SVM) 随机梯度下降分类(SGD) K近邻分类(KNN) 朴素贝叶斯分类(NaiveBayes) ...

  6. Keras——用Keras搭建分类神经网络

    文章目录 1.前言 2.用Keras搭建分类神经网络 2.1.导入必要模块 2.2.数据预处理 2.3.搭建模型 2.4.激活模型 2.5.训练+测试 1.前言 今天用 Keras 来构建一个分类神经 ...

  7. 监督学习--分类之决策树

    监督学习-分类-决策树 决策树使用树形分支结构分类事物 例: 小丽找对象,要求:高.帅.富 小明找对象,要求:美美美 if height >= 172:if hansom = '帅':if ri ...

  8. 多分类神经网络与原子核

    这个世界上能衰变的除了原子核还有什么别的吗?考虑衰变和分类这两个概念内在含义的高度一致性,多分类的神经网络为什么不能是一个原子核? (成核粒子A,成核粒子B)---81*30*2---(1,0)(0, ...

  9. 用二分类神经网络估算多分类神经网络迭代次数的经验公式

    神经网络的迭代次数n和收敛误差δ总能满足关系式 一个多分类网络的参数a至少大于对应二分类网络的参数a的和,参数b的绝对值约等于对应多个二分类网络b的绝对值的最大值 本文再次验证这个关系式,这次用的13 ...

最新文章

  1. 交换机和路由器有哪些区别?
  2. 世界坐标系到观察坐标系的变换步骤_《3D数学基础》提炼总结(九)矩阵和线性变换...
  3. Visual C++2005库的十项突破性变化
  4. c# unchecked关键字。byte 合并short
  5. 如何屏蔽PHP浏览器头信息X-Powered-By
  6. 非凸函数上,随机梯度下降能否收敛?能,但有条件,且比凸函数收敛更难
  7. Anaconda 安装 Python 库(MySQLdb)的方法
  8. JavaScript prototype 属性
  9. RStudio-Desktop与RStudio-Server的启动方式
  10. html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...
  11. html5指南--6.创建离线web应用程序
  12. VC6.0打开或者添加工程文件崩溃的解决方法
  13. 网站SEO域名、URL路径优化
  14. jquery 下载 安装 浏览器支持
  15. 鸿蒙系统基于安卓10.0,鸿蒙系统呢?华为首批升级安卓10.0机型曝光:这11款!...
  16. HTTP状态码及对应原因
  17. mac使用Alfred搜索外接移动硬盘失败的解决方法
  18. java松鼠大战代码_松鼠大战2金手指版
  19. 【设计心理学】格式塔理论
  20. 大商圈.资本运作 书摘

热门文章

  1. 工业机器人三点工具定位法图文_工业机器人必会知识点,你掌握了吗?
  2. 密码学加解密实训(摩斯密码第1题)
  3. Python setattr()
  4. Openmeeting—视频会议部署文档
  5. 5000元性价比高的笔记本_求推荐5000元以下的高性价比笔记本电脑?
  6. 治疗忧郁症的好方法 .
  7. windows下Nginx相关命令
  8. 2022年软考报名时间及入口汇总表
  9. 软件设计师---计算机网络
  10. 华为手机安装NM卡无法识别