花絮:
非常抱歉,之前我没有严格的分清梯度下降和随机行走的区别,导致前一篇SVD的博客部分说法上有点小问题。之前说要实现svd的稀疏矩阵做法,这里算是实现了,总体来说,只要调整一下块的大小,该源码距离实际应用来做大矩阵的分解应该已经很接近了。
SVD的python源代码:
近期看了一篇小文 ,很有收获,故而实现之。由于该文中的中间有详细的说明算法流程和原理,这儿不介绍。大家仔细看看其中的算法说明部分,尤其是那几个公式。和原作相比这里有几个改变值得一提:
- 稀疏块
- 步长控制
- 块操作
- 循环终止控制
# coding=utf-8
import numpy as np
import time
import math
__author__ = 'axuanwu'
# 2015年 9 月 25 日
class XMatrix():
def __init__(self, m=1000, n=100, step=4):
self.zero_like = 0.01 # 伪零: 差异小于该值认为无差异
self.step = int(step) # 数据块的切分方法
self.m = m # 原矩阵行数
self.n = n # 原矩阵列数
self.splits = int(math.ceil(1.0 * self.n / self.step)) # 每行记录的分块数
self.res = self.n % self.step
self.Memory = [] # 存储数据块的实体
self.dict_rowid = {} # 记录数据块的位置字典
self.Memory_max_rowid = -1
self.UUU = np.random.random((self.m, 2))
self.VVV = np.ones((2, 1)) # 本来用做归一化UUU 和 MMM后的 系数矩阵,目前未处理
self.MMM = np.random.random((2, self.n))
def set_data(self, tezhenshu):
self.tezhenshu = tezhenshu
self.UUU = np.random.random((self.m, tezhenshu))
self.VVV = np.zeros((tezhenshu, tezhenshu))
for i in xrange(0, tezhenshu):
self.VVV[i, i] = 1
self.MMM = np.random.random((tezhenshu, self.n))
def intoMatrix(self, i, j, data):
# 矩阵赋值