CSS Ribbon

Reproducing the GitHub Ribbon in CSS

【算法学习】神经网络

神经网络对于深度学习是十分重要的,线性回归做预测,逻辑回归做分类,神经网络是用来做预测的,预测和分类都属于机器学习
多元线性回归是线性的模型,需要对点进行拟合,要找直线的最优解,要评估误差损失最小的时刻,一般直线无法穿过所有的点,如何更完美的穿过所有的就用到多项式回归
非线性数据变成线性数据
如果数据变化是非线性的,那么选用线性的算法的拟合效果就不会太好,拟合的结果就不会太高,分类或者预测的效果就不会特别高
1.直接变换数据
2.选择非线性的算法,达到拟合的效果(神经网络就是非线性的算法,神经网络可以是十分复杂,非线性的算法可以解决更加复杂的问题,深度学习的时候的基础就是神经网络)
深度学习就是神经网络(卷积神经网络或者人工神经网络)的层级比较多
神经网络就是仿生物的一种算法,是实在的拟人的一种算法
神经网络解析
1.一只猫的神经元大约有10亿个,一只老鼠约有7500万个,一只蟑螂约有100万个神经元,相比之下,许多人工神经网络只有几百个神经元
2.机器学习往往只是为了解决某一个特定的问题,人工智能也是要专门用来识别某些特定的功能的方式,每个不同的方面需要不同的算法或者模型去单独负责,所以一个人工智能需要很多的算法或者模型去组成
 

人工神经网络

人工神经网络(ANN:Artificial Neural Network),简称神经网络(NN:Neural Network)。迄今为止,人工神经网络尚无统一定义,其实一种模拟了人体神经元构成的数学模型,依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的
 
上图显示了人工神经网络是一个分层模型,逻辑上可以分为三层:
  • 输入层:输入层接收特征向量 xx。
  • 输出层:输出层产出最终的预测 hh。
  • 隐含层:隐含层介于输入层与输出层之间,之所以称之为隐含层,是因为当中产生的值并不像输入层使用的样本矩阵 XX 或者输出层用到的标签矩阵 yy 那样直接可见。
如果神经网络内的线性全是多元线性回归的算法的组合,那么组合还是线性的就是不好的
从生物神经元到人工神经元
  • 激活函数:将神经元的净输入信号转换为单一的输入信号,以便进一步在网络中传播(实际上每一个神经元单独拆开来看,一个神经元就是单独的一个逻辑回归函数)
  • 网络拓扑:描述了模型中神经元的数量以及层数和他们的连接方式
  • 训练算法:指定如何设置连接权重,以便抑制或增加神经元在输入信号中的比重
            
激活函数
1.动物的神经元
一般就是step function阈值函数
2.机器的神经元
线性函数、阶跃函数、斜坡函数、S 型函数、双曲正切函数、高斯函数
 

 
神经网络要考虑的基本要素有哪些?
激活函数的选择,对应神经元里的逻辑,两部分,相乘和相加和非线性的变化,相乘相加是固定不变的,非线性的变化可以有很多选择,需要根据实际的效果来
处理更加复杂的逻辑,就需要更多的网络拓扑结构,需要设置更多的人工神经元,在去求解神经网络模型的时候w,w1,wn的时候选择什么样的优化算法(随机梯度下降一样适用)
激活函数有哪些?
常用的函数有(更完全的拟人)
  • sigmod函数,[0,1]的取值范围
  • Tangent函数,[-1,1]的取值范围
  • Relu函数,max(0,x)的逻辑
 
网络拓扑层-单层网络
通常数据有很多的维度特征(x1,x2,y)等,将特征带入到算法里面去,每一列就是每个维度,实际上是一行一行的往网络内部去放入,网络拓扑的每个神经线上有一个权重
最后的Y结果是已知的,用x,y来反解,得到公式,每一次来调整带入的参数,单层网络实际上就是多个逻辑回归构成的网络
 
网络拓扑层-多层网络

和单层网络相比,多了一层隐藏层,隐藏层可以是一层也可以是多层,以需求来定,隐藏层更多网络结构就更复杂
隐藏层到底隐藏了什么呢?
每一个隐藏层就是多一次推理和演绎的过程,每多一个隐藏层就是推理和演绎的深度更多,考虑的更深入,隐藏层的隐藏节点如果比之前的数据节点数要多,相当于进行了升维,考虑的因素更多,隐藏层的隐藏节点比之前的数据节点数要少就是进行了降维,相当于对原数据进行归纳和总结。
神经网络最主要的功能就是推理和演绎的功能,升高维度的目的是为了站在更多的角度去审视数据,站在更高的角度去分析数据,输入层有3个节点,隐藏层每多一个层就是多一个预测的结果,隐藏层神经元的个数和元数据维度相比,多则是升维,少则是降维。
 
from sklearn.neural_network import MLPClassifier
# 从神经网络的模块导入
#X有两个维度,第一行有两个维度是00,第二行有2个维度是11,y是分类的类别是0,1两个
X = [[0., 0.], [1., 1.]]
y = [0, 1]

# MLPClassifier内的参数slover为sgd(实际上就是随机梯度下降)
# hidden_layer_sizes连接数是5X2指的是由几个隐藏层,这里指的就是有2个隐藏层,第一个隐藏层有5个节点,第二个隐藏层有2个节点
# hidden_layer_sizes=(20, 10 ,5)就是有3个隐藏层,第一个有20个节点,第二个有10个节点,第三个有5个节点
clf = MLPClassifier(solver='sgd', alpha=1e-5,activation='logistic',
                    hidden_layer_sizes=(5, 2), max_iter=2000, tol=1e-4)
clf.fit(X, y)

predicted_value = clf.predict([[2., 2.], [-1., -2.]])
print(predicted_value)
predicted_proba = clf.predict_proba([[2., 2.], [-1., -2.]])
print(predicted_proba)
print([coef.shape for coef in clf.coefs_])
# print([coef for coef in clf.coefs_])
神经网络案例

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2018-10-09 17:23  pandaboy1123  阅读(459)  评论(0编辑  收藏  举报

导航