======================================================================

本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正

转载请注明出处,谢谢

======================================================================

scikit-learn博主使用的是0.17版本,是稳定版,当然现在有0.18发行版,两者还是有区别的,感兴趣的可以自己官网上查看

scikit-learn0.17(and 之前)上对于Neural Network算法 的支持仅限于 BernoulliRBM

scikit-learn0.18上对于Neural Network算法有三个  neural_network.BernoulliRBM ,neural_network.MLPClassifier,neural_network.MLPRgression 

具体可参考:点击阅读

1:神经网络算法简介

2:Backpropagation算法详细介绍

3:非线性转化方程举例

4:自己实现神经网络算法NeuralNetwork

5:基于NeuralNetwork的XOR实例

6:基于NeuralNetwork的手写数字识别实例

7:scikit-learn中BernoulliRBM使用实例

8:scikit-learn中的手写数字识别实例

一:神经网络算法简介

1:背景

以人脑神经网络为启发,历史上出现过很多版本,但最著名的是backpropagation

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

多层向前神经网络组成部分

输入层(input layer),隐藏层(hiddenlayer),输出层(output layer)

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

3:设计神经网络结构

    3.1使用神经网络训练数据之前,必须确定神经网络层数,以及每层单元个数
    3.2特征向量在被传入输入层时通常被先标准化(normalize)和0和1之间(为了加强学习过程)
    3.3离散型变量可以被编码成每一个输入单元对应一个特征可能赋的值
        比如:特征值A可能取三个值(a0,a1,a2),可以使用三个输入单元来代表A
                    如果A=a0,那么代表a0的单元值就取1,其他取0
                    如果A=a1,那么代表a1的单元值就取1,其他取0,以此类推
    3.4神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题
         3.4.1对于分类问题,如果是2类,可以用一个输入单元表示(0和1分别代表2类)
                                         如果多于两类,每一个类别用一个输出单元表示
                所以输入层的单元数量通常等于类别的数量 
        3.4.2没有明确的规则来设计最好有多少个隐藏层
               3.4.2.1根据实验测试和误差,以及准确度来实验并改进

4:算法验证——交叉验证法(Cross- Validation)

解读: 有一组输入集A,B,可以分成三组,第一次以第一组为训练集,求出一个准确度,第二次以第二组作为训练集,求出一个准确度,求出准确度,第三次以第三组作为训练集,求出一个准确度,然后对三个准确度求平均值

二:Backpropagation算法详细介绍

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

2:输入层输入数

经过权重计算得到第一层的数据,第一层的数据作为第二层的输入,再次经过权重计算得到结果,结果和真实值之间是存在误差的,然后根据误差,反向的更新每两个连接之间的权重

3:算法详细介绍

输入:D : 数据集,| 学习率(learning rate),一个多层前向神经网络

    输出:一个训练好的神经网络(a trained neural network)
    3.1初始化权重(weights)和偏向(bias):随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向
    3.2对于每一个训练实例X,执行以下步骤:
         3.2.1:由输入层向前传送,输入->输出对应的计算为:
                              
                                         
                   计算得到一个数据,经过f 函数转化作为下一层的输入,f函数为:
          3.2.2:根据误差(error)反向传送
                     对于输出层(误差计算):  Tj:真实值,Qj表示预测值
 
                     对于隐藏层(误差计算):  Errk 表示前一层的误差, Wjk表示前一层与当前点的连接权重
                       
                     权重更新:  l:指学习比率(变化率),手工指定,优化方法是,随着数据的迭代逐渐减小
                     偏向更新:  l:同上
       3.3:终止条件
           3.3.1权重的更新低于某个阀值
           3.3.2预测的错误率低于某个阀值
           3.3.3达到预设一定的循环次数

4:结合实例讲解算法

0.9对用的是L,学习率

三:非线性转化方程举例

在二中Activation Function对计算结果进行转换,得到下一层的输入,这里用到的f函数就是非线性转换函数,Sigmoid函数(S曲线)用来做f函数,Sigmoid函数是一类函数,只要S曲线满足一定的性质就可以作为activation Function函数

Sigmoid函数:

常见的Sigmoid函数

1:双曲函数(参考百科,下面以tan函数为例)

双曲函数的导数为:

2:逻辑函数(Logistic函数)

逻辑函数的导数形式为:

四:自己实现神经网络算法NeuralNetwork

建立NeuralNetwork.py,添加以下代码

#coding:utf-8
'''
Created on 2016/4/27@author: Gamer Think
'''
import numpy as np#定义双曲函数和他们的导数
def tanh(x):return np.tanh(x)def tanh_deriv(x):return 1.0 - np.tanh(x)**2def logistic(x):return 1/(1 + np.exp(-x))def logistic_derivative(x):return logistic(x)*(1-logistic(x))#定义NeuralNetwork 神经网络算法
class NeuralNetwork:#初始化,layes表示的是一个list,eg[10,10,3]表示第一层10个神经元,第二层10个神经元,第三层3个神经元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 = logisticself.activation_deriv = logistic_derivativeelif activation == 'tanh':self.activation = tanhself.activation_deriv = tanh_derivself.weights = []#循环从1开始,相当于以第二层为基准,进行权重的初始化for i in range(1, len(layers) - 1):#对当前神经节点的前驱赋值self.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是每个实例对应的结果,learning_rate 学习率, # epochs,表示抽样的方法对神经网络进行更新的最大次数def fit(self, X, y, learning_rate=0.2, epochs=10000):X = np.atleast_2d(X) #确定X至少是二维的数据temp = np.ones([X.shape[0], X.shape[1]+1]) #初始化矩阵temp[:, 0:-1] = X  # adding the bias unit to the input layerX = tempy = np.array(y) #把list转换成array的形式for k in range(epochs):#随机选取一行,对神经网络进行更新i = np.random.randint(X.shape[0]) a = [X[i]]#完成所有正向的更新for l in range(len(self.weights)):a.append(self.activation(np.dot(a[l], self.weights[l])))#error = y[i] - a[-1]deltas = [error * self.activation_deriv(a[-1])]#开始反向计算误差,更新权重for l in range(len(a) - 2, 0, -1): # we need to begin at the second to last layerdeltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))deltas.reverse()for i in range(len(self.weights)):layer = np.atleast_2d(a[i])delta = np.atleast_2d(deltas[i])self.weights[i] += learning_rate * layer.T.dot(delta)#预测函数            def predict(self, x):x = np.array(x)temp = np.ones(x.shape[0]+1)temp[0:-1] = xa = tempfor l in range(0, len(self.weights)):a = self.activation(np.dot(a, self.weights[l]))return a

五:基于NeuralNetwork的XOR(异或)示例

代码如下:

<span style="font-size:18px;">#coding:utf-8
'''
Created on 2016/4/27@author: Gamer Think
'''import numpy as np
from NeuralNetwork import NeuralNetwork
'''
[2,2,1]
第一个2:表示 数据的纬度,因为是二维的,表示两个神经元,所以是2
第二个2:隐藏层数据纬度也是2,表示两个神经元
1:表示输入为一个神经元
tanh:表示用双曲函数里的tanh函数
'''
nn = 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)) </span>

输出结果:

([0, 0], array([ 0.02150876]))
([0, 1], array([ 0.99857695]))
([1, 0], array([ 0.99859837]))
([1, 1], array([ 0.04854689]))

六:基于NeuralNetwork的手写数字识别示例

代码如下:

<span style="font-size:18px;">import numpy as np
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.preprocessing import LabelBinarizer
from sklearn.cross_validation import train_test_split
from NeuralNetwork import NeuralNetworkdigits = load_digits()
X = digits.data
y = digits.target
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)
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) </span>

输出结果:

七:scikit-learn中的BernoulliRBM使用实例

<span style="font-family:Microsoft YaHei;font-size:18px;">from sklearn.neural_network import BernoulliRBM
X = [[0,0],[1,1]]
y = [0,1]
clf = BernoulliRBM().fit(X,y)
print clf</span>

输出结果为:

BernoulliRBM(batch_size=10, learning_rate=0.1, n_components=256, n_iter=10,
       random_state=None, verbose=0)

注意此模块不支持predict函数,这与以往的算法有很大的不同

八:scikit-learn中的手写数字识别实例

<span style="font-family:Microsoft YaHei;font-size:18px;">import numpy as np
import matplotlib.pyplot as pltfrom scipy.ndimage import convolve
from sklearn import linear_model, datasets, metrics
from sklearn.cross_validation import train_test_split
from sklearn.neural_network import BernoulliRBM
from sklearn.pipeline import Pipeline###############################################################################
# Setting updef nudge_dataset(X, Y):"""This produces a dataset 5 times bigger than the original one,by moving the 8x8 images in X around by 1px to left, right, down, up"""direction_vectors = [[[0, 1, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[1, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 1],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 1, 0]]]shift = lambda x, w: convolve(x.reshape((8, 8)), mode='constant',weights=w).ravel()X = np.concatenate([X] +[np.apply_along_axis(shift, 1, X, vector)for vector in direction_vectors])Y = np.concatenate([Y for _ in range(5)], axis=0)return X, Y# Load Data
digits = datasets.load_digits()
X = np.asarray(digits.data, 'float32')
X, Y = nudge_dataset(X, digits.target)
X = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001)  # 0-1 scalingX_train, X_test, Y_train, Y_test = train_test_split(X, Y,test_size=0.2,random_state=0)# Models we will use
logistic = linear_model.LogisticRegression()
rbm = BernoulliRBM(random_state=0, verbose=True)classifier = Pipeline(steps=[('rbm', rbm), ('logistic', logistic)])###############################################################################
# Training# Hyper-parameters. These were set by cross-validation,
# using a GridSearchCV. Here we are not performing cross-validation to
# save time.
rbm.learning_rate = 0.06
rbm.n_iter = 20
# More components tend to give better prediction performance, but larger
# fitting time
rbm.n_components = 100
logistic.C = 6000.0# Training RBM-Logistic Pipeline
classifier.fit(X_train, Y_train)# Training Logistic regression
logistic_classifier = linear_model.LogisticRegression(C=100.0)
logistic_classifier.fit(X_train, Y_train)###############################################################################
# Evaluationprint()
print("Logistic regression using RBM features:\n%s\n" % (metrics.classification_report(Y_test,classifier.predict(X_test))))print("Logistic regression using raw pixel features:\n%s\n" % (metrics.classification_report(Y_test,logistic_classifier.predict(X_test))))###############################################################################
# Plottingplt.figure(figsize=(4.2, 4))
for i, comp in enumerate(rbm.components_):plt.subplot(10, 10, i + 1)plt.imshow(comp.reshape((8, 8)), cmap=plt.cm.gray_r,interpolation='nearest')plt.xticks(())plt.yticks(())
plt.suptitle('100 components extracted by RBM', fontsize=16)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)plt.show()</span>

显示结果:

附:博主对于前边的原理其实很是明白了,但是对于scikit-learn实现手写数字识别系统这个代码优点迷乱,如果路过大神明白的,可以给小弟指点迷津

scikit-learn博主使用的是0.17版本,是稳定版,当然现在有0.18发行版,两者还是有区别的,感兴趣的可以自己官网上查看
<span style="font-family:Microsoft YaHei;font-size:18px;">import numpy as np
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.preprocessing import LabelBinarizer
from sklearn.cross_validation import train_test_split
from NeuralNetwork import NeuralNetworkdigits = load_digits()
X = digits.data
y = digits.target
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)
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) </span>

scikit-learn学习之神经网络算法相关推荐

  1. 深度学习之 神经网络算法原理

    深度学习之 神经网络算法原理 什么是神经网络算法? 初中映射 神经网络 求映射? 求解参数 图解求参 参考文献 什么是神经网络算法? 初中映射 初中的时候 y = f(x) 老师进过 映射 . 通过 ...

  2. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  3. 人工神经网络的应用实例,人工神经网络算法实例

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  4. 人工神经网络算法实例代码,人工神经网络算法步骤

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  5. 人工神经网络应用实例,人工神经网络算法实例

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  6. 神经网络算法实例说明,简单神经网络算法原理

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  7. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  8. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

  9. python scikit learn 关闭开源_scikit learn 里没有神经网络?

    本教程的代码和数据来自于 Springboard 的博客教程,希望能为你提供帮助.作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:ht ...

最新文章

  1. 医疗实体链接(标准化)论文解读 (附代码) A Lightweight Neural Model for Biomedical Entity Linking
  2. poj2774 sa模版
  3. 关于 SAP 电商云 Spartacus UI 访问 b2b site 的权限问题
  4. 逐步回归 图像降维matlab,使用matlab对训练样本图像降维,并对测试图像使用变换矩阵降维并重构...
  5. Green Plum测试报告
  6. 机器视觉光源学习总结——开孔背光源
  7. pdf签名无效解决办法_我花了一整天测试了20+款PDF工具,进来评评谁是MVP
  8. java digester_使用digester解析XML配置文件
  9. 微信小程序登录-开发文档
  10. android指南针校准 代码_Android:指南针的制作
  11. TCP四次挥手中的2MSL是什么?
  12. flea-common使用之通用策略模式实现
  13. TypeError: ctor is not a constructor报错
  14. 排位赛三B. Loan Repayment
  15. Mysql学习总结十二:系统变量、用户变量、定义条件和处理程序
  16. WijmoJS 中自定义 React 菜单和列表项模板
  17. python抓取数据库数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储...
  18. 小白畅聊区块链的容量问题
  19. 西门子s7-200入门到精通视频教程-第32课
  20. SpringBoot Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration

热门文章

  1. 解决 python中 使用tesserocr,File tesserocr.pyx, line 2401, in tesserocr._tesserocr.image_to_text 报错问题...
  2. IPsec ***数据传输过程
  3. HTML 5.1 的 14 个新特性(含使用案例)
  4. 好记性不如烂笔头——.NET运行原理
  5. Became Jane(成为简.奥斯丁)
  6. 炫天塔罗占卜结果......
  7. Linux关机运行的脚本,Linux 关机 脚本
  8. python给空列表赋值_Python Pandas:如果数据是NaN,则更改为0,否则在数据框中更改为1...
  9. python随机产生10个随机数_python(random模块)取10以内的随机数
  10. php-fpm 进程在云服务器cpu分配不均匀