神经元的广泛互联与并行工作必然使整个网络呈现出高度的非线性特点。在客观世界中,许多系统的输入与输出之间存在着复杂的非线性关系,对于这类系统,往往很难用传统的数理方法建立其数学模型。设计合理地神经网络通过对系统输入输出样本对进行自动学习,能够以任意精度逼近任何复杂的非线性映射。神经网络的这一优点能使其可以作为多维非线性函数的通用数学模型。该模型的表达式非解析的,输入输出数据之间的映射规则由神经网络在学习阶段自动抽取并分布式存储在网络的所有连接中。具有非线性映射功能的神经网络应用十分广阔,几乎涉及所有领域。
Dataset
本文的数据集是常见的官方数据集鸢尾花iris.csv,该数据集的特征如下:
sepal_length - Continuous variable measured in centimeters. sepal_width - Continuous variable measured in centimeters. petal_length - Continuous variable measured in centimeters. petal_width - Continuous variable measured in centimeters. species - Categorical. 2 species of iris flowers, Iris-virginica orIris-versicolor.
import pandas import matplotlib.pyplot as plt import numpy as np iris = pandas.read_csv("iris.csv") # shuffle rows shuffled_rows = np.random.permutation(iris.index) iris = iris.loc[shuffled_rows,:] print(iris.head()) ''' sepal_length sepal_width petal_length petal_width species 80 7.4 2.8 6.1 1.9 Iris-virginica 84 6.1 2.6 5.6 1.4 Iris-virginica 33 6.0 2.7 5.1 1.6 Iris-versicolor 81 7.9 3.8 6.4 2.0 Iris-virginica 93 6.8 3.2 5.9 2.3 Iris-virginica ''' # There are 2 species print(iris.species.unique()) ''' ['Iris-virginica' 'Iris-versicolor'] ''' iris.hist() plt.show()
1234567891011121314151617181920212223下面是数据集的每个特征取值的分布。
Neurons
目前为止,我们讨论的问题都是线性的,比如在二维例子里能找到一条曲线将数据纯净的分离开。但是,有的数据线性不可分的,比如:
无论是线性回归还是逻辑回归都无法建立这样一个函数可以将这个数据分离开,因此必须采用神经网络这样的可以处理非线性数据的模型。这些模型是由一系列神经元组成,然后输出预测的结果。神经元接受一些输入,应用一个转换函数,并返回一个输出。下面我们看看一个神经元的例子,其中输入为5个值,一个偏差单元(类似线性模型中的截距),4个特征。
这些单元进入到激活函数h里面。我们可以用一个逻辑激活函数g将这些输入转化为一个0到1之间的概率值输出,可以发现前面学习的逻辑回归函数是可以用作这里的一个神经元的。:
下面这段代码:将样本的第一行输入到神经元中,激活函数是逻辑函数,权值为随机,打印输出:
# 添加一个值全为1的属性iris["ones"],截距 iris["ones"] = np.ones(iris.shape[0]) X = iris[['ones', 'sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values # 将Iris-versicolor类标签设置为1,Iris-virginica设置为0 y = (iris.species == 'Iris-versicolor').values.astype(int) # The first observation x0 = X[0] # 随机初始化一个系数列向量 theta_init = np.random.normal(0,0.01,size=(5,1)) def sigmoid_activation(x, theta): x = np.asarray(x) theta = np.asarray(theta) return 1 / (1 + np.exp(-np.dot(theta.T, x))) a1 = sig
1234567891011121314151617