Python Surprise 包为使用潜在因素的预测方法与手动计算提供了不同的预测

如何解决Python Surprise 包为使用潜在因素的预测方法与手动计算提供了不同的预测

我正在使用惊喜包进行矩阵分解。下面是教程的代码

from surprise import SVD
from surprise import Dataset
from surprise import accuracy
from surprise.model_selection import train_test_split

# Load the movielens-100k dataset (download it if needed),data = Dataset.load_builtin('ml-100k')
trainset = data.build_full_trainset()

algo = SVD()
algo.fit(trainset)

algo.predict(str(196),str(302))

Out:
Prediction(uid='196',iid='301',r_ui=4,est=3.0740854315737174,details={'was_impossible': False})

但是,当我使用其 documentationsource code 中的 SVD 方程手动计算 r_hat(r 预测)时:

algo.trainset.global_mean + algo.bi[301] + algo.bu[196] + np.dot(algo.qi[301],algo.pu[196]) 

Out:
2.817335384596893

预测根本不匹配。我做错了什么或遗漏了什么吗?

解决方法

我设法弄明白了。 raw users/itemsinner users/items 之间存在差异。前者指的是用户和项目的实际名称(例如,用户 = John 或类似 10 的数字;项目 = 复仇者联盟或类似 20 的数字),而后者我假设是赋予原始用户的标签编码值/项。

trainset 的隐藏属性包含 4 个属性,_inner2raw_id_items_inner2raw_id_users_raw2inner_id_items_raw2inner_id_users,它们是包含从一个到另一个的转换的字典。

如果我们调用 trainset._raw2inner_id_userstrainset._raw2inner_id_items,我们得到:

_raw2inner_id_users
{'196': 0,'186': 1,'22': 2,...}

_raw2inner_id_items
{'242': 0,'302': 1,'377': 2,... 
 '301': 404,...}

因此,当我们调用:

algo.predict(str(196),str(302))

Out:
# different from original post as the prediction changes from run to run
Prediction(uid='196',iid='301',r_ui=None,est=3.2072618383879736,details={'was_impossible': False})

我们实际上指的是第 0th 个用户和第 1st 项。因此,当我们根据 SVD 方程使用潜在因子、偏差和全局均值进行手动计算时,我们应该使用这些数字:

algo.trainset.global_mean + algo.bi[404] + algo.bu[0] + np.dot(algo.qi[404],algo.pu[0]) 

Output:
3.2072618383879736

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?