喜欢就点关注吧!
感知器算法是神经网络最早的形式,随着神经网络的不断发展与深化,感知器算法现在已经不经常使用了,但其原理对我们理解神经网络是非常有帮助的,而且感知器算法原理比较简单,理解起来难度不大。下面我们将从三个方面来解读一下感知器算法。
1.什么是Perceptron?
2.目标优化
3.在Python中实现
什么是Perceptron?
Perceptron由Frank Rosenblatt开发,并于1962年出版的“神经动力学原理:感知器和脑机制理论”一文中所提出。当时,Rosenblatt的文章被Marvin Minksy和Seymour Papert反对,认为神经网络有缺陷,只能解决线性分类问题。 然而,这种限制仅发生在单层神经网络中。Perceptron可用于解决二分类问题。 其算法的形式可以写成:
其中非线性激活函数表达式为:
像逻辑回归之类的算法是针对事件发生概率进行分诶,但对于Perceptron,使用目标值t = + 1作为第一类并且t = -1作为第二类更方便。 因此感知器算法没有分类概率,也不能处理K> 2分类问题。 另一个限制是算法只能处理固定基函数的线性组合。
目标优化
根据上面的两个公式,如果事件被正确分类则:
反之如果分类错误则
因此Perceptron的目标函数可写为:
M表示错误分类的事件数。通过取偏导数,我们可以得到损失函数的梯度:
我们可以初始化参数w和b ,然后随机选择错误分类事件,并使用随机梯度下降迭代更新参数w和b, 直到目标函数损失降到最低 :
在公式中,学习率a的范围从0到1。例如我们有3条记录, Y1 =(3,3),Y2 =(4,3),Y3 =(1,1) 。 Y1和Y2标记为+1, Y3标记为-1。 给定初始参数均为0。在第一轮中,通过应用前两个公式, Y3等于0,因此Y3被错误分类。 假设学习率等于1,通过应用上面显示的梯度下降,我们可以得到:
然后Perceptron分类器可以写成:
经过一轮梯度下降迭代的结果为下表所示:
上表显示了Perceptron经过循环遍历所有训练数据的梯度下降过程。 如果记录被正确分类,则权重向量w和b保持不变; 否则,当y = 1时,我们将向量x添加到当前权重向量上,当y = -1时,我们将当前权重向量w减去向量x 。 请注意最后3列是预测值,错误分类记录以红色突出显示。 如果我们迭代进行梯度下降,在第7次迭代中,所有事件都被正确标记。 即算法将停止。
在Python中实现
首先我们导入相应的函数库以及加载鸢尾花数据集
from sklearn import datasets
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
np.random.seed(10)
# Load data
iris=datasets.load_iris()
X = iris.data[0:99,:2]
y = iris.target[0:99]
可视化数据
# Plot figure
plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0')
plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
# Update y into -1 and 1
y=np.array([1 if i==1 else -1 for i in y])
使用梯度下降优化损失函数
#################################
# Gradient Descent
# Initialize parameters
w=np.ones((X.shape[1],1));
b=1;
learning_rate=0.1;
Round=0;
All_Correct=False;
# Start Gradient Descent
while not All_Correct:
misclassified_count=0
for i in range(X.shape[0]):
XX=X[i,]
yy=y[i]
if yy * (np.dot(wT,XX.T)+b)<0:
w+=learning_rate * np.dot(XX,yy).reshape(2,1)
b+=learning_rate * yy
misclassified_count +=1
if misclassified_count==0:
All_Correct=True
else:
All_Correct=False
Round += 1
print(Round)
print(w)
print(b)
使用stocastic梯度下降后,我们得到w =(7.9,-10.07)和b = -12.39。
x_points = np.linspace(4,7,10)
y_ = -(w[0]*x_points + b)/w[1]
plt.plot(x_points, y_)
plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0')
plt.plot(X[50:99, 0], X[50:99, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
分类结果
参考
https://towardsdatascience.com/an-introduction-to-perceptron-algorithm-40f2ab4e2099
深度学习与Python,专注于深度学习、机器学习前沿知识与资讯