感知器算法未收敛于线性可分离数据

问题描述 投票:0回答:1

我正在研究感知器问题,我制作了一些假数据,当数据线性可分时,感知器算法不会收敛。

这是线性可分的假数据。

np.random.seed(42)
linear_df = pd.DataFrame({
    'X1': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=4), np.random.uniform(low=8, high=12, size=4)]), 1),
    'X2': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=4), np.random.uniform(low=8, high=12, size=4)]),1),
    'Y': [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0]
})

然后我在上面运行感知器

clf = Perceptron(verbose=1, max_iter=1000)
X = linear_df[['X1', 'X2']]
y = linear_df['Y']
clf.fit(X, y)
linear_coef = clf.coef_
linear_bias = clf.intercept_[0]
print(clf.coef_)
print(clf.intercept_)
print(clf.score(X, y))

8 个 epoch 后的收敛时间为 0.00 秒 [[ 2.3 -2.6]] [17.] 0.5

但是它说它在 8 个 Epoch 后收敛,并且没有产生正确的输出。这是剧情

perceptron plot

任何想法都会非常有用,谢谢!

python pandas machine-learning scikit-learn perceptron
1个回答
0
投票

您需要做一些事情,主要是现在,为了获得最佳结果,您可以增加样本大小,这应该足以让模型有更好的数据集来训练:

np.random.seed(42) # for reproducibility
numSamples = 1000 # number of samples, adjust as needed
linear_df = pd.DataFrame({
    'X1': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=numSamples//2), np.random.uniform(low=8, high=12, size=numSamples//2)]), 1),
    'X2': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=numSamples//2), np.random.uniform(low=8, high=12, size=numSamples//2)]),1),
    'Y': np.concatenate([np.ones(numSamples//2), -1 * np.ones(numSamples//2)])
})

这已经给出了以下结果:

Convergence after 7 epochs took 0.00 seconds
[[-3.3 -0.6]]
[23.]
1.0

而且班级很容易分开:

我还建议您始终扩展数据,尝试从

StandardScaler
研究
sklearn.preprocessing

此外,尝试一下样本数量,看看你的模型如何逐渐变得更糟。

© www.soinside.com 2019 - 2024. All rights reserved.