- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在参加编程竞赛,我的数据中第一列是用户,第二列是电影,第三列是十分制评分系统中的数字。
0 0 9
0 1 8
1 1 4
1 2 6
2 2 7
我必须预测第三列(用户、电影、?):
0 2
1 0
2 0
2 1
我也知道答案:
0 2 7.052009
1 0 6.687943
2 0 6.995272
2 1 6.687943
表格中的数据:行是用户 0、1 和 2;列是电影 0、1 和 2;单元格是分数,0
未投票:
[,1] [,2] [,3]
[1,] 9 8 0
[2,] 0 4 6
[3,] 0 0 7
我使用 R 语言获取 SVD:
$d
[1] 12.514311 9.197763 2.189331
$u
[,1] [,2] [,3]
[1,] 0.9318434 -0.3240669 0.1632436
[2,] 0.3380257 0.6116879 -0.7152458
[3,] 0.1319333 0.7216776 0.6795403
$v
[,1] [,2] [,3]
[1,] 0.6701600 -0.31709904 0.6710691
[2,] 0.7037423 -0.01584988 -0.7102785
[3,] 0.2358650 0.94825998 0.2125341
转置 v 是:
[,1] [,2] [,3]
[1,] 0.6701600 0.7037423 0.2358650
[2,] -0.31709904 -0.01584988 0.94825998
[3,] 0.6710691 -0.7102785 0.2125341
我读到过使用这个公式预测电影评级:
但我不明白如何预测这样的收视率:
0 2 7.052009
1 0 6.687943
2 0 6.995272
2 1 6.687943
对于此数据:
0 2
1 0
2 0
2 1
最佳答案
在我看来,您的示例有几处不正确。首先,当您没有针对特定用户/电影组合的排名时,您不应将其填入零。这会告诉 SVD 或任何其他类型的主成分分析 (PCA),这些是等级(人为降低)。此外,使用零填充数据计算的协方差将基于不正确的观察数计算。
使用 SVD 方法的 Netflix 获奖者 (link for more info) 也一定使用了某种缺失数据 PCA 例程。在那种情况下,非值不应为零,而应为 NaN
,尽管我还没有看到他们使用的实际方法的细节。
我的第二个问题是,您提供的“答案”是否真的基于您在示例中提供的相当小的数据集。给定 3 个用户乘以 3 部电影数据集,用于计算用户之间相关性的位置非常少,因此任何预测都会很差。尽管如此,我还是能够得出一个结果,但它与您预期的答案不符。
该方法称为“递归减去经验正交函数”(RSEOF),它是专门设计用于处理缺失数据的 PCA 方法。也就是说,如果没有更大的训练数据集,我对预测没有太大信心。
因此,我首先加载您的原始数据集和预测数据集,并使用 reshape2
包中的 acast
将训练数据 reshape 为矩阵:
library(reshape2)
library(sinkr) (download from GitHub: https://github.com/menugget/sinkr)
# Original data
df1 <- data.frame(user=factor(c(0,0,1,1,2)), movie=factor(c(0,1,1,2,2)), rank=c(9,8,4,6,7))
df1
# Data to predict
df2 <-data.frame(user=factor(c(0,1,2,2)), movie=factor(c(2,0,0,1)))
df2
# Re-organize data into matrix(movies=rows, users=columns)
m1 <- acast(df1, movie ~ user, fill=NaN)
m1
然后使用 sinkr
包 ( link ) 的 eof
函数,我们执行 RSEOF:
# PCA of m1 (using recursive SVD)
E <- eof(m1, method="svd", recursive=TRUE, center=FALSE, scale=FALSE)
E$u
E$A #(like "v" but with Lambda units added)
E$Lambda
数据中 NaN
位置的预测值可以通过使用 PCA 信息重建完整矩阵来获得(基本上 E$A %*% t(E$u)
):
# Reconstruct full m1 matrix using PCs
R <- eofRecon(E)
R
# Add predicted ranks to df2
pos <- (as.numeric(df2$user)-1)*length(levels(df1$movie)) + as.numeric(df2$movie)
pos
df2$rank <- R[pos]
df2
对象 df2
包含您在预测数据集中指定的用户/电影组合的特定预测排名:
user movie rank
1 0 2 9.246148
2 1 0 7.535567
3 2 0 6.292984
4 2 1 5.661985
我个人认为这些值比您的预期结果(都在 7 左右)更有意义。例如,当按用户(列)查看电影矩阵(行)时,m1
,
0 1 2
0 9 NaN NaN
1 8 4 NaN
2 NaN 6 7
鉴于这是用户“1”的趋势,我预计用户“0”比电影“1”更喜欢电影“2”。我们只有电影“1”的排名是它们之间的共同点,以此作为我们预测的基础。您的预期值为 7.05,低于电影“1”(即 8),而 RSEOF 预测值为 9.2。
我希望这对您有所帮助 - 但是,如果您的预期答案是您所追求的,那么我会对“真相持有者”使用的方法产生怀疑。您更有可能只是提供了数据集的较小版本,因此我们不会得出与较小的可重现示例中相同的答案。
关于r - 用 SVD 矩阵预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373946/
SciPy 和 Numpy 都内置了奇异值分解 (SVD) 函数。命令基本上是 scipy.linalg.svd 和 numpy.linalg.svd。这两者有什么区别?它们中的任何一个都比另一个更好
numpy.linalg.svd 函数给出输入矩阵的完整 svd。但是我只想要第一个奇异向量。 我想知道在 numpy 中是否有任何函数用于那个或 python 中的任何其他库? 最佳答案 一种可能是
代码: import numpy from matplotlib.mlab import PCA file_name = "store1_pca_matrix.txt" ori_data = nump
我在学习SVD通过关注这个 MIT course . 矩阵构造为 C = np.matrix([[5,5],[-1,7]]) C matrix([[ 5, 5], [-1, 7]]
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我想计算 SVD ,但我没有找到合适的 java 库。现在,我在 hashmap 中存储了数据,因为矩阵不适合内存,因为大小约为 400 000 X 10 000 并且大多数为 0。我尝试了 MTJ、
运行以下代码: from sklearn.decomposition import TruncatedSVD import numpy as np X = np.matrix('1 2 3 4 5;
给定一个实数矩阵 A 使得: A 是对称的 所有非对角线项都是已知且正的 所有对角线项都缺失 排名k 我想找到 A 的最佳可能完成,称为 Ac,这样(大约)rank(Ac)=k。 矩阵 A 可能很大(
我正在寻找一个执行维基百科中描述的奇异值分解的 Java 库:从矩阵 A (m X n) 得到 A = U*S*V' 其中 U 是 m x m,S 是 m x n,V 是n x n. 谁能帮帮我? 请
我正在尝试学习用于图像处理的 SVD...例如压缩。 我的方法:使用 ImageIO 获取图像作为 BufferedImage...获取 RGB 值并使用它们获取等效的灰度值(在 0-255 范围内)
我必须在 Matlab 中使用 SVD 来获得数据的简化版本。我读到函数 svds(X,k) 执行 SVD 并返回前 k 个特征值和特征向量。如果必须规范化数据,文档中没有提及。对于归一化,我指的是减
我已经使用 SVD 找到了两组点之间的旋转矩阵。我知道 R = Transpose(U) * V 但我不明白 U 和 V 代表什么以及为什么这种乘法会产生旋转矩阵。 最佳答案 由于您的问题是理论性的并
我正在尝试在名为“LSA 简介”的论文中复制一个示例: An introduction to LSA 在示例中,它们具有以下术语-文档矩阵: 然后他们应用 SVD 并得到以下结果: 试图复制这一点,我
我正在使用带有 R 的 SVD 包,我能够通过将最低奇异值替换为 0 来降低矩阵的维数。但是当我重新组合矩阵时,我仍然拥有相同数量的特征,我找不到如何有效地删除源矩阵中最无用的特征,以减少其列数。 例
我想编写一个函数,它使用 SVD 分解来求解方程组 ax=b,其中 a 是一个方阵,b 是一个值向量。 scipy 函数 scipy.linalg.svd() 应该将 a 转换为矩阵 U W V。对于
我在 R 中有一个稀疏矩阵,它显然太大了,无法在其上运行 as.matrix()(尽管它也不是 super 大)。有问题的 as.matrix() 调用位于 svd() 函数内部,所以我想知道是否有人
我正在尝试使用 bcv 包中的 SVD 插补,但所有插补值都是相同的(按列)。 这是缺少数据的数据集 http://pastebin.com/YS9qaUPs #load data dataMiss
我有这个数组 double a[][] = {{1,1,1}, {0,1,1} , { 1,0,0} ,{0,1,0},{1,0,0},{1,0,1},{1,1,1},{1,1,1},
我们现在知道A_(m x n) = U_(m x k) * S_(k x k) * V_(k x n)^T = u_(1) * s_1 * v_(1) + u_(2) * s_2 * v_(2) +
我必须对矩阵进行 SVD,但它有一些错误,在下面的示例中 U[1][1]、U[2][1] 和 U[2][0] 应为 0。 问题是,上面的例子只是一个测试,我必须使用条件不太好的大型矩阵,我该怎么做才能
我是一名优秀的程序员,十分优秀!