全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
979 0
2020-11-18
很少有机器学习问题(使用Python实现)
.反向传播
在机器学习数学:多元演算课程在线课程中,该问题也作为作业问题出现。问题的描述来自作业本身。  
在这项作业中,我们将训练神经网络绘制曲线。曲线采用一个输入变量,沿着曲线从0到1的行进量,并返回2个输出,即曲线上点位置的2D坐标。      
下表显示了数据集的前几行。这里x是输入变量,y1,y2是输出变量。     
X1122
00.000.5000000.625000
1个0.010.5000990.627015
20.020.5007880.632968
30.030.5026320.642581
40.040.5061520.655407
50.050.5118030.670852
60.060.5199550.688198
70.070.5308750.706641
80.080.5447230.725326
90.090.5615370.743386
下图显示了数据的外观:
3
p2.png1
为了帮助捕获曲线的复杂性,我们将在网络中分别使用6个和7个神经元的两个隐藏层。  
bigNet.png
我们要实现的函数来计算雅可比的的成本函数,相对于网络的重量和偏见。该代码将构成随机最速下降算法的一部分,该算法将训练我们的网络。     
前馈
下图显示了前馈方程,
f1?w=150&h=43 150w“ size =”(最大宽度:208px)100vw,208px“ />
在下面的python代码(来自相同的赋值)中,定义了用于建立神经网络的函数。即激活函数 σ (z ),它的导数 σ ′(z ),用于初始化权重和偏差的函数,以及使用前馈计算网络的每次激活的函数。
在此分配中,我们将 逻辑函数 用作激活函数,而不是更熟悉的 tanh 或relu 。
f2.png
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sigma = lambda z : 1 / (1 + np.exp(-z))
d_sigma = lambda z : np.cosh(z/2)**(-2) / 4
# This function initialises the network with it's structure
def reset_network (n1 = 6
global W1
W1 = random.randn(n1
W2 = random.randn(n2
W3 = random.randn(2
b1 = random.randn(n1
b2 = random.randn(n2
b3 = random.randn(2
# This function feeds forward each activation to the next layer. It returns all weighted sums and activations.
def network_function(a0) :
z1 = W1 @ a0 + b1
a1 = sigma(z1)
z2 = W2 @ a1 + b2
a2 = sigma(z2)
z3 = W3 @ a2 + b3
a3 = sigma(z3)
return a0
# This is the cost function of a neural network with respect to a training set.
def cost(x
return np.linalg.norm(network_function(x)[-1] - y)**2 / x.size
反向传播
接下来,我们需要针对权重和偏差实现成本函数的雅可比函数。我们将从最简单的第3层开始,然后向后遍历各层。   
f7.png
f3.png
以下python代码显示了如何实现J_W3函数。  
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Jacobian for the third layer weights.
def J_W3 (x
# First get all the activations and weighted sums at each layer of the network.
a0
# We'll use the variable J to store parts of our result as we go along
# Firstly
J = 2 * (a3 - y)
# Next multiply the result we've calculated by the derivative of sigma
J = J * d_sigma(z3)
# Then we take the dot product (along the axis that holds the training examples) with the final partial derivative
# i.e. dz3/dW3 = a2
# and divide by the number of training examples
J = J @ a2.T / x.size
# Finally return the result out of the function.
return J
以下python代码段实现了 Gradient Descent 算法(其中参数攻击性表示学习率,噪声在此处用作正则化参数):        
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
while iterations < max_iteration:
j_W1 = J_W1(x
j_W2 = J_W2(x
j_W3 = J_W3(x
j_b1 = J_b1(x
j_b2 = J_b2(x
j_b3 = J_b3(x
W1 = W1 - j_W1 * aggression
W2 = W2 - j_W2 * aggression
W3 = W3 - j_W3 * aggression
b1 = b1 - j_b1 * aggression
b2 = b2 - j_b2 * aggression
b3 = b3 - j_b3 * aggression
下图和动画显示了随着训练时间的延长,带有神经网络的预测曲线(粉红色/橙色)如何接近原始曲线(绿色)。
学习率= 7
出1
out_10001
下图和动画显示了在不同迭代中学习的所有曲线。
出1_out_10001
学习率= 1
out1_1.gif
out_10001
我们可以更改最速下降算法的参数,例如,学习步骤有多积极,以及要添加多少噪声。下图显示了一些参数值的实际和预测曲线。
res.png
我们可以为参数的不同值计算模型误差(实际输出与预测输出之间的平方偏差之和)。下一个热图显示模型误差如何随攻击性和噪声参数值的变化而变化。
4
2.内核感知器
这个问题出现在UCSD的edX课程“机器学习基础”课程中(由Sanjay Dasgupta教授教授)。  
我们需要实现Kernel Perceptron算法来对一些不可线性分离的数据集进行分类。该算法应允许使用二次方和RBF内核之类的内核。
下图描述了内核感知器的理论和算法(双重形式)。可以看出,可以在训练和预测时都使用内核技巧来避免基础扩展(通过用Mercer内核替换扩展特征向量的点积)。   
f1.png
我们将使用双重感知器算法进行分类的数据集是二维数据集,每个数据点都带有标签+1或-1,数据集的前几个数据点如下所示:  
X1X2?
01.01.01.0
1个2.01.01.0
23.01.01.0
34.01.01.0
45.01.01.0
数据点的底线由它们的颜色(红色和黑色)和标记类型(分别为圆形和三角形)表示。
在特定迭代中错误分类的数据点以蓝色显示。
当选择了一个误分类点,对应的α值是向上票选,这是通过在数据点的大小增加表明。
这两类的决策边界分别用绿色和洋红色显示。
下图和动画显示了使用带有RBF和二次核的核感知器对数据集的分类。下一个python代码片段实现了内核功能。
1个
2
3
4
5
6
7
import numpy as np
def kernel(x
if type == 'rbf':
return np.exp(-np.dot(x-z
if type == 'quadratic':
return (1 + np.dot(x
return np.dot(x
结果
下图/动画显示了使用(Dual)Kernel Perceptron Algorithm的python实现的分类结果。
数据集1
核Perceptron算法不会在具有二次核的数据集中收敛。下图显示了高斯核算法和决策边界的收敛性。
kp1
out1_008_051
数据集2
RBF内核的结果
2个out2_002_035
二次核的结果
kp2qout2q_008_035
数据集3
核Perceptron算法不会在具有二次核的数据集中收敛。下图显示了高斯核算法和决策边界的收敛性。
C 是软边距参数的设置 C (默认值:1.0)
s (对于RBF内核)是缩放参数 s (默认值:1.0)
kp3
out3_003_089
数据集4
RBF内核的结果
kp4
out4_004_075
二次核的结果
kp4qout4q_006_075
数据集5
核Perceptron算法不会在具有二次核的数据集中收敛。下图显示了高斯核算法和决策边界的收敛性。 5天out5_002_059
使用内核SVM分类器(sklearn)的结果
以下代码和附图显示了使用sklearn SVC学习的决策边界和支持向量(较大的数据点)。   
1个
2
3
4
5
6
from sklearn.svm import SVC
x = data[:
y = data[:
clf = SVC(kernel=kernel
clf.fit(x
clf.support_
数据集1
使用多项式内核(度= 2,C = 1)
d1平方
使用RBF内核(C = 10,σ= 10)
d1s
数据集2
使用多项式内核(度= 2,C = 1)
d2平方HTTPS://sandipanweb.files.wordpress.com/2018/05/d2sq.png W = 150&... 150W,?w= 300&... 300w“ size =”(最大宽度:571px)100vw,571px“ />
使用RBF内核(C = 10,σ= 10)
d2s
数据集3
使用RBF内核(C = 10,σ= 10)
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群