我有一个包含一个表的数据库,如下所示:
UserID (int), MovieID (int), Rating (real)
userID和movieID是大数字,但我的数据库只有许多可能值的样本(4000个唯一用户和3000个独特的电影)
我要对它进行矩阵SVD(奇异值分解),所以我想将这个数据库作为有序数组返回.基本上,我想按顺序返回每个用户,并为每个用户按顺序返回每个电影,然后返回该用户,电影对的评级,如果该用户没有评价该特定电影,则返回null.例:
USERID | MOVIEID | RATING ------------------------- 99835 8847874 4 99835 8994385 3 99835 9001934 null 99835 3235524 2 . . . 109834 8847874 null 109834 8994385 1 109834 9001934 null etc
这样,我可以简单地将这些结果读入二维数组,适合我的SVD算法.(将信息数据库转换为简单的二维浮点数组的任何其他建议将不胜感激)
重要的是按顺序返回,以便当我获得二维数组时,我将能够将值重新映射到相应的用户和电影以进行分析.
SELECT m.UserID, m.MovieID, r.Rating FROM (SELECT a.userid, b.movieid FROM (SELECT DISTINCT UserID FROM Ratings) AS a, (SELECT DISTINCT MovieID FROM Ratings) AS b ) AS m LEFT OUTER JOIN Ratings AS r ON (m.MovieID = r.MovieID AND m.UserID = r.UserID) ORDER BY m.UserID, m.MovieID;
现在测试,它似乎工作!
这个概念是在Ratings表中创建UserID值列表的笛卡尔积,并在Ratings表(ouch!)中创建MovieID值列表,然后用Ratings表(再次)执行该完整矩阵的外连接收集评级值.
这不是有效的.
它可能是有效的.
您可能会做得更好,只需运行简单的数据选择,并安排在数据到达时填充数组.如果你有成千上万的用户和电影,你将返回数百万行,但其中大多数都会有空值.您应该将传入数据视为稀疏矩阵的描述,并首先将程序中的矩阵设置为全零(或其他默认值),然后从数据库中读取流并仅设置实际存在的行.
该查询基本上是微不足道的:
SELECT UserID, MovieID, Rating FROM Ratings ORDER BY UserID, MovieID;