阅读原文
感知机是二分类的线性分类器,对应于输入空间中将实例划分为正负两类的分离超平面,基于分类的损失函数,利用梯度下降法对损失函数进行最小化,求得感知及模型。
感知机算法
算法描述:
梯度下降
将损失函数梯度下降过程定义为函数
以下代码命名为perceptron.py
import numpy as np
#X是一个列表,形式如[[x1,y1],[x2,y2],...],Y是一个类别的集合,也是一个列表如[1,1,-1,-1,...],对应于X中的每一个实例,lrate是学习率
def gradient(X, Y, lrate):
w = np.matrix([0,0])
b = 0
length = len(X)
while True :
for i in range(length + 1):
if i == length:
return w, b
elif (Y[i]*(w * np.matrix(X[i]).T + b) <= 0):
w = w + lrate * Y[i] * np.matrix(X[i])
b = b + lrate * Y[i]
break
实例训练
训练数据集:X = {(3,3),(4,3),(1,1)}, Y = {1,1,-1}
规定学习率为1
以下代码命名为test.py
import perceptron
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据
X = [[3,3],[4,3],[1,1]]
Y = Y = [1,1,-1]
lrate = 1
#使用梯度下降求解划分平面参数w,b
w, b = perceptron.gradient(X, Y, lrate)
print(w, b)
#绘制划分超平面
linex = np.linspace(0,5,5)
liney = -(w[0,0]/w[0,1])*linex - (1/w[0,1])*b
plt.plot(linex, liney, color = 'r')
#绘制数据点
X = np.array(X)
Y = np.array(Y)
for i in range(0,len(X)):
if Y[i] == 1:
#正例用圆点表示
plt.scatter(X[i][0],X[i][1],marker="o",alpha=0.8,s=50)
else:
#负例用×表示
plt.scatter(X[i][0],X[i][1],marker="x",alpha=0.8,s=50)
#显示图片
plt.show()
在pyCharm下运行结果如下:
[[1 1]] -3
阅读原文
网友评论