感知机模型
模型概念#

输入空间和输出空间#
假设空间#
和是感知机的模型参数,叫做权重向量,叫做偏置。表示和的内积,是符号函数,即

学习策略#
点到直线的距离
对于误分类点,如果,那么;反之,如果,那么。所以,将距离公式去掉绝对值,误分类点到超平面的距离可以表示为
损失函数的定义:误分类点到超平面的总距离
其中为误分类点的集合
对于感知机算法使用梯度下降法求解
在训练过程中,使用随机梯度下降法,随机选取一个误分类点,对,更新
问题:为什么参数更新的时候不需要考虑?
分离超平面通过和确定,对的方向没有影响,可以固定的大小为1。
从上述学习过程中可以看出来,假如和的初始值都设为,的初始值设为,那么在误分类点的驱动下的增量为,的增量为。设误分类点对和的修正次数为,那么最终,。
此时的模型可以表示为
算法#
感知机学习算法的原始形式#

class Perceptron:
def __init__(self, alpha=0.1):
self.alpha = alpha
self.w = None
self.b = None
def fit(self, X, y):
self.w = np.ones_like(X[0])
self.b = 0.0
flag = 1
while flag:
flag = 0
for xi, yi in zip(X, y):
if yi * (np.dot(self.w, xi) + self.b) <= 0:
self.w += self.alpha * yi * xi
self.b += self.alpha * yi
flag = 1
可视化结果
def plot(X, y, model):
w = model.w
b = model.b
print(w, b)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
plt.plot(range(5), [-w[0] / w[1] * x - model.b / w[0] for x in range(5)], c="b")
plt.xlabel("x [0]")
plt.ylabel("x [1]")
plt.title("Perceptron Algorithm")
plt.show()
def main():
model = Perceptron(alpha=1)
X = np.array([[3., 3.], [4., 3.], [1., 1.]])
y = np.array([1., 1., -1.])
model.fit(X, y)
plot(X, y, model)

感知机学习算法的对偶形式#

class Perceptron:
def __init__(self, alpha=0.1):
self.alpha = alpha
self.a = None
self.b = None
def fit(self, X, y):
self.a = np.zeros(X.shape[0])
self.b = 0.0
flag = 1
while flag:
flag = 0
for i, (xi, yi) in enumerate(zip(X, y)):
if yi * (sum([self.a[j] * y[j] * np.dot(x, xi) for j, x in enumerate(X)]) + self.b) <= 0:
self.a[i] += self.alpha
self.b += self.alpha * yi
flag = 1
可视化结果
def plot(X, y, model):
w = np.sum(np.array([model.a[i] * y[i] * x for i, x in enumerate(X)]), axis=0)
b = np.sum(np.array([model.a[i] * y[i] for i, x in enumerate(X)]), axis=0)
print(w, b)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
plt.plot(range(5), [-w[0] / w[1] * x - model.b / w[0] for x in range(5)], c="b")
plt.xlabel("x [0]")
plt.ylabel("x [1]")
plt.title("Perceptron Algorithm")
plt.show()
def main():
model = Perceptron(alpha=1)
X = np.array([[3., 3.], [4., 3.], [1., 1.]])
y = np.array([1., 1., -1.])
model.fit(X, y)
plot(X, y, model)

算法的收敛性#
详细证明过程参照李航老师《统计学习方法》
算法的收敛性证明表明,在数据集线性可分的情况下,搜索次数是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的超平面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步