2016-04-10 4 views
3

Я пытаюсь собрать реализацию Python одноуровневого классификатора Perceptron. Я нашел пример в книге Себастьяна Рашка «Python Machine Learning» очень полезен, но у меня есть вопрос об одной небольшой части его реализации. Это код:Передача массива numpy.dot() в реализации Python модели обучения Perceptron

import numpy as np  
class Perceptron(object): 
    """Perceptron classifier. 

    Parameters 
    ------------ 
    eta : float 
     Learning rate (between 0.0 and 1.0) 
    n_iter : int 
     Passes over the training dataset. 

    Attributes 
    ----------- 
    w_ : 1d-array 
     Weights after fitting. 
    errors_ : list 
     Number of misclassifications in every epoch. 

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

    def fit(self, X, y): 
     """Fit training data. 

     Parameters 
     ---------- 
     X : {array-like}, shape = [n_samples, n_features] 
      Training vectors, where n_samples 
      is the number of samples and 
      n_features is the number of features. 
     y : array-like, shape = [n_samples] 
      Target values. 

     Returns 
     ------- 
     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): 
     """Calculate net input""" 
     return np.dot(X, self.w_[1:]) + self.w_[0] 

    def predict(self, X): 
     """Return class label after unit step""" 
     return np.where(self.net_input(X) >= 0.0, 1, -1) 

Часть я не могу получить мою голову вокруг, почему мы определяем net_input() и predict() взять массив X, а не только вектор. Все работает, так как мы передаем вектор xi в predict() в функции fit() (и поэтому поэтому передаем только вектор net_input()), но какова логика определения функций для принятия массива? Если я правильно понимаю модель, мы принимаем только один образец за раз, вычисляя точечный продукт вектора веса и вектор-объект, связанный с образцом, и нам никогда не нужно передавать весь массив до net_input() или predict().

+0

Не уверен, что я полностью понимаю ваш вопрос. Кажется, что когда вы говорите массив, вы имеете в виду 2D-массив, где каждая строка является одним вектором образца? Если это не то, что вы имеете в виду, какое различие вы делаете между массивом и вектором? – Philip

ответ

0

Ваша забота о том, почему X в net_input и предсказании определяется как массив, а не вектор (я предполагаю, что ваши определения - это то, что я упомянул в комментарии выше), действительно, хотя я бы сказал, что нет различия в этом контексте) ... Что создает впечатление, что X является «массивом», а не «вектором»?

Ввод текста определяется тем, что вы передаете функции, поэтому, если вы передадите ему вектор, X является вектором (python использует так называемую утиную печать). Поэтому, чтобы ответить на вопрос: «Почему net_input и предсказание определены для принятия массива в отличие от вектора?» ... Это не так, они просто определены для принятия параметра X, который является тем типом, который вы передаете ему.

Возможно, вас смущает повторное использование имени переменной X в виде массива данных 2d в контексте соответствия, но как один образец в других функциях ... Они могут делиться именем, но они различны от eachother, находясь в разных областях.

+0

Спасибо, Филипп. Это отвечает на мой вопрос. Я был смущен повторным использованием 'X', где в функции' fit() 'он был определен как 2d-массив (и да, я имел в виду 2d-массив, когда я сказал« массив »). Тот факт, что они находятся в разных областях и несвязанных, проясняет это для меня. – jonrossi

+0

Рад, что это очистило! Динамическая типизация на python иногда может затруднить понимание того, что без тщательного называния и комментирования ... Я думаю, что повторное использование X было менее идеальным выбором – Philip

Смежные вопросы