基于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的降维优化相关推荐

  1. 基于SVD++隐语义模型的信任网络推荐算法

    点击上方蓝字关注我们 基于SVD++隐语义模型的信任网络推荐算法 陈佩武1, 束方兴2 1 平安科技(深圳)有限公司,广东 深圳 518031 2 北京大学互联网研究院(深圳),广东 深圳 51805 ...

  2. 利用矩阵奇异值分解(SVD)进行降维

    一.SVD的优缺点及应用场合 1.优点:简化数据,去除噪声,提高算法的结果 2.缺点:数据的转换可能难以理解 3.适用场合:数值型数据 二.SVD算法主要用途 SVD是矩阵分解的一种类型,而矩阵分解是 ...

  3. 【LSSVM回归预测】基于matlab麻雀算法优化LSSVM回归预测【含Matlab源码 1128期】

    ⛄一.麻雀算法优化LSSVM简介 1 标准麻雀算法 算法运算过程由探索者.追随者与预警者3部分构成,其中探索者与追随者的总数量与比例不变,根据适应度数值的改变,两者可以相互转化.通过觅食和反捕食行为来 ...

  4. 【风电功率预测】基于matlab麻雀算法优化LSSVM风电功率预测(多输入单输出)【含Matlab源码 1718期】

    ⛄一.麻雀算法优化LSSVM简介 1 标准麻雀算法 算法运算过程由探索者.追随者与预警者3部分构成,其中探索者与追随者的总数量与比例不变,根据适应度数值的改变,两者可以相互转化.通过觅食和反捕食行为来 ...

  5. UA MATH567 高维统计III 随机矩阵2 算子范数与Frobenius范数 基于SVD的low-rank approximation

    UA MATH567 高维统计III 随机矩阵2 算子范数与Frobenius范数 基于SVD的low-rank approximation 矩阵的范数 假设AAA是从nnn维欧氏空间到mmm维欧氏空 ...

  6. 基于ceres的后端优化的代码实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨从零开始搭SLAM 作者丨李太白lx 由于g2o天然是进行位姿图优化的, 所以十分契合karto ...

  7. 基于oracle的sql优化

    [基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...

  8. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  9. 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化

    25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...

最新文章

  1. server环境信息【C#代码获取】
  2. 两台linux服务器负载均衡代码实现,nginx实现负载均衡,nginx负载均衡确保两台服务器数据保...
  3. 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
  4. make *** 没有指明目标并且找不到 makefile。 停止。_Makefile目标文件搜索(VPATH和vpath)...
  5. 教你直白的理解贝塞尔曲线???
  6. Vue.js-资料-组件化思想 —上
  7. 写表单验证等页面的总结
  8. paip..net VS2010提示当前上下文中不存在名称的解决
  9. 微信开发者工具在C盘下User Data有啥用,能删掉吗?占用空间超大
  10. 云服务器复现PointRCNN代码踩坑总结
  11. python程序语言和机器人控制系统_机器人系统设计与制作:Python语言实现
  12. 什么是和包(NFC)业务
  13. MSCap: Multi-Style Image Captioning with Unpaired Stylized Text
  14. JS写一个图片抽奖机
  15. 6、TWS API的体系结构和连接
  16. Hive安装过程中出现 The reference to entity createDatabaseIfNotExist must end with the ';' delimiter.问题
  17. Lattice Planner从学习到放弃(二):二次规划的应用与调试
  18. MATLAB使用:如何将其他格式的数据转换成MATLAB喜欢的“.mat”格式
  19. 【Azure Data Platform】ETL工具(11)——ADF 数据流
  20. python语言int什么意思_int在python中什么意思

热门文章

  1. 精通ASP.NET MVC ——模型验证
  2. JQuery Datatables 服务端分页简单应用学习
  3. 哈工大C语言公开课练兵编程(二)
  4. Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件
  5. java observer模式_Java观察者模式(Observer)详解及应用
  6. jackson 读取多文件_Spring Boot系列之读取配置
  7. linux临时挂载别的文件目录_linux基础05:linux系统目录有哪些?命令行界面如何切换目录?...
  8. win7输入密码界面背景怎么更改
  9. 前端windows下常用的CMD 命令归纳
  10. java guava限流,Guava的RateLimiter实现接口限流