我正在研究感知器问题,我制作了一些假数据,当数据线性可分时,感知器算法不会收敛。
这是线性可分的假数据。
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 后收敛,并且没有产生正确的输出。这是剧情
任何想法都会非常有用,谢谢!
您需要做一些事情,主要是现在,为了获得最佳结果,您可以增加样本大小,这应该足以让模型有更好的数据集来训练:
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
。
此外,尝试一下样本数量,看看你的模型如何逐渐变得更糟。