Tabla de contenido
Código
import numpy as np
from matplotlib import pyplot as plt
import random
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False
def yxf(x):
if x >= 0:
return 1
else:
return 0
def juzheng(a,b):
sum = 0
for i in range(len(a)):
sum = sum + a[i]*b[i]
return sum
w = [0.0, 0.0, 1.0]
x0_r = []
x1_r = []
label = []
for i in range(200):
x0 = random.randint(-10, 10)
x1 = random.randint(-10, 10)
if 0.5*x0 + x1 - 1 < 0:
x0_r.append(x0)
label.append(0)
x1_r.append(x1)
elif 0.5*x0 + x1 - 1 > 0:
x0_r.append(x0)
label.append(1)
x1_r.append(x1)
plt.figure()
xx = np.linspace(-10, 10, 100)
err = 1
k = 0
while err > 0:
tj = []
for i in range(len(label)):
X1 = [x0_r[i], x1_r[i], 1]
I1 = juzheng(X1, w)
y = yxf(I1)
dui = label[i] - y
w[0] = w[0] + 0.01 * dui * X1[0]
w[1] = w[1] + 0.01 * dui * X1[1]
w[2] = w[2] + 0.01 * dui * X1[2]
tj.append(abs(dui))
plt.clf()
plt.ylim([-15, 15])
for j in range(len(label)):
if label[j] == 1:
plt.plot(x0_r[j], x1_r[j], 'g*')
elif label[j] == 0:
plt.plot(x0_r[j], x1_r[j], 'ks')
# plt.plot(X1[0], X1[1], '1', markersize=10)
if w[1] != 0:
yy = -w[2] / w[1] - w[0] / w[1] * xx
plt.plot(xx, yy, label='当前曲线')
yy1 = 1 - 0.5 * xx
plt.plot(xx, yy1, label='理想曲线')
# plt.pause(0.001)
plt.legend()
k = k + 1
err = sum(tj)
sss = '第'+str(k)+'次迭代.jpg'
sss1 = '有'+str(err)+'个点不满足条件'
plt.title(sss1)
plt.savefig(sss)
print('第{}次迭代不满足条件的点有{}个'.format(k, err))
Resultado de la solución
En conclusión
Para problemas linealmente separables, el algoritmo de aprendizaje que utiliza la función de límite estricto es convergente. Si l (k) ya está muy cerca de la línea divisoria óptima, entonces la zancada α debe elegirse muy pequeña; de lo contrario, puede sobrecorregirse, haciendo que W (k + 1) gire la cabeza, pero si la zancada se elige muy pequeño, la velocidad de aprendizaje se volverá muy lenta Para resolver esta contradicción, se puede adoptar un plan de pasos variable.