La función de clasificación de una sola neurona cuando se usa la función de límite estricto

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/weixin_40653652/article/details/112303601
Recomendado
Clasificación