@@ -9,84 +9,82 @@ type: post
9
9
published: false
10
10
---
11
11
12
-
13
- 数据
12
+ 数据
14
13
15
14
1 1 7.97
16
15
2 1 10.2
17
16
3 1 14.2
18
17
4 1 16.0
19
18
5 1 21.2
20
19
21
- 脚本:
20
+ 脚本:
22
21
23
22
A <- x[,1:2]
24
23
b <- x[,3]
25
24
C <- t(A) %*% A
26
25
solve(C, t(A)%*%b)
27
26
28
- 必须将矩阵转化为方阵才能进行solve,结果同
27
+ 必须将矩阵转化为方阵才能进行solve,结果同
29
28
30
29
lm(b ~ A)
31
30
32
-
33
- A <- read.csv(textConnection("
34
- 3 2 4 0 0 0 0
35
- 1 0 1 0 0 0 0
36
- 0 1 2 0 0 0 0
37
- 0 0 0 1 1 1 1
38
- 0 0 0 1 0 1 1
39
- 0 0 0 3 2 2 3
40
- "), header = FALSE, sep = ' ')
31
+ A <- read.csv(textConnection("
32
+ 3 2 4 0 0 0 0
33
+ 1 0 1 0 0 0 0
34
+ 0 1 2 0 0 0 0
35
+ 0 0 0 1 1 1 1
36
+ 0 0 0 1 0 1 1
37
+ 0 0 0 3 2 2 3
38
+ "), header = FALSE, sep = ' ')
41
39
42
40
43
- 北京京东世纪贸易有限公司
41
+ 北京京东世纪贸易有限公司
44
42
45
43
http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/
46
44
47
- # 矩阵分解的数学原理
45
+ # 矩阵分解的数学原理
48
46
49
- 首先约定一下符号,对于用户(users)的集合 $$ U $$ ,以及商品的集合 $$ D $$ ,用$$ R $$ 来表示用户商品信息的共现($$ U \times D $$ )矩阵。我们现在想找出 K 个潜在的特征,即:找到两个新矩阵P($$ U \times K $$ ),Q($$ D \times K $$ ),使得:
47
+ 首先约定一下符号,对于用户(users)的集合 $$ U $$ ,以及商品的集合 $$ D $$ ,用$$ R $$ 来表示用户商品信息的共现($$ U \times D $$ )矩阵。我们现在想找出 K 个潜在的特征,即:找到两个新矩阵P($$ U \times K $$ ),Q($$ D \times K $$ ),使得:
50
48
51
49
$R = P \times Q^T = \hat{R}$
52
50
53
- 这时,P包含了所有的用户(U)的相关信息(特征),而Q则包含了商品的相关信息(特征)。那如何找到这两个矩阵呢?
51
+ 这时,P包含了所有的用户(U)的相关信息(特征),而Q则包含了商品的相关信息(特征)。那如何找到这两个矩阵呢?
54
52
55
- 其中的一种方法就是梯度下降(gradient descent):首先先给P、Q一些初始值,然后计算R和$$ P \times Q $$ 的差异,接着通过迭代最小化二者的差异。这个差异我们一般用如下的方式表示:
53
+ 其中的一种方法就是梯度下降(gradient descent):首先先给P、Q一些初始值,然后计算R和$$ P \times Q $$ 的差异,接着通过迭代最小化二者的差异。这个差异我们一般用如下的方式表示:
56
54
57
55
$e_ {ij}^2 = (r_ {ij} - \hat{r}_ {ij})^2 = (r_ {ij} - \sum_ {k=1}^K p_ {ik} q_ {kj})^2$
58
56
59
- 对于上式,我们必须找到一个方向来优化$$ p_{ik},q_{kj} $$ 。换句话说,我们需要知道当前值的梯度下降方向:
57
+ 对于上式,我们必须找到一个方向来优化$$ p_{ik},q_{kj} $$ 。换句话说,我们需要知道当前值的梯度下降方向:
60
58
61
59
$\frac{\partial}{\partial p_ {ik} e_ {ij}^2} = -2(r_ {ij} - \hat{r}_ {ij})(q_ {kj}) = -2 e_ {ij}q_ {kj}$
62
60
63
61
$\frac{\partial}{\partial q_ {ik} e_ {ij}^2} = -2(r_ {ij} - \hat{r}_ {ij})(p_ {ik}) = -2 e_ {ij}p_ {ik}$
64
62
65
- 既然以及找到梯度,那则有
63
+ 既然以及找到梯度,那则有
66
64
67
65
$p_ {ik}^' = p_ {ik} + 2\alpha e_ {ij} q_ {kj}$
68
66
69
67
$q_ {kj}^' = q_ {kj} + 2\alpha e_ {ij} p_ {ik}$
70
68
71
- 这里$$ \alpha $$ 是一个常数,决定梯度的步长,为了避免越过局部最优值,所以$$ \alpha $$ 一般都是一个很小的数,比如0.0002。
69
+ 这里$$ \alpha $$ 是一个常数,决定梯度的步长,为了避免越过局部最优值,所以$$ \alpha $$ 一般都是一个很小的数,比如0.0002。
72
70
73
- 另外一个问题有来了:
71
+ 另外一个问题有来了:
74
72
75
- > 如果我们求得的P和Q的乘积同R完全一致,那么未观测的值(表示为零的行为),依旧是零。
73
+ > 如果我们求得的P和Q的乘积同R完全一致,那么未观测的值(表示为零的行为),依旧是零。
76
74
77
- 这里需要澄清一下:` 我们只对原始数据不为零的元素求解二者差异,而不是全部的元素。 `
75
+ 这里需要澄清一下:` 我们只对原始数据不为零的元素求解二者差异,而不是全部的元素。 `
78
76
79
77
80
- # 规整化 Regularization
78
+ # 规整化 Regularization
81
79
82
- 为了避免过拟合,我们一般会引入Regularization来作为惩罚项,一般是引入一个$$ \beta $$ 来修改误差的平方:
80
+ 为了避免过拟合,我们一般会引入Regularization来作为惩罚项,一般是引入一个$$ \beta $$ 来修改误差的平方:
83
81
84
82
85
83
$e_ {ij}^2 = (r_ {ij} - \sum_ {k=1}^K p_ {ik} q_ {kj})^2 + \frac{\beta}{2} \sum_ {k=1}^K(||P||^2 + ||Q||^2)$
86
84
87
- $$ \beta $$ 用来控制用户特征和商品特征的程度(magnitudes),保证P、Q对R的近似,但不会出现太大的数值。
85
+ $$ \beta $$ 用来控制用户特征和商品特征的程度(magnitudes),保证P、Q对R的近似,但不会出现太大的数值。
88
86
89
- 这样梯度下降的规则就变成了如下:
87
+ 这样梯度下降的规则就变成了如下:
90
88
91
89
$p_ {ik}^' = p_ {ik} + 2\alpha e_ {ij} q_ {kj} - \beta p_ {ik}$
92
90
0 commit comments