SVD矩阵分解

import numpy as npclass SVD:def __init__(self,x):self.x = np.array(x)def get_r_rv(self,x):x = np.array(x)s_matrix = x.T.dot(x)r_list, r_v = np.linalg.eig(s_matrix)return r_list,r_vdef get_matrix_rank(self):return np.linalg.matrix_rank(self.x)def get_V_M(self,x):r_list, r_v = self.get_r_rv(x)index_rank = np.argsort(-r_list)r_list = r_list[index_rank]r_list_ = r_list[r_list > 0]r_max = len(r_list_)V = r_v[:,index_rank]m = np.zeros((r_max,r_max))U = np.zeros((self.x.shape[0],r_max))for i in range(r_max):m[i][i] = np.sqrt(r_list_[i])U[:,i] = (np.dot(self.x, V[:, i]) / np.sqrt(r_list_[i])).TV = V[:, :r_max]return V,m,Udef svd(self,way='norm',k=None):V,m,U= self.get_V_M(self.x)if way == 'norm':return V,m,Uif way == 'truncated':r = self.get_matrix_rank()if k < r and k > 0:return V[:, :k], m[:k, :k], U[:, :k]else:return V, m, Udef main():x = np.array([[0,20,5,0,0],[10,0,0,3,0],[0,0,0,0,1],[0,0,0,1,0]])svd = SVD(x)V, m, U = svd.svd()print(V)print(m)print(U)x = np.array([[0,20,5,0,0],[10,0,0,3,0],[0,0,0,0,1],[0,0,0,1,0]])svd = SVD(x)V, m, U = svd.svd(way='truncated',k=2)print(V)print(m)print(U)if __name__ == '__main__':main()#------result--------------
[[ 0.          0.95709203  0.          0.28978415][ 0.9701425   0.          0.          0.        ][ 0.24253563  0.          0.          0.        ][ 0.          0.28978415  0.         -0.95709203][ 0.          0.          1.          0.        ]][[20.61552813  0.          0.          0.        ][ 0.         10.44429362  0.          0.        ][ 0.          0.          1.          0.        ][ 0.          0.          0.          0.95746064]][[ 1.          0.          0.          0.        ][ 0.          0.99961501  0.          0.02774569][ 0.          0.          1.          0.        ][ 0.          0.02774569  0.         -0.99961501]][[0.         0.95709203][0.9701425  0.        ][0.24253563 0.        ][0.         0.28978415][0.         0.        ]][[20.61552813  0.        ][ 0.         10.44429362]][[1.         0.        ][0.         0.99961501][0.         0.        ][0.         0.02774569]]

结果解释

所分解的矩阵是各个消费者对各个网页的URL点击次数
[[0,20,5,0,0],
[10,0,0,3,0],
[0,0,0,0,1],
[0,0,0,1,0]]

分解结果:
V:
[[ 0. 0.95709203 0. 0.28978415]
[ 0.9701425 0. 0. 0. ]
[ 0.24253563 0. 0. 0. ]
[ 0. 0.28978415 0. -0.95709203]
[ 0. 0. 1. 0. ]]
可以视作各个URL在不同特征维度上的特征值(4个维度)
如URL1的第二个特征较强,URL2的第一个特征较强

U:
[[ 1. 0. 0. 0. ]
[ 0. 0.99961501 0. 0.02774569]
[ 0. 0. 1. 0. ]
[ 0. 0.02774569 0. -0.99961501]]
可以看作用户对URL各个特征维度的偏好
如果用户1对特征1强的URL更加喜欢 因此查询V表发现URL2的特征1维度强
可以解释用户1对URL2的点击高达20次之多
同理用户2对特征2偏好较强,查询V表发现URL1的特征2较强,
可以解释用户2对URL1的点击高达10次之多

m:
[[20.61552813 0. 0. 0. ]
[ 0. 10.44429362 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 0.95746064]]
可以视作各个URL特征的决定性作用或重要性,可以发现URL的前两个特征的重要性明显高于其他两个特征
因此我们对SVD分解结果进行截断得到结果:
V:
[[0. 0.95709203]
[0.9701425 0. ]
[0.24253563 0. ]
[0. 0.28978415]
[0. 0. ]]

U:
[[1. 0. ]
[0. 0.99961501]
[0. 0. ]
[0. 0.02774569]]
仅通过V,U两个矩阵我们就可以获得原用户点击URL矩阵的绝大多数信息,具有较强的解释性。这也是SVD矩阵分解的压缩的性质。

但至于URL的各个特征具体是指什么,这里无法体现,仅能表示用户偏好与URL属性之间的关系,可以用于推荐算法。

统计学习方法第十五章作业:SVD矩阵分解 代码实现 及其在推荐的应用和矩阵压缩意义相关推荐

  1. 统计学习方法第十九章作业:马尔可夫链蒙特卡罗法、吉布斯抽样算法(书上题目) 代码实现

    马尔可夫链蒙特卡罗法 作业19.7 import numpy as np import matplotlib.pyplot as plt from scipy.stats import betacla ...

  2. 统计学习方法第十六章作业:PCA主成分分析算法 代码实现

    PCA主成分分析 import numpy as np class PCA:def __init__(self,x,R=None):self.x = np.array(x)self.dim = sel ...

  3. 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现

    层次聚类聚合/分裂算法 import numpy as np import copy import matplotlib.pyplot as pltclass Hierarchical_cluster ...

  4. 第十五章 我国农业经济效益

    农村改革解说(专著)第十五章 第十五章 我国农业经济效益 1.什么是农业经济效益?它有什么特点? 所谓农业经济效益,就是在社会主义农业经济活动中,劳动耗费与劳动成果之间的比较.在一定的劳动耗费条件下, ...

  5. 《Erlang程序设计》第十五章 ETS和DETS:大数据的存储机制

    第十五章 ETS和DETS:大数据的存储机制 Table of Contents 第十五章 ETS和DETS:大数据的存储机制 15.1 表的基本操作 创建和打开表 插入表 查找元组 释放表 15.2 ...

  6. 数字图像处理:第十五章 图象分割

    第十五章 图象分割 目录 1.    引言 2.    阈值与图象分割 3.    梯度与图象分割 4.    边界提取与轮廓跟踪 5.    Hough变换 6.    区域增长 作业 1.  引言 ...

  7. 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略

    第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...

  8. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常

    第二十五章  未处理异常,向量化异常处理与C++异常 本章内容 25.1 UnhandledExceptionFilter函数详解 25.2 即时调试 25.3 电子表格示例程序 25.4 向量化异常 ...

  9. R语言实战笔记--第十五章 处理缺失数据

    R语言实战笔记–第十五章 处理缺失数据 标签(空格分隔): R语言 处理缺失数据 VIM mice 缺失值(NA),是导致我们计算错误的一大来源,处理缺失数据在实际的应用中有着较为重要的作用. 基本方 ...

最新文章

  1. 《适用于初学者的 Python》
  2. ubuntu mysql的穷_Ubuntu安装配置Mysql
  3. ios 的touch事件分析
  4. TCM与Cache介绍
  5. Error-Project facet Java version 1.8 is not supported
  6. open函数和close函数的使用
  7. C2的完整形式是什么?
  8. 代码随笔——点阵汉字在LCD上的显示
  9. C#基础11.1:static关键字
  10. zabbix监控系统的实际应用(客户端安装-基本应用设置-报警提醒篇)
  11. 程序员戴耳机是为了撩妹子?感觉好酷的样子~
  12. 深入理解java虚拟机(4)---类加载机制
  13. 苹果的教育优惠怎么弄_京东苹果自营如何使用教育优惠!
  14. 完善:HTML5表单新特征简介与举例——张鑫旭
  15. educoder中Spark GraphX—构建图及相关操作
  16. 机器人图形变变变_中班公开课数学教案《图形变变变》
  17. 安卓沉浸式状态栏_要简单还要沉浸 Dacom L10 主动降噪(ANC)蓝牙耳机体验
  18. Go语言 linux下开发 IDE -SpaceVim\NeoVim
  19. 阿里云部署k8s集群
  20. 视频有黑边怎么办?如何裁剪视频画面的黑边?

热门文章

  1. Linux下安装MongoDB全程记录
  2. poj 1149 PIGS【最大流】
  3. 第十次ScrumMeeting博客
  4. 【2040】反向输出序列
  5. pytoch word_language_model 代码阅读
  6. 关于cookie 跨页面处理
  7. erlang分布式编程模型
  8. linux 文件大小ll和du不一致问题
  9. login控件设置居中
  10. 医学论文摘要撰写的四要素以及注意事项