如果要将上图用一条直线分开,用感知器算法如何实现:
import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.model_selection import train_test_split
import graphviz
import matplotlib.pyplot as plt
def sgn(x):
if (x >= 0):
return 1
if (x < 0):
return -1
d = np.array(
[[1.0, 1.0, 1.0, 1.0], [1.0, 2.0, 1.0, 1.0], [2.0, 1.0, 1.0, 1.0], [3.0, -4.0, 1.0, 1.0], [-0.0, -1.0, 1.0, 1.0],
[-1.0, -0.0, 1.0, 1.0],
[-1.0, -2.0, 1.0, -1.0], [-2.0, -3.0, 1.0, -1.0],
[-3.0, -1.0, 1.0, -1.0], [-3.0, -2.0, 1.0, -1.0], [-2.0, 2.0, 1.0, -1.0]])
w = np.array([0.0, 0.0, 2.0])
plt.scatter(d[:7, 0], d[:7, 1], c='black', marker='x')
plt.scatter(d[7: np.size(d, 0)+ 1, 0], d[7:np.size(d, 0) + 1, 1], c='black')
plt.axis([-7, 6, -7, 10])
plt.show()
restart = True
while restart:
for i in range(np.size(d, 0)):
if (sgn(w[0] * d[i, 0] + w[1] * d[i, 1] + w[2] * d[i, 2]) == d[i, 3]):
x = np.arange(-10, 11)
if (i < 7):
plt.scatter(d[:i, 0], d[:i, 1], c='black', marker='x')
else:
plt.scatter(d[:6, 0], d[:6, 1], c='black', marker='x')
plt.scatter(d[6:i + 1, 0], d[6:i + 1, 1], c='black')
if w[1] == 0:
if (w[0] == 0):
plt.vlines(-1 * w[2], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
plt.vlines(-1 * w[2] / w[0], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
plt.plot(x, y)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
x = np.arange(-10, 11)
if (i < 5):
plt.scatter(d[:i, 0], d[:i, 1], c='black', marker='x')
if (i >= 5):
plt.scatter(d[:5, 0], d[:5, 1], c='black', marker='x')
plt.scatter(d[5:i + 1, 0], d[5:i + 1, 1], c='black')
if w[1] == 0:
if (w[0] == 0):
plt.vlines(-1 * w[2], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
plt.vlines(-1 * w[2] / w[0], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
plt.plot(x, y)
plt.axis([-7, 6, -7, 10])
plt.show()
w[0] = w[0] + d[i, 3] * d[i, 0] * 0.1
w[1] = w[1] + d[i, 3] * d[i, 1] * 0.1
print(w)
if w[1] == 0:
if (w[0] == 0):
plt.vlines(-1 * w[2], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
plt.vlines(-1 * w[2] / w[0], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
plt.plot(x, y)
plt.axis([-7, 6, -7, 10])
plt.show()
print(i, end=' ')
print(w[0])
break
if (i == 8):
break
print()
print(w)
plt.scatter(d[:6, 0], d[:6, 1], c='black', marker='x')
plt.scatter(d[6:np.size(d, 0), 0], d[6:np.size(d, 0), 1], c='black')
x = np.arange(-10, 11)
if (w[1] != 0):
y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
plt.plot(x, y)
plt.axis([-7, 6, -7, 10])
plt.show()
else:
plt.vlines(-1 * w[2] / w[0], -7, 10)
plt.axis([-7, 6, -7, 10])
plt.show()
代码写的很乱,刚用python,感兴趣的用pycharm跑着玩玩



