感知器的实现

本篇实现了一个最简单的感知器,能够将下图中的两类数据分开。
感知器的实现_第1张图片

原理

我们假设有一个超平面可以将两类数据分开:
w T x = 0 w^Tx=0 wTx=0

其中, w T = [ w 0   w 1   w 2   . . .   w n ] w^T=[w_0 \ w_1 \ w_2 \ ... \ w_n] wT=[w0 w1 w2 ... wn]是系数, x T = [ 1   x 1   x 2   . . .   x n ] x^T=[1 \ x_1 \ x_2 \ ... \ x_n] xT=[1 x1 x2 ... xn]是数据的属性。如果,类别标签 y ∈ { − 1 ,   1 } y \in \{-1, \ 1\} y{1, 1},那么感知器的模型可表示为:
y = s g n ( w T x ) y = sgn(w^Tx) y=sgn(wTx)
初始时,令 w = 0 w=0 w=0, 对于使用感知器模型分错的样本,按照下列规则更新 w w w。对于线性可分的数据,迭代足够多的次数后就会收敛(注意:所谓的线性可分,即存在超平面 w T x = 0 w^Tx=0 wTx=0可以完全将数据分开)。
w ← w   +   y x w \leftarrow w\ + \ yx ww + yx

参考资料:
《神经网络与机器学习》邱锡鹏 https://github.com/nndl/nndl.github.io

代码

import numpy as np
import matplotlib.pyplot as plt

def f(x, y):
    return np.sign( 2 * x - 1 - y)

def model(x, y, w):
    return np.sign(w[0] * x + w[1] * y + w[2]);

#准备数据
x = np.random.rand(100)
y = np.random.rand(100)
z = f(x, y)

#生成感知器(随机梯度下降)
w = np.array([0, 0, 0]);
for i in range(10000):
    index = int(np.random.rand() * len(z))
    z_pre = model(x[index], y[index], w)
    if(z_pre != z[index]):
        w = w + z[index] * np.array([x[index], y[index], 1])

#显示
print(w)
t = np.linspace(0, 1, 100)
plt.scatter(x, y, c = z)
plt.plot(t, (- w[0] * t - w[2]) / w[1])
plt.show()

你可能感兴趣的:(python,编程,算法)