每一行是一部电影,每一列是一个人,而单元格的数据则是该人对该电影的兴趣度:
dat <- matrix(
data = c(1,0,1,0,
0,1,-1,1,
1,0,1,0,
1,-1,1,-1,
-1,1,-1,0,
0,-1,1,-2),
nrow = 6,
byrow = T,
dimnames = list(c('海上钢琴师','流浪地球', '寻梦环游记',
'疯狂动物城', "星际穿越", "美丽人生"),
c('陈敏', "王磊", "肖埼", "刘刚"))
)
dat
## 陈敏 王磊 肖埼 刘刚
## 海上钢琴师 1 0 1 0
## 流浪地球 0 1 -1 1
## 寻梦环游记 1 0 1 0
## 疯狂动物城 1 -1 1 -1
## 星际穿越 -1 1 -1 0
## 美丽人生 0 -1 1 -2
SVD分解
(SVD <- svd(dat))
## $d
## [1] 3.8674630 2.0559739 0.7793420 0.4564289
##
## $u
## [,1] [,2] [,3] [,4]
## [1,] -0.2492718 -0.47492314 0.4276035 0.17165901
## [2,] 0.4163181 -0.25759025 0.2283338 -0.67689747
## [3,] -0.2492718 -0.47492314 0.4276035 0.17165901
## [4,] -0.5085859 -0.07772673 -0.1064321 -0.68845565
## [5,] 0.3729446 0.38982151 0.6747350 -0.06069724
## [6,] -0.5519593 0.56968503 0.3399691 -0.07225542
##
## $v
## [,1] [,2] [,3] [,4]
## [1,] -0.3568422 -0.6894030 0.09500316 -0.62318663
## [2,] 0.4783001 -0.1749667 0.85909873 0.05064616
## [3,] -0.6072072 -0.2870266 0.23824622 0.70153676
## [4,] 0.5245875 -0.6416587 -0.44290237 0.34193503
矩阵\(U\)中,行是电影,列是归纳出的电影主题,数值可以理解为两者的相关程度(也就是线性组合的系数)
用\(A^{t}U\)就得到了不同个体对四个电影主题的偏好:
t(dat) %*% SVD$u
## [,1] [,2] [,3] [,4]
## 陈敏 -1.380074 -1.4173945 0.07403995 -0.28444039
## 王磊 1.849808 -0.3597270 0.66953173 0.02311637
## 肖埼 -2.348352 -0.5901192 0.18567529 0.32020166
## 刘刚 2.028823 -1.3192336 -0.34517243 0.15606903
矩阵\(V\)中,行是人,列是归纳出的人的类型,数值可以理解为两者的相关程度:
用\(A^{t}U\)就得到了不同电影被哪几种类型的人喜欢:
dat %*% SVD$v
## [,1] [,2] [,3] [,4]
## 海上钢琴师 -0.9640495 -0.9764296 0.33324938 0.07835014
## 流浪地球 1.6100948 -0.5295988 0.17795013 -0.30895557
## 寻梦环游记 -0.9640495 -0.9764296 0.33324938 0.07835014
## 疯狂动物城 -1.9669370 -0.1598041 -0.08294697 -0.31423106
## 星际穿越 1.4423496 0.8014628 0.52584935 -0.02770397
## 美丽人生 -2.1346823 1.1712576 0.26495224 -0.03297946