TypeError:fit()使用python surprise library获取2个位置参数(给定1个)

时间:2018-03-10 15:11:28

标签: python-3.x

我可以这样使用svd

def predict(data, uid, iid):

    trainset = data.build_full_trainset()
    # Set the algorithms to predict
    algo = SVD()
    algo.fit(trainset)
    pred = algo.predict(uid, iid)
    print(pred.est)

但如果我尝试在for循环中使用它

def predict(data, uid, iid):

    trainset = data.build_full_trainset()

    algorithms = (SVD, KNNBasic, KNNWithMeans, NormalPredictor)


    for a in algorithms:
        a.fit(trainset)
        pred = a.predict(uid, iid)
        print(pred.est)
        print(pred)

我收到此错误

line 30, in predict
    a.fit(trainset)
  File "surprise/prediction_algorithms/matrix_factorization.pyx", line 152, in surprise.prediction_algorithms.matrix_factorization.SVD.fit
TypeError: fit() takes exactly 2 positional arguments (1 given)

我是python上的新手,但我认为我以同样的方式调用fit方法,为什么第一个工作而第二个工作不起作用?

1 个答案:

答案 0 :(得分:2)

您需要创建SVD类的实例,就像您在第一个示例中所做的那样。如果您查看fit()函数的代码,您会看到它需要2个位置参数 - selfXy参数不是位置参数,因为它具有默认值。

def fit(self, X, y=None):

方法的第一个参数 - self - 是调用方法的实例,它是在引擎盖下传递的。如果您没有创建类SVD的实例,则缺少self参数,您需要自己传递它。

要回答你的问题,让我们在调用fit()之前创建一个类的实例。第二件事,请注意fit()SVDKNNBasicKNNWithMeans类的NormalPredictor方法的声明可能会有所不同。