SVD 梯度下降

花絮:

         非常抱歉,之前我没有严格的分清梯度下降和随机行走的区别,导致前一篇SVD的博客部分说法上有点小问题。之前说要实现svd的稀疏矩阵做法,这里算是实现了,总体来说,只要调整一下块的大小,该源码距离实际应用来做大矩阵的分解应该已经很接近了。

SVD的python源代码:

近期看了一篇小文 ,很有收获,故而实现之。由于该文中的中间有详细的说明算法流程和原理,这儿不介绍。大家仔细看看其中的算法说明部分,尤其是那几个公式。和原作相比这里有几个改变值得一提:

  1. 稀疏块
  2. 步长控制
  3. 块操作
  4. 循环终止控制
这里先上源码。
# 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):
        # 矩阵赋值
      
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值