【问题标题】:Perceptron in Python – Bias is incorrectPython 中的感知器——偏差不正确
【发布时间】:2017-03-15 07:02:23
【问题描述】:

对于某些输入X,例如:

[[ 1.456044 -7.058824]
 [-4.478022 -2.072829]
 [-7.664835 -6.890756]
 [-5.137363  2.352941]
 ...

还有Y,例如:

[ 1.  1.  1.  -1.  ...

这是我的感知器训练函数:

def train(self, X, Y, iterations=1000):
    # Add biases to every sample.
    biases = np.ones(X.shape[0])
    X = np.vstack((biases, X.T)).T
    w = np.random.randn(X.shape[1])
    errors = []

    for _ in range(iterations):
        all_corr = True
        num_err = 0
        for x, y in zip(X, Y):
            correct = np.dot(w, x) * y > 0
            if not correct:
                num_err += 1
                all_corr = False
                w += y * x
        errors.append(num_err)
        # Exit early if all samples are correctly classified.
        if all_corr:
            break

    self.w = perpendicular(w[1:])
    self.b = w[0]
    return self.w, self.b, errors

当我打印错误时,我通常会看到如下内容:

[28, 12, 10, 7, 10, 8, 11, 8, 0]

请注意,我的错误为 0,但数据明显存在偏差:

例如,这里是 b 运行一次:

-28.6778508366

我查看了this SO,但没有发现我们的算法有什么不同。我想也许这就是我解释然后绘制wb 的方式?我只是做一些非常简单的事情:

def plot(X, Y, w, b):
    area = 20
    fig = plt.figure()
    ax = fig.add_subplot(111)
    p = X[Y == 1]
    n = X[Y == -1]
    ax.scatter(p[:, 0], p[:, 1], s=area, c='r', marker="o", label='pos')
    ax.scatter(n[:, 0], n[:, 1], s=area, c='b', marker="s", label='neg')
    neg_w = -w
    xs = [neg_w[0], w[0]]
    ys = [neg_w[1], w[1]]  # My guess is that this is where the bias goes?
    ax.plot(xs, ys, 'r--', label='hyperplane')
    ...

【问题讨论】:

    标签: python algorithm machine-learning perceptron


    【解决方案1】:

    是的,我认为您学习了正确的w,但没有正确绘制分隔线。

    您有一个二维数据集。所以你的 w 有 2 个维度。比方说,w = [w1, w2]

    分隔线应为w1 x x1 + w2 x x2 + b = 0。 我认为您正在使用该线上的两个点来绘制分隔线。这两点可以在下面找到:

    • 首先,我们将x1 设置为0。我们得到x2 = -b/w2
    • 其次,我们将x2设置为0。我们得到x1 = -b/w1

    因此这两个点应该是(0, -b/w2)(-b/w1, 0)。在您的xsys 公式中,我没有看到b 是如何使用的。可以试试设置吗:

    # Note w[0] = w1, w[1] = w2. 
    xs = [0, -b/w[0]]   # x-coordinate of the two points on line.
    ys = [-b/w[1], 0]   # y-coordinate.
    

    见下图取自@gwg 提到的this 幻灯片。红色实线是你通过w(不是self.w)学到的分隔符。红色虚线箭头表示:在分隔符的那一侧,sum(wx) > 0 的符号。在基于边距的模型(感知器就是这样的模型)中计算学习模型的边距也很有用。也就是说,如果您从分隔符开始,并取分隔符的垂直方向,那么您到达的第一个示例定义了该侧的“边距”,即您到目前为止行驶的距离(注意您可以从任何地方开始在分隔符上)。

    【讨论】:

    • 这行得通,但前提是我不采用w 的垂直线——这不是我所期望的。我认为学习到的w 与实际的超平面正交。这就是为什么在w 和点x 之间取点积可以对其进行分类。我试图调整这个算法(幻灯片 25):cs.princeton.edu/courses/archive/fall16/cos402/lectures/…。但我认为我的表现不正确。
    • 是的,我没有注意到您选择了垂直线 (self.w = perpendicular(w[1:]))。我不知道你为什么要这样做。显然,权重本身描述了线性分隔符。我们不想使用直线的垂线。您可能会对幻灯片中的某些内容感到困惑(幻灯片中出售的红线是分隔符,而不是带箭头的红色虚线)。红色虚线表示在分隔符的那一侧, sum(wx) > 0 的符号。
    猜你喜欢
    • 2014-12-09
    • 2011-08-13
    • 2019-01-03
    • 2014-12-11
    • 2023-03-11
    • 2020-11-04
    • 1970-01-01
    • 2019-12-01
    • 2021-05-19
    相关资源
    最近更新 更多