Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在感知器学习模型的Python实现中将数组传递给numpy.dot()_Python_Arrays_Numpy_Classification_Perceptron - Fatal编程技术网

在感知器学习模型的Python实现中将数组传递给numpy.dot()

在感知器学习模型的Python实现中将数组传递给numpy.dot(),python,arrays,numpy,classification,perceptron,Python,Arrays,Numpy,Classification,Perceptron,我正在尝试将一个单层感知器分类器的Python实现组合在一起。我发现Sebastian Raschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。代码如下: import numpy as np class Perceptron(object): """Perceptron classifier. Parameters ------------ eta : float Learning rate (be

我正在尝试将一个单层感知器分类器的Python实现组合在一起。我发现Sebastian Raschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。代码如下:

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\u input()
predict()
来获取数组
X
,而不仅仅是向量。由于我们只将
fit()
函数中的向量
xi
传递给
predict()
(因此也只将向量传递给
net\u input()
),那么定义函数获取数组的逻辑是什么呢?如果我正确理解了模型,我们一次只取一个样本,计算权重向量和与样本相关的特征向量的点积,我们永远不需要将整个数组传递给
net\u input()
predict()

您关心的似乎是,为什么net_input和predict中的X被定义为数组而不是向量(我假设您的定义与我在上面的评论中提到的相同——尽管我想说在这种情况下没有区别)。。。是什么让你觉得X是一个“数组”而不是一个“向量”

这里的类型是由传递函数的内容决定的,因此如果传递一个向量,X就是一个向量(python使用所谓的duck类型)。所以要回答这个问题,“为什么净输入和预测定义为数组而不是向量?”。。。它们不是,它们只是被定义为接受参数X,它是你传递给它的任何类型


他在fit上下文中将变量名X重新用作二维训练数据数组,但在其他函数中用作单个样本,这可能会让您感到困惑。。。它们可能共享一个名称,但它们彼此不同,在不同的范围内

我不确定我是否完全理解你的问题。当你说数组时,你是指一个2D数组,其中每一行都是一个样本向量?如果这不是你的意思,那么数组和向量之间有什么区别呢?谢谢,Philip。这回答了我的问题。我被
X
的重用弄糊涂了,在
fit()
函数中,它被定义为2d数组(是的,我说的“数组”是指2d数组)。事实上,他们是在不同的范围和无关的澄清这对我来说。很高兴这澄清了它!python中的动态类型有时会使得在没有仔细命名和注释的情况下很难分辨什么是什么。。。我认为重用X不是一个理想的选择