Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

神经网络理论基础及 Python 实现

$
0
0
神经网络理论基础及 python 实现

一点号复旦大数据5小时前

一、多层前向神经网络

输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;

除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;

一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程;


php?url=0FJNpcUiAh" alt="神经网络理论基础及 Python 实现" />

使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;

为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;

如果A=a0,则代表a0的单元值取1,其余取0;

如果A=a1,则代表a1的单元值取1,其余取0;

如果A=a2,则代表a2的单元值取1,其余取0;


神经网络理论基础及 Python 实现

神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。

没有明确的规则来设计最佳个数的隐藏层,一般根据实验测试误差和准确率来改进实验。

如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。

在机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。


神经网络理论基础及 Python 实现

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

对比经过神经网络后预测值与真实值之间的差;

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

4.1、算法详细介绍

输入:数据集、学习率、一个多层神经网络构架;

输出:一个训练好的神经网络;

初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:

1、由输入层向前传送:

结合神经网络示意图进行分析:


神经网络理论基础及 Python 实现

由输入层到隐藏层:

两个公式进行总结,可以得到:

Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:


神经网络理论基础及 Python 实现

当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:

2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值

权重更新:其中l为学习率

3、终止条件

4、非线性转化函数

五、BP神经网络的python实现

def tanh(x):

return1.0-np.tanh(x)*np.tanh(x)

def logistic(x):

return1/(1+np.exp(-x))

def logistic_derivative(x):

设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。

classNeuralNetwork:

def __init__(selflayersactivation='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"

"""

ifactivation=='logistic':

self.activation=logistic

self.activation_deriv=logistic_derivative

elifactivation=='tanh':

self.activation=tanh

self.activation_deriv=tanh_deriv

self.weights=

foriinrange(1len(layers)-1):

self.weights.append((2*np.random.random((layers[i-1]+1layers[i]+1))-1)*0.25) self.weights.append((2*np.random.random((layers[i]+1layers[i+1]))-1)*0.25)

def fit(selfXylearning_rate=0.2epochs=10000):

X=np.atleast_2d(X)

temp=np.ones([X.shape[0],X.shape[1]+1]) temp[:0:-1]=X

X=temp

y=np.array(y)

forkinrange(epochs):

i=np.random.randint(X.shape[0]) a=[X[i]]

forlinrange(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])]

forlinrange(len(a)-20-1):

deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))

deltas.reverse

foriinrange(len(self.weights)):

layer=np.atleast_2d(a[i]) delta=np.atleast_2d(deltas[i]) self.weights[i]+=learning_rate *layer.T.dot(delta)

x=np.array(x)

temp=np.ones(x.shape[0]+1) temp[0:-1]=x

a=temp

forlinrange(0len(self.weights)):

a=self.activation(np.dot(aself.weights[l]))

from BP import NeuralNetwork

import numpyasnp

nn=NeuralNetwork([221],'tanh') x=np.array([[00],[01],[10],[11]]) y=np.array([1001])

nn.fit(xy0.110000)

foriin[[00],[01],[10],[11]]: ([00],array([0.99738862])) ([01],array([0.00091329])) ([10],array([0.00086846])) ([11],array([0.99751259]))

回复下列数字即可获得相应干货下载:

1:一百多篇大数据文档下载!

2:超全数据分析资料免费下载!(包括SQL,R语言,SPSS,SAS,python,数据分析和数据挖掘)

3:清华大学数据科学院讲座内容集锦免费下载!

4:20G!超全数据分析 视频 教程免费下载!(包括R语言,SPSS,统计学基础,excel,数据挖掘,医学统计)

5:Python超全资料分享!


Viewing all articles
Browse latest Browse all 9596

Latest Images

Trending Articles