矩阵分解ALS方法
2016-11-29 15:20
316 查看
目标函数
优化目标函数
利用坐标下降法,依次更新u和v的值。u和v的先后顺序无所谓,只要保证两者是交替更新的就好。这种方法又称为alternating least squares(ALS)。
增加偏置项
在行和列都增加一个常数项,去除每个用户的个体影响。
更新的公式修正为
增加正则项
实现代码
## 初始化矩阵 U = np.random.randn(M, K) / K V = np.random.randn(K, N) / K B = np.zeros(M) C = np.zeros(N) ## 迭代T步,每一步依次更新B、U、C、V矩阵 for t in xrange(T): # update B for i in xrange(M): if i in ratings_by_i: accum = 0 for j, r in ratings_by_i[i]: accum += (r - U[i,:].dot(V[:,j]) - C[j] - mu) B[i] = accum / (1 + reg) / len(ratings_by_i[i]) # update U for i in xrange(M): if i in ratings_by_i: matrix = np.zeros((K, K)) + reg*np.eye(K) vector = np.zeros(K) for j, r in ratings_by_i[i]: matrix += np.outer(V[:,j], V[:,j]) vector += (r - B[i] - C[j] - mu)*V[:,j] U[i,:] = np.linalg.solve(matrix, vector) # update C for j in xrange(N): if j in ratings_by_j: accum = 0 for i, r in ratings_by_j[j]: accum += (r - U[i,:].dot(V[:,j]) - B[i] - mu) C[j] = accum / (1 + reg) / len(ratings_by_j[j]) # update V for j in xrange(N): if j in ratings_by_j: matrix = np.zeros((K, K)) + reg*np.eye(K) vector = np.zeros(K) for i, r in ratings_by_j[j]: matrix += np.outer(U[i,:], U[i,:]) vector += (r - B[i] - C[j] - mu)*U[i,:] V[:,j] = np.linalg.solve(matrix, vector)
相关文章推荐
- 机器学习中的矩阵方法04:SVD 分解
- 数值计算与方法 && 实验6||7 && LU分解求行列式的值和矩阵的逆
- 基于矩阵分解推荐算法之交替最小二乘法(ALS)--附实现代码
- 【转】 矩阵分解方法及 在推荐系统中的应用
- 机器学习中的矩阵分解方法
- 基于单应矩阵分解的位姿提取方法
- 基于One-Class的矩阵分解方法
- 线性代数与数值方法--矩阵分解
- 基于Spark mllib的矩阵分解(ALS)推荐算法
- 【计算方法笔记】矩阵分解求解线性方程组
- 矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)
- 推荐系统中矩阵分解方法:svd,非对称svd和svd++的区别
- C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
- 机器学习中的矩阵方法03:QR 分解
- 关于矩阵分解:特征值分解 svd分解 mf分解 lmf分解 pca 以及个性化推荐 fm ffm als
- 基于单应矩阵分解的位姿提取方法
- 矩阵分解之最小二乘法ALS
- mahout基于矩阵分解的协同过滤实例 ALS——WR
- 机器学习中的矩阵方法04:SVD 分解
- 机器学习中的矩阵方法03:QR 分解