Персептрон с питоном - появляется TypeError, но почему? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь закодировать алгоритм Perceptron в python3.Я следую примеру книги Себастьяна Рашки.Его код можно найти здесь: (https://github.com/rasbt/python-machine-learning-book-2nd-edition).

К сожалению, я не могу понять, почему появляется ошибка: TypeError: object () не принимает параметры и как ее обработать.

У меня естьСначала я использовал PyCharm, и теперь я шаг за шагом тестирую эту проблему с Jupiter. Я даже полностью скопировал пример кода из репозитория GitHub, предложенного S. Raschka. Но даже тогда я получаю ту же ошибку, которая на самом деле меня смущает, потому чтоэто означает, что это, вероятно, не просто опечатка.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap


class Perceptron(object):
    """ Perzeptron Klassifizierer

Parameter
---------
eta : float
    Lernrate (zwischen 0.0 und 1.0)
n_iter : int
    Durchläufe der Trainningsdatenmenge

Attribute
---------
w_ : 1d-array
    Gewichtugen nach Anpassungen
errors_ : list
    Anzahl der Fehlerklassifizerungen pro Epoche

"""


def __init__(self, eta=0.01, n_iter=10):
    self.eta = eta
    self.n_iter = n_iter


def fit(self, X, y):
""" Anpassungen and die Trainingsdaten

Parameter
---------
X : {array-like}, shape = [n_samples, n_features]
    Trainingsvektoren, n_samples ist
    die Anzahl der Objekte und
    n_features ist die Anzahl der Merkmale
y : array-like, shape = [n_samples]
    Zielwerte

Rückgabewert
------------
self : object

"""
    self.w_ = np.zeros(1 + X.shape[1])
    self.errors_ = []

    for _ in range(self.n_iter):
        errors = 0
        for xi, target in zip(X, y):
            update = self.eta * (target - self.predict(xi))
            self.w_[1:] += update * xi
            self.w_[0] += update
            errors += int(update != 0.0)
        self.errors_.append(errors)
        return self

    def net_input(self, X):
    """ Nettoeingabe berechnen"""
    return np.dot(X, self.w_[1:]) + self.w_[0]

    def predict(self, X):
    """Klassenbezeichnung zurückgeben"""
        return np.where(self.net_input(X) >= 0.0, 1, -1)

df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-    databases/iris/iris.data', header=None)

df.tail()

# Expected result:
# A table with given numbers will be shown
# Now we are plotting everything and will see a given chart:

y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)
X = df.iloc[0:100, [0, 2]].values

plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o',     label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x',   label='versicolor')
plt.xlabel('Länge des Kelchblatts [cm]')
plt.ylabel('Länge des Blütenblatts [cm]')
plt.legend(loc='upper left')
plt.show()

#Error appears here:

ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X, y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn_errors_,
         marker='o')
plt.xlabel('Epochen')
plt.ylabel('Anzahl der Updates')
plt.show()

The given Error tells me the following"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call >>last)
<ipython-input-29-abc085daeef7> in <module>
----> 1 ppn = Perceptron(eta=0.1, n_iter=10)
      2 ppn.fit(X, y)
      3 plt.plot(range(1, len(ppn.errors_) + 1), ppn_errors_,
      4          marker='o')
      5 plt.xlabel('Epochen')

TypeError: object() takes no parameters
------------------------------------------------------------------------

Как показано выше, код работает до последних нескольких строк и зависит от части с "ppn = Perceptron (eta ...) и т. д."Я ожидал другой график, диаграмму с количеством ложных классификаторов, противоположных количеству эпох. Я забыл какую-либо библиотеку? Я просто не понимаю ... Большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я до сих пор не знаю ответа, но я ввел тот же код для моей версии PyCharm в моей среде Windows, и это сработало.Итак, я не уверен, как закрыть вопрос.Может быть, один из админов может закрыть эту ветку?Или дай мне знать, как это сделать самому.

0 голосов
/ 08 февраля 2019

Вы определили класс Perzeptron, но создали экземпляр Perceptron (c вместо z).Похоже, что вы определили Perceptron ранее в сеансе ipython без определения метода __init__, принимающего два аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...