我可以这样使用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方法,为什么第一个工作而第二个工作不起作用?
答案 0 :(得分:2)
您需要创建SVD类的实例,就像您在第一个示例中所做的那样。如果您查看fit()函数的代码,您会看到它需要2个位置参数 - self
和X
。 y
参数不是位置参数,因为它具有默认值。
def fit(self, X, y=None):
方法的第一个参数 - self
- 是调用方法的实例,它是在引擎盖下传递的。如果您没有创建类SVD
的实例,则缺少self
参数,您需要自己传递它。
要回答你的问题,让我们在调用fit()
之前创建一个类的实例。第二件事,请注意fit()
,SVD
,KNNBasic
,KNNWithMeans
类的NormalPredictor
方法的声明可能会有所不同。