基于SVD的降维优化
基于SVD的降维优化
向量降维:尽量保留数据“重要信息”的基础上减少向量维度。可以发现重要的轴(数据分布广的轴),将二维数据 表示为一维数据,用新轴上的投影值来表示各个数据点的值,示意图如下。
稀疏矩阵和密集矩阵转换:大多数元素为0的矩阵称为稀疏矩阵,从稀疏矩阵中找出重要的轴,用更少的维度对其进行重新表示。结果,稀疏矩阵就会被转化为大多数元素均不为0的密集矩阵。这个密集矩阵就是我们想要的单词的分布式表示。
奇异值分解(Singular Value Decomposition,SVD):任意的矩阵X分解为U、S、V,3个矩阵的乘积,其中U和V是列向量彼此正交的正交矩阵,S是除了对角线元素以外其余元素均为0的对角矩阵。
关于SVD是怎么回事,从代码中分析:
代码中使用 NumPy 的 linalg 模块中的 svd 方法,如下。
U, S, V = np.linalg.svd(W)
我们输出C、W、U、S、V,如下所示,可以看出,C是共现矩阵、W是PPMI矩阵。可以看到S矩阵是降序排列的。
[0 1 0 0 0 0 0]
[1 0 1 0 1 1 0]
[0 1 0 1 0 0 0]
[0 0 1 0 1 0 0]
[0 1 0 1 0 0 0]
[0 1 0 0 0 0 1]
[0 0 0 0 0 1 0][[0. 1.807 0. 0. 0. 0. 0. ][1.807 0. 0.807 0. 0.807 0.807 0. ][0. 0.807 0. 1.807 0. 0. 0. ][0. 0. 1.807 0. 1.807 0. 0. ][0. 0.807 0. 1.807 0. 0. 0. ][0. 0.807 0. 0. 0. 0. 2.807][0. 0. 0. 0. 0. 2.807 0. ]][[-3.409e-01 -1.110e-16 -3.886e-16 -1.205e-01 0.000e+00 9.323e-01 2.664e-16][ 0.000e+00 -5.976e-01 1.802e-01 0.000e+00 -7.812e-01 0.000e+00 0.000e+00][-4.363e-01 -4.241e-17 -2.172e-16 -5.088e-01 -1.767e-17 -2.253e-01 -7.071e-01][-2.614e-16 -4.978e-01 6.804e-01 -4.382e-17 5.378e-01 9.951e-17 -3.521e-17][-4.363e-01 -3.229e-17 -1.654e-16 -5.088e-01 -1.345e-17 -2.253e-01 7.071e-01][-7.092e-01 -3.229e-17 -1.654e-16 6.839e-01 -1.345e-17 -1.710e-01 9.095e-17][ 3.056e-16 -6.285e-01 -7.103e-01 7.773e-17 3.169e-01 -2.847e-16 4.533e-17]][3.168e+00 3.168e+00 2.703e+00 2.703e+00 1.514e+00 1.514e+00 1.484e-16][[ 0.000e+00 -5.976e-01 -2.296e-16 -4.978e-01 -1.186e-16 2.145e-16 -6.285e-01][-3.409e-01 -1.110e-16 -4.363e-01 0.000e+00 -4.363e-01 -7.092e-01 0.000e+00][ 1.205e-01 -5.551e-16 5.088e-01 0.000e+00 5.088e-01 -6.839e-01 0.000e+00][-0.000e+00 -1.802e-01 -1.586e-16 -6.804e-01 6.344e-17 9.119e-17 7.103e-01][-9.323e-01 -5.551e-17 2.253e-01 0.000e+00 2.253e-01 1.710e-01 0.000e+00][-0.000e+00 7.812e-01 2.279e-16 -5.378e-01 3.390e-16 -2.717e-16 -3.169e-01][ 0.000e+00 2.632e-16 -7.071e-01 8.043e-18 7.071e-01 9.088e-17 1.831e-17]]
下面研究U、S、V矩阵究竟是什么,添加如下代码。
print("______________________")
jym = np.dot(V, U)
print(jym)
print("______________________")
jym2 = np.dot(U, V)
print(jym2)
print("______________________")
V2 = np.transpose(V)
jb = np.dot(V, V2)
print(jb)
输出如下,那就可以把U和V的性质给搞懂了。从jb = np.dot(V, V2),输出jb矩阵是单位矩阵,可知,V和U是正交矩阵。jym = np.dot(V, U),输出jym主对角线元素全为0。U和V是列向量彼此正交的,公式里面把V转置了也就是说,U的列向量和代码里的V的行向量是正交的,所以用V乘U,他们的对角元是0。
______________________
[[-6.212e-17 1.000e+00 1.015e-08 2.968e-16 -5.249e-09 1.712e-16 6.754e-17][ 1.000e+00 1.597e-16 3.967e-16 -2.653e-08 1.099e-16 -1.336e-08 -5.293e-09][ 2.653e-08 3.025e-16 -2.284e-16 -1.000e+00 4.270e-16 1.110e-08 5.760e-09][ 3.718e-16 -1.015e-08 -1.000e+00 1.958e-16 4.416e-10 -2.641e-16 2.132e-16][ 1.336e-08 1.143e-16 2.378e-16 1.110e-08 3.405e-17 -1.000e+00 -2.662e-09][-1.096e-17 5.249e-09 4.416e-10 -4.753e-16 -1.000e+00 -4.458e-17 8.307e-17][-5.293e-09 -1.657e-16 7.657e-17 -5.760e-09 -1.925e-16 2.662e-09 1.000e+00]]
______________________
[[-8.977e-18 9.539e-01 -2.775e-17 -2.497e-01 3.879e-16 7.108e-18 -1.668e-01][ 9.539e-01 9.667e-18 1.764e-01 0.000e+00 1.764e-01 1.670e-01 0.000e+00][ 4.757e-18 1.764e-01 5.000e-01 6.846e-01 -5.000e-01 3.262e-17 -1.578e-02][-2.497e-01 -1.105e-16 6.846e-01 1.064e-16 6.846e-01 -2.032e-02 1.016e-16][ 3.622e-18 1.764e-01 -5.000e-01 6.846e-01 5.000e-01 1.192e-16 -1.578e-02][ 3.622e-18 1.670e-01 -1.220e-16 -2.032e-02 6.079e-17 9.043e-17 9.857e-01][-1.668e-01 2.741e-17 -1.578e-02 -5.192e-17 -1.578e-02 9.857e-01 -4.663e-17]]
______________________
[[ 1.000e+00 6.620e-17 7.901e-18 -1.015e-08 -8.632e-18 5.249e-09 -9.431e-17][ 6.620e-17 1.000e+00 2.653e-08 -3.141e-18 1.336e-08 -1.414e-16 -5.293e-09][ 7.901e-18 2.653e-08 1.000e+00 -1.074e-17 -1.110e-08 4.054e-17 5.760e-09][-1.015e-08 -3.141e-18 -1.074e-17 1.000e+00 4.150e-18 -4.416e-10 1.171e-16][-8.632e-18 1.336e-08 -1.110e-08 4.150e-18 1.000e+00 3.792e-17 -2.662e-09][ 5.249e-09 -1.414e-16 4.054e-17 -4.416e-10 3.792e-17 1.000e+00 2.740e-16][-9.431e-17 -5.293e-09 5.760e-09 1.171e-16 -2.662e-09 2.740e-16 1.000e+00]]
SVD的直观意义是什么:
U是正交矩阵。这个正交矩阵构成了一些空间中的基轴 (基向量),可以将矩阵U作为“单词空间”。 S是对角矩阵,奇异值在对角线上降序排列,奇异值的大小也就意味着“对应的基轴”的重要性。奇异值小,对应基轴重要性就小,所以可以通过去除U矩阵中的多余的列向量来近似原始矩阵。从而把单词向量用降维后的矩阵表示。示意图如下。
稀疏向量W经过 SVD 被转化成了密集向量U。如果要对这个密集向量降维,比如把它降维到二维向量,取出U的前两个元素即可。
text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
vocab_size = len(id_to_word)
C = create_co_matrix(corpus, vocab_size, window_size=1)
W = ppmi(C)# SVD
U, S, V = np.linalg.svd(W)np.set_printoptions(precision=3) # 有效位数为3位
for i in range(7):print(C[i])print(U)
# plot
for word, word_id in word_to_id.items():plt.annotate(word, (U[word_id, 0], U[word_id, 1]))
plt.scatter(U[:,0], U[:,1], alpha=0.5)
plt.show()
输出的U:
[[-3.409e-01 -1.110e-16 -3.886e-16 -1.205e-01 0.000e+00 9.323e-012.664e-16][ 0.000e+00 -5.976e-01 1.802e-01 0.000e+00 -7.812e-01 0.000e+000.000e+00][-4.363e-01 -4.241e-17 -2.172e-16 -5.088e-01 -1.767e-17 -2.253e-01-7.071e-01][-2.614e-16 -4.978e-01 6.804e-01 -4.382e-17 5.378e-01 9.951e-17-3.521e-17][-4.363e-01 -3.229e-17 -1.654e-16 -5.088e-01 -1.345e-17 -2.253e-017.071e-01][-7.092e-01 -3.229e-17 -1.654e-16 6.839e-01 -1.345e-17 -1.710e-019.095e-17][ 3.056e-16 -6.285e-01 -7.103e-01 7.773e-17 3.169e-01 -2.847e-164.533e-17]]
用二维向量表示各个单词,并把它们画在图上,画出的图如下:goodbye 和 hello、you 和 i 位置接近,这个结果复合之前做的基于余弦相似度的结果。
基于SVD的降维优化相关推荐
- 基于SVD++隐语义模型的信任网络推荐算法
点击上方蓝字关注我们 基于SVD++隐语义模型的信任网络推荐算法 陈佩武1, 束方兴2 1 平安科技(深圳)有限公司,广东 深圳 518031 2 北京大学互联网研究院(深圳),广东 深圳 51805 ...
- 利用矩阵奇异值分解(SVD)进行降维
一.SVD的优缺点及应用场合 1.优点:简化数据,去除噪声,提高算法的结果 2.缺点:数据的转换可能难以理解 3.适用场合:数值型数据 二.SVD算法主要用途 SVD是矩阵分解的一种类型,而矩阵分解是 ...
- 【LSSVM回归预测】基于matlab麻雀算法优化LSSVM回归预测【含Matlab源码 1128期】
⛄一.麻雀算法优化LSSVM简介 1 标准麻雀算法 算法运算过程由探索者.追随者与预警者3部分构成,其中探索者与追随者的总数量与比例不变,根据适应度数值的改变,两者可以相互转化.通过觅食和反捕食行为来 ...
- 【风电功率预测】基于matlab麻雀算法优化LSSVM风电功率预测(多输入单输出)【含Matlab源码 1718期】
⛄一.麻雀算法优化LSSVM简介 1 标准麻雀算法 算法运算过程由探索者.追随者与预警者3部分构成,其中探索者与追随者的总数量与比例不变,根据适应度数值的改变,两者可以相互转化.通过觅食和反捕食行为来 ...
- UA MATH567 高维统计III 随机矩阵2 算子范数与Frobenius范数 基于SVD的low-rank approximation
UA MATH567 高维统计III 随机矩阵2 算子范数与Frobenius范数 基于SVD的low-rank approximation 矩阵的范数 假设AAA是从nnn维欧氏空间到mmm维欧氏空 ...
- 基于ceres的后端优化的代码实现
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨从零开始搭SLAM 作者丨李太白lx 由于g2o天然是进行位姿图优化的, 所以十分契合karto ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)
基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...
- 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化
25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...
最新文章
- server环境信息【C#代码获取】
- 两台linux服务器负载均衡代码实现,nginx实现负载均衡,nginx负载均衡确保两台服务器数据保...
- 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
- make *** 没有指明目标并且找不到 makefile。 停止。_Makefile目标文件搜索(VPATH和vpath)...
- 教你直白的理解贝塞尔曲线???
- Vue.js-资料-组件化思想 —上
- 写表单验证等页面的总结
- paip..net VS2010提示当前上下文中不存在名称的解决
- 微信开发者工具在C盘下User Data有啥用,能删掉吗?占用空间超大
- 云服务器复现PointRCNN代码踩坑总结
- python程序语言和机器人控制系统_机器人系统设计与制作:Python语言实现
- 什么是和包(NFC)业务
- MSCap: Multi-Style Image Captioning with Unpaired Stylized Text
- JS写一个图片抽奖机
- 6、TWS API的体系结构和连接
- Hive安装过程中出现 The reference to entity createDatabaseIfNotExist must end with the ';' delimiter.问题
- Lattice Planner从学习到放弃(二):二次规划的应用与调试
- MATLAB使用:如何将其他格式的数据转换成MATLAB喜欢的“.mat”格式
- 【Azure Data Platform】ETL工具(11)——ADF 数据流
- python语言int什么意思_int在python中什么意思
热门文章
- 精通ASP.NET MVC ——模型验证
- JQuery Datatables 服务端分页简单应用学习
- 哈工大C语言公开课练兵编程(二)
- Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件
- java observer模式_Java观察者模式(Observer)详解及应用
- jackson 读取多文件_Spring Boot系列之读取配置
- linux临时挂载别的文件目录_linux基础05:linux系统目录有哪些?命令行界面如何切换目录?...
- win7输入密码界面背景怎么更改
- 前端windows下常用的CMD 命令归纳
- java guava限流,Guava的RateLimiter实现接口限流