Алгоритм обучения персептрона: невозможно ли остановить PLA при определенном количестве обновлений? - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время я изучаю PLA и обнаружил что-то странное в моей машине.

Прежде всего, данные линейно разделимы, поэтому они сходятся каждый раз.Я реализовал свой PLA, просматривая примеры в фиксированном, заранее определенном случайном цикле, и повторял эксперимент много раз.

Когда я отображал количество обновлений в зависимости от частоты, я обнаружил, что есть некоторыенапример, число обновлений с частотой 0 никогда не останавливается с 34, 36, 38, 40 обновлениями, почему это так?

Кроме того, почему график не является одной пиковой кривой, а скорее 3-пиковымкривая?

Данные поезда

Мой участок PLA

Вот мой орудие:

import numpy as np
import random as rd
import matplotlib.pyplot as plt

#Read Data
Data_X = []
Data_Y = []
Train_Data = "hw1_7_train"
f = open(Train_Data, "r")
if f.mode == "r":
    fl = f.readlines()
    for line in fl:
        Data = line.split()
        Data_X.append([1.0] + [float(i) for i in Data[0:4]])
        Data_Y.append(int(Data[4]))
f.close()
Data_X = np.array(Data_X)
Data_Y = np.array(Data_Y)

def GoNext(Pos, Length):
    if Pos < Length-1:
        Pos += 1
    else:
        Pos = 0
    return Pos

def sign(x):
    return -1 if x <= 0 else 1

def PLA(X, Y, cycle):
    weight = np.array([0.0] * 5)
    Length = len(Y)
    Success = 0
    LastFail = -1
    Current_Id = 0
    UpdateCount = 0
    while(not Success):
        Current_Pos = cycle[Current_Id]
        Sign = sign(np.inner(weight, X[Current_Pos]))
        #If the current point is correct, check if we can halt, else continue
        if Sign == Y[Current_Pos]:
            #Went for a full round without mistake with initial weight (NOT likely to happen)
            if LastFail == -1 and Current_Id == Length-1:
                Success = 1
                continue
            #Went for a full round with out mistake from last point we modified
            elif Current_Pos == LastFail:
                Success = 1
                continue
            #Otherwise go to the next point
            else:
                Current_Id = GoNext(Current_Id, Length)
                continue
        #If the current point is error, modify the weight
        else:
            LastFail = Current_Pos
            #Modify the weight
            weight += Y[Current_Pos] * X[Current_Pos]
            UpdateCount += 1
            Current_Id = GoNext(Current_Id, Length)
            continue
    return UpdateCount

TotalIter = 9999
TrackUpdateCount = []
for iter in range(TotalIter):
    Cycle = list(range(len(Data_Y)))
    rd.shuffle(Cycle)
    TrackUpdateCount.append(PLA(Data_X, Data_Y, Cycle))

print("Average Update: ", sum(TrackUpdateCount)/TotalIter)

#Plotting...
UpperBound = max(TrackUpdateCount)
LowerBound = min(TrackUpdateCount)
x_axis = list(range(LowerBound, UpperBound+1))
y_axis = [0]*(UpperBound-LowerBound+1)
for i in range(LowerBound, UpperBound+1):
    y_axis[i-LowerBound] = TrackUpdateCount.count(i)

plt.bar(x_axis, y_axis)
plt.xlabel("Number of updates")
plt.ylabel("Frequency")
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...