Matlab:将 Users-Items-Ratings CSV 加载到 Ratings 矩阵中
Matlab: Load Users-Items-Ratings CSV into Ratings matrix
我有以下 CSV 格式的用户评分项目:
A1YS,8F20,3.0
A3TS,8320,2.0
A3BU,1905,5.0
A3BU,3574,4.0
A14X,185A,1.0
这些列是 UserID,ItemID,Rating
我想将它加载到一个 Matlab 矩阵中,该矩阵包含用户行、项目列和单元格值,示例中将包含评级(未知评级等于零):
8F20, 1905, 3574, 185A
A1YS 3 , 0 , 0 , 0
A3TS 2 , 0 , 0 , 0
A3BU 0 , 5 , 4 , 0
A14X 0 , 0 , 0 , 1
另一件事,实际上矩阵可以形成为:
3 , 0 , 0 , 0
2 , 0 , 0 , 0
0 , 5 , 4 , 0
0 , 0 , 0 , 1
我对 Matlab 很陌生,尝试了一些变体:
和
没有大的成功 - 我将非常感谢任何帮助。
编辑:
到目前为止我得到的是:
fid = fopen('ratings_sample.csv');
out = textscan(fid,'%s%s%d%d','delimiter',',');
fclose(fid);
c1 = out{1};
c2 = out{2};
c3 = out{3};
我的问题是我需要重复删除 c1
和 c2
并正确填充矩阵的内部单元格。另外,我不知道这是否是正确的加载方式。
如果UserID和ItemID是唯一的,可以使用crosstab
:
UserID = categorical(c1);
ItemID = categorical(c2);
Rating = crosstab(UserID,ItemID);
Rating(Rating==1) = c3;
并得到:
Rating =
3 0 0 0 0
0 0 0 0 1
0 2 5 0 0
0 0 0 4 0
如果你想把它组织成table,你需要先将项目的ID转换成一个有效的变量名(以字母开头):
Items = cellfun(@(s) ['Item_' s],c2,'un',0);
然后你可以用一个table
来保存所有的数据:
Tbl = array2table(Rating,...
'RowNames',unique(c1,'stable'),...
'VariableNames',unique(Items,'stable'))
结果:
Tbl =
4×5 table
Item_8F20 Item_8320 Item_1905 Item_3574 Item_185A
_________ _________ _________ _________ _________
A1YS 3 0 0 0 0
A3TS 0 0 0 0 1
A3BU 0 2 5 0 0
A14X 0 0 0 4 0
我有以下 CSV 格式的用户评分项目:
A1YS,8F20,3.0
A3TS,8320,2.0
A3BU,1905,5.0
A3BU,3574,4.0
A14X,185A,1.0
这些列是 UserID,ItemID,Rating
我想将它加载到一个 Matlab 矩阵中,该矩阵包含用户行、项目列和单元格值,示例中将包含评级(未知评级等于零):
8F20, 1905, 3574, 185A
A1YS 3 , 0 , 0 , 0
A3TS 2 , 0 , 0 , 0
A3BU 0 , 5 , 4 , 0
A14X 0 , 0 , 0 , 1
另一件事,实际上矩阵可以形成为:
3 , 0 , 0 , 0
2 , 0 , 0 , 0
0 , 5 , 4 , 0
0 , 0 , 0 , 1
我对 Matlab 很陌生,尝试了一些变体:
和
没有大的成功 - 我将非常感谢任何帮助。
编辑: 到目前为止我得到的是:
fid = fopen('ratings_sample.csv');
out = textscan(fid,'%s%s%d%d','delimiter',',');
fclose(fid);
c1 = out{1};
c2 = out{2};
c3 = out{3};
我的问题是我需要重复删除 c1
和 c2
并正确填充矩阵的内部单元格。另外,我不知道这是否是正确的加载方式。
如果UserID和ItemID是唯一的,可以使用crosstab
:
UserID = categorical(c1);
ItemID = categorical(c2);
Rating = crosstab(UserID,ItemID);
Rating(Rating==1) = c3;
并得到:
Rating =
3 0 0 0 0
0 0 0 0 1
0 2 5 0 0
0 0 0 4 0
如果你想把它组织成table,你需要先将项目的ID转换成一个有效的变量名(以字母开头):
Items = cellfun(@(s) ['Item_' s],c2,'un',0);
然后你可以用一个table
来保存所有的数据:
Tbl = array2table(Rating,...
'RowNames',unique(c1,'stable'),...
'VariableNames',unique(Items,'stable'))
结果:
Tbl =
4×5 table
Item_8F20 Item_8320 Item_1905 Item_3574 Item_185A
_________ _________ _________ _________ _________
A1YS 3 0 0 0 0
A3TS 0 0 0 0 1
A3BU 0 2 5 0 0
A14X 0 0 0 4 0