обучение персептрона с использованием набора данных linerrud - PullRequest
2 голосов
/ 01 ноября 2019

Я новичок в машинном обучении, а также в программировании на Python, я хочу реализовать алгоритм с нуля, используя только numpy, который является правилом обучения персептрона для набора данных linnerud.

Если персептрон не сходится, нужно будет запустить для1000 итераций, а также необходимо протестировать этот алгоритм на наборе данных Linnerrud, используя все 3 атрибута и только результат chinups.

Вектор должен быть определен как двоичные классы для результата chinups следующим образом:

if(chinups>median(chinups)) then chinups=0 else chinups=1

Мне нужно использовать эти классы (0/1) для обучения персептрона и построения таблицы вероятностей. В конце концов мне нужно 20 значений прогноза, выводимых персептроном, где каждое значение представляет собой взвешенную сумму (точечное произведение весов персептрона со значениями атрибута)

То, что я получаю, кажется неверным. Если бы кто-нибудь мог помочь мне с этим, было бы заметно. Ниже приведен мой код:

import numpy as np
import matplotlib.pyplot as plot 
import os
from numpy import arange
from sklearn.datasets import load_linnerud


def perceptron(linnerud):

    pathName = os.path.dirname(os.path.abspath(__file__))
    myfile = open(pathName+'\perceptron_results.txt', 'w')

    data = linnerud['data']
    target = linnerud['target']

    chinup = []

    for i in target:
        chinup.append(i[0])

    median = np.sum(chinup) / 20

    #print(median)

    binary = []

    for j in chinup:

        #print(j)
        if j > median:
            binary.append(0)

        else:
            binary.append(1)

    weights = np.zeros([3,1])

    iteration = 1000

    for i in arange(0,iteration):
        counter = 0
        converged = True

        for rowVal in data:

            predVal = np.dot(rowVal,weights)
            if predVal < 0:

                predicted = 0

            else:

                predicted = 1

            if predicted != binary[counter]:

                converged = False

                if binary[counter] == 0 :

                    weights = weights - np.expand_dims(rowVal,1)

                else:

                    weights = weights + np.expand_dims(rowVal,1)

            counter = counter + 1

        if converged == True:
            print("Error occurred")
            break


    finalPred = np.dot(data,weights)
    myfile.write(str(finalPred)+'\n')
    #print(finalPred)
    print("\nProbability values appended in gnb_result,txt file")

    plot.plot(finalPred,'bo'); 
    plot.plot([0,20],[0,0])

    plot.show()




My Output is this:
[[  2845.]
 [ -2316.]
 [ -1906.]
 [  8874.]
 [  8926.]
 [  1693.]
 [  5421.]
 [  4877.]
 [ 15905.]
 [-14406.]
 [ 13369.]
 [  2546.]
 [  5238.]
 [ -4733.]
 [  3337.]
 [   954.]
 [  2243.]
 [  7887.]
 [ 11835.]
 [   489.]]

output

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Это работает для меня после изменения нескольких частей в коде

import numpy as np
import matplotlib.pyplot as plot 
import os
from numpy import arange
from sklearn.datasets import load_linnerud
dataN = dataset.get('data')
target = dataset.get('target')


chinup = []

for i in dataN:
    chinup.append(i[0])

median = np.median(chinup)

binary = []

for j in chinup:

    #print(j)
    if j > median:
        binary.append(0)

    else:
        binary.append(1)

weights = np.zeros([3,1])

iteration = 1000

for i in arange(0,iteration):
    counter = 0
    converged = True

    for row_val in target:

        pred_val = np.dot(row_val,weights)
        if pred_val < 0:

            predicted = 0

        else:

            predicted = 1

        if predicted != binary[counter]:

            converged = False

            if binary[counter] == 0 :

                weights = weights - np.expand_dims(row_val,1)

            else:

                weights = weights + np.expand_dims(row_val,1)

        counter = counter + 1

    if converged == True:
        print("Loop broken")
        break

final_pred = np.dot(target,weights)


plot.plot(final_pred,'bo'); 
plot.plot([0,20],[0,0])
plot.show()

[output] [1] [1]: https://i.stack.imgur.com/6vA5M.png

0 голосов
/ 05 ноября 2019

для i в target: chinup.append (i [0]) median = np.median (chinup) это медиана составляет 176, это неверно

должно быть: для i в данных: chinup.append(i [0]) median = np.median (chinup) эта медиана равна 11,5

в наборе данных load_linnerud: 'target_names': ['Weight', 'Waist', 'Pulse'] и 'feature_names': ['Chins', 'situps', 'Jumps'] если вы хотите получить "if (chinups> median (chinups)), то chinups = 0, иначе chinups = 1", вы должны использовать "для i в данных:"

0 голосов
/ 05 ноября 2019
median = np.sum(chinup) / 20 --> 9.45 (it is mean)
median = np.median(chinup) -->11.5 (it is median)

Медиана не означает, они отличаются

, и вы строите график plot.plot([0,20],[0,0]), почему эта линейная регрессия ставится в этой позиции этого случая? а у него с 0 уклоном? или вы просто рисуете это с вашей идеей ...

...