Skip to main content

感知机Perceptron

  • 二类分类的线性分类模型
  • 输入:实例的特征向量
  • 输出:实例的类别+1,1+1,-1
  • 从属:判别模型
  • 目的:求出将训练数据进行线性划分的分离超平面
  • 基于:误分类的损失函数

感知机模型概要

1.感知机是根据输入实例的特征向量xx对其进行二类分类的线性分类模型:

f(x)=sign(wx+b)f(x)=\operatorname{sign}(w \cdot x+b)

感知机模型对应于输入空间(特征空间)中的分离超平面wx+b=0w \cdot x+b=0

2.感知机学习的策略是极小化损失函数:

minw,bL(w,b)=xiMyi(wxi+b)\min _{w, b} L(w, b)=-\sum_{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right)

损失函数对应于误分类点到分离超平面的总距离。

3.感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法,有原始形式和对偶形式。算法简单且易于实现。原始形式中,首先任意选取一个超平面,然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。

4.当训练数据集线性可分时,感知机学习算法是收敛的。感知机算法在训练数据集上的误分类次数kk满足不等式:

k(Rγ)2k \leqslant\left(\frac{R}{\gamma}\right)^{2}

当训练数据集线性可分时,感知机学习算法存在无穷多个解,其解由于不同的初值或不同的迭代顺序而可能有所不同。

感知机Perceptron 代码

numpy实现

# 数据线性可分,二分类数据
# 此处为一元一次线性方程
class Model:
def __init__(self):
self.w = np.ones(len(data[0]) - 1, dtype=np.float32)
self.b = 0
self.l_rate = 0.1
# self.data = data

def sign(self, x, w, b):
y = np.dot(x, w) + b
return y

# 随机梯度下降法
def fit(self, X_train, y_train):
is_wrong = False
while not is_wrong:
wrong_count = 0
for d in range(len(X_train)):
X = X_train[d]
y = y_train[d]
if y * self.sign(X, self.w, self.b) <= 0:
self.w = self.w + self.l_rate * np.dot(y, X)
self.b = self.b + self.l_rate * y
wrong_count += 1
if wrong_count == 0:
is_wrong = True
return 'Perceptron Model!'

def score(self):
pass

sklearn调包

from sklearn.linear_model import Perceptron
clf = Perceptron(fit_intercept=True,
max_iter=1000,
shuffle=True)
clf.fit(X, y)
# Weights assigned to the features.
print(clf.coef_)
# 截距 Constants in decision function.(bias)
print(clf.intercept_)