python - 使用 matplotlib 绘制感知器算法

标签 python matplotlib machine-learning deep-learning neural-network

在我正在学习的 ML 类(class)中,我有 100 个数据条目,并且我在感知器算法中使用它。 我想要的是展示这样的情节。

enter image description here

正如您在上面看到的,我们有由红色和蓝色点表示的数据以及最小化误差的不同计算线。这是我想要的输出。这是我的数据和代码。

数据.csv

0.78051,-0.063669,1
0.28774,0.29139,1
0.40714,0.17878,1
0.2923,0.4217,1
0.50922,0.35256,1
0.27785,0.10802,1
0.27527,0.33223,1
0.43999,0.31245,1
0.33557,0.42984,1
0.23448,0.24986,1
0.0084492,0.13658,1
0.12419,0.33595,1
0.25644,0.42624,1
0.4591,0.40426,1
0.44547,0.45117,1
0.42218,0.20118,1
0.49563,0.21445,1
0.30848,0.24306,1
0.39707,0.44438,1
0.32945,0.39217,1
0.40739,0.40271,1
0.3106,0.50702,1
0.49638,0.45384,1
0.10073,0.32053,1
0.69907,0.37307,1
0.29767,0.69648,1
0.15099,0.57341,1
0.16427,0.27759,1
0.33259,0.055964,1
0.53741,0.28637,1
0.19503,0.36879,1
0.40278,0.035148,1
0.21296,0.55169,1
0.48447,0.56991,1
0.25476,0.34596,1
0.21726,0.28641,1
0.67078,0.46538,1
0.3815,0.4622,1
0.53838,0.32774,1
0.4849,0.26071,1
0.37095,0.38809,1
0.54527,0.63911,1
0.32149,0.12007,1
0.42216,0.61666,1
0.10194,0.060408,1
0.15254,0.2168,1
0.45558,0.43769,1
0.28488,0.52142,1
0.27633,0.21264,1
0.39748,0.31902,1
0.5533,1,0
0.44274,0.59205,0
0.85176,0.6612,0
0.60436,0.86605,0
0.68243,0.48301,0
1,0.76815,0
0.72989,0.8107,0
0.67377,0.77975,0
0.78761,0.58177,0
0.71442,0.7668,0
0.49379,0.54226,0
0.78974,0.74233,0
0.67905,0.60921,0
0.6642,0.72519,0
0.79396,0.56789,0
0.70758,0.76022,0
0.59421,0.61857,0
0.49364,0.56224,0
0.77707,0.35025,0
0.79785,0.76921,0
0.70876,0.96764,0
0.69176,0.60865,0
0.66408,0.92075,0
0.65973,0.66666,0
0.64574,0.56845,0
0.89639,0.7085,0
0.85476,0.63167,0
0.62091,0.80424,0
0.79057,0.56108,0
0.58935,0.71582,0
0.56846,0.7406,0
0.65912,0.71548,0
0.70938,0.74041,0
0.59154,0.62927,0
0.45829,0.4641,0
0.79982,0.74847,0
0.60974,0.54757,0
0.68127,0.86985,0
0.76694,0.64736,0
0.69048,0.83058,0
0.68122,0.96541,0
0.73229,0.64245,0
0.76145,0.60138,0
0.58985,0.86955,0
0.73145,0.74516,0
0.77029,0.7014,0
0.73156,0.71782,0
0.44556,0.57991,0
0.85275,0.85987,0
0.51912,0.62359,0

现在这是我的代码。第一部分

import numpy as np
import pandas as pd
# Setting the random seed, feel free to change it and see different solutions.
np.random.seed(42)
import matplotlib.pyplot as plt


def stepFunction(t):
    return 1 if t >= 0 else 0


def prediction(X, W, b):
    return stepFunction((np.matmul(X, W) + b)[0])

# TODO: Fill in the code below to implement the perceptron trick.
# INPUTS
# data X, the labels y,
# the weights W (as an array), and the bias b,
# The function  weights and bias W, b, according to the perceptron algorithm,
# and return W and b.

def perceptronStep(X, y, W, b, learn_rate=0.01):
    for i in range(len(X)):
        y_hat = prediction(X[i], W, b)
        if y[i] - y_hat == 1:
            W[0] += X[i][0] * learn_rate
            W[1] += X[i][1] * learn_rate
            b += learn_rate
        elif y[i] - y_hat == -1:
            W[0] -= X[i][0] * learn_rate
            W[1] -= X[i][1] * learn_rate
            b -= learn_rate
    return W, b

# This function runs the perceptron algorithm repeatedly on the dataset,
# and returns a few of the boundary lines obtained in the iterations,
# for plotting purposes.
# Feel free to play with the learning rate and the num_epochs,
# and see your results plotted below.
def trainPerceptronAlgorithm(X, y, learn_rate=0.01, num_epochs=25):
    x_min, x_max = min(X.T[0]), max(X.T[0])
    y_min, y_max = min(X.T[1]), max(X.T[1])
    W = np.array(np.random.rand(2, 1))
    b = np.random.rand(1)[0] + x_max
    # These are the solution lines that get plotted below.
    boundary_lines = []
    for i in range(num_epochs):
        # In each epoch, we apply the perceptron step.
        W, b = perceptronStep(X, y, W, b, learn_rate)
        # Here I have a doubt . Why if y = W0*x1 + W1*x2 + b
        # So we can get  x2 =y/W1 -(W0*x1)/W1 -b/W1 + y/W1)
        # If we remove y/W1 we just get intercept and slope
        # But why we are not using the last term y/W1
        boundary_lines.append((-W[0] / W[1], -b / W[1]))
    return boundary_lines

# Get data and plot the points
data = pd.read_csv('data.csv', header = None)
X = data.iloc[:, :2].values
y = data.iloc[:, -1].values

x1 = X[:, 0]
x2 = X[:, 1]
color = ['red' if value == 1 else 'blue' for value in y]
plt.scatter(x1, x2, marker='o', color=color)
plt.xlabel('X1 input feature')
plt.ylabel('X2 input feature')
plt.title('Perceptron regression for X1, X2')
plt.show()

当您运行此代码时,您会正确得到

enter image description here

所以现在我想在同一个图中绘制代表每次迭代最佳函数的线。为此,我评论了 plt.show() 上方的最后一行并执行了

# So now lets plot the lines that represent the best function for each iteration
boundary_lines = trainPerceptronAlgorithm(X, y)
x_lin = np.linspace(0, 1, 100)
for line in boundary_lines:
    Θo, Θ1  = line
    Θ1 = Θ1[0]
    Θo = Θo[0]
    # TODO: The equation of the error function is
    # y = W0*x1 + W1*x2 + b
    # So we can get  x2 =y/W1 -(W0*x1)/W1 -b/W1 + y/W1)
    # If we remove y/W1 we just get intercept and slope
    # boundary_lines.append((-W[0] / W[1], -b / W[1])
    # plt.axes([-0.5, -0.5, 1.5, 1.5])
    plt.plot(x_lin, (Θ1 * x_lin / Θo))
    plt.draw()
    plt.pause(5)
    input("Press enter to continue")
    plt.close()

但这并没有给我带来预期的结果。 为什么这没有得到预期的结果?

最佳答案

错误出现在 plt.plot(x_lin, (θ1 * x_lin/θo)) 中,而不是 θ1 * x_lin/θo 你应该有 θo * x_lin + θ1.

fig, ax = plt.subplots(1, 1, figsize=(8,5))
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.scatter(x1, x2, marker='o', color=color)
for i, line in enumerate(boundary_lines):
    Θo, Θ1  = line
    if i == len(boundary_lines) - 1:
        c, ls, lw = 'k', '-', 2
    else:
        c, ls, lw = 'g', '--', 1.5
    ax.plot(x_lin, Θo * x_lin + Θ1, c=c, ls=ls, lw=lw)
plt.show()

结果:

enter image description here

关于python - 使用 matplotlib 绘制感知器算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581706/

相关文章:

javascript - Python - 单击一个 javascript 按钮

python - For 循环似乎向变量添加了比应有的更多内容

python - 使用 EasyID3 编写 ID3 标签

python - 如何在 Python 中根据日期进行分类/计数

matplotlib - matplotlib 中对数极坐标图轴标签的定位

python - Mac 上的 Visual Studio Code 中未出现 Matplotlib 图像

python - Keras - 中等精度,糟糕的预测

python - 如何使用 pandas 和 matplotlib.pyplot 在一张图表上绘制数据框中的多个项目?

machine-learning - 机器学习中的迭代是什么意思?

c# - unity ML Agent 和外部数据