机器学习实战—利用SVD简化数据

2023-11-17

一、SVD的应用
奇异值分解:
优点:简化数据,去除噪声。提高算法的结果。
缺点:数据转换难以理解。

利用SVD能够实现用小得多的数据集来表示原始数据集,这样做,实际上是去除了噪声和冗余信息。当我们视图节省空间时,去除噪声和冗余信息是目标,但是我们这里则是从数据中抽取信息,基于这个视角,我们可以把SVD看成是从有噪声的数据中抽取相关特征。

1、隐性语义索引(LSI)

利用SVD的方法为隐性语义索引(Latent Semantic Indexing, LSI)或隐性语义分析(Latent Semantic Analysis, LSA)。在LSI中,一个矩阵是由文档和词语组成的,应用SVD时,会构建出多个奇异值,其代表了文档中的概念或主题。

2、推荐系统
这里写图片描述
上述矩阵由餐馆的菜和品菜师对这些菜的意见构成的。品菜师采用1到5之间的任意一个整数来对菜评级,如果品菜师没有尝过某道菜,则评级为0。对上述矩阵进行SVD分解,会得到两个奇异值(注意其特征值位2),也即仿佛有两个概念或主题与此数据集相关联。

3.特征分解

在很多情况下,数据中的一小段携带了数据集中的大部分信息,其他信息则要么是噪声,要么就是毫不相关的信息。在线性代数中还有很多矩阵分解技术。 矩阵分解可以将原始矩阵表示成新的易于处理的形式。

SVD将原始数据集矩阵Data分解成三个矩阵U,sigma,V.T。
这里写图片描述
分解出来的sigma矩阵为对角阵,对角元素从大到小排列,称之为奇异值(Singular Value),这些奇异值为Data*Data.T特征值的平方根。且若是Data的秩为r,则奇异值的个数为r个,也即数据集中仅有r个重要特征。

4.奇异值:

下面谈谈奇异值分解。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法:
这里写图片描述

假设A是一个N * M的矩阵,那么得到的U是一个N * N的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片
这里写图片描述

那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:
这里写图片描述

这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:
这里写图片描述

这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:

r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:
这里写图片描述

右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。

5.奇异值的计算:
奇异值的计算是一个难题,是一个O(N^3)的算法。在单机的情况下当然是没问题的,matlab在一秒钟内就可以算出1000 * 1000的矩阵的所有奇异值,但是当矩阵的规模增长的时候,计算的复杂度呈3次方增长,就需要并行计算参与了。Google的吴军老师在数学之美系列谈到SVD的时候,说起Google实现了SVD的并行化算法,说这是对人类的一个贡献,但是也没有给出具体的计算规模,也没有给出太多有价值的信息。

其实SVD还是可以用并行的方式去实现的,在解大规模的矩阵的时候,一般使用迭代的方法,当矩阵的规模很大(比如说上亿)的时候,迭代的次数也可能会上亿次,如果使用Map-Reduce框架去解,则每次Map-Reduce完成的时候,都会涉及到写文件、读文件的操作。个人猜测Google云计算体系中除了Map-Reduce以外应该还有类似于MPI的计算模型,也就是节点之间是保持通信,数据是常驻在内存中的,这种计算模型比Map-Reduce在解决迭代次数非常多的时候,要快了很多倍。

Lanczos迭代就是一种解对称方阵部分特征值的方法(之前谈到了,解A’* A得到的对称方阵的特征值就是解A的右奇异向量),是将一个对称的方程化为一个三对角矩阵再进行求解。按网上的一些文献来看,Google应该是用这种方法去做的奇异值分解的。请见Wikipedia上面的一些引用的论文,如果理解了那些论文,也“几乎”可以做出一个SVD了。

由于奇异值的计算是一个很枯燥,纯数学的过程,而且前人的研究成果(论文中)几乎已经把整个程序的流程图给出来了。更多的关于奇异值计算的部分,将在后面的参考文献中给出,这里不再深入,我还是focus在奇异值的应用中去。

二、利用Python实现SVD

#SVD算法是对原数据矩阵的分解,分解为左奇异矩阵*奇异值矩阵*右奇异矩阵的乘积
from numpy import *
import numpy as np
def loadDataSet1():
    dataSet = [[1,1],
               [7,7]]
    return mat(dataSet)

def loadDataSet2():
    dataSet = [[1,1,1,0,0],
               [2,2,2,0,0],
               [1,1,1,0,0],
               [5,5,5,0,0],
               [1,1,0,2,2],
               [0,0,0,3,3],
               [0,0,0,1,1]]
    return mat(dataSet)
def loadDataSet3():
    dataSet = [[4,4,0,2,2],
               [4,0,0,3,3],
               [4,0,0,1,1],
               [1,1,1,2,0],
               [2,2,2,0,0],
               [1,1,1,0,0],
               [5,5,5,0,0]]
    return mat(dataSet)

if __name__ == "__main__":
    #利用numpy模块中的函数进行SVD三个矩阵的求解
    # U,sigma,VT = np.linalg.svd(loadDataSet1())
    # sigmaMat = mat([[sigma[0],0],[0,sigma[1]]])
    # print("sigmaMat:",sigmaMat)
    # print("U:",U)
    # print("sigma:",sigma)
    # print("type(sigma):",type(sigma))
    # print("VT",VT)
    # dataSet2 = loadDataSet2()
    # print("dataSet2:",dataSet2)
    # U, sigma, VT = np.linalg.svd(dataSet2)
    # # print("sigma:",sigma)
    # #组合sigma矩阵
    # sigmaMat = mat([[sigma[0],0,0],[0,sigma[1],0],[0,0,sigma[2]]])
    # dataSetRec = U[:,:3]*sigmaMat*VT[:3,:]
    # print()
    # print(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习实战—利用SVD简化数据 的相关文章

  • 小程序获取用户信息实现一键登录

    文章目录 旧版获取用户信息实现登录流程 login页面代码 个人中心页面代码 全局app vue代码 下面是小程序获取用户信息最新调整的方式 温馨提示 以下小程序登录方式只适用于2 27 1版本库以下使用 详情请看微信官方文档调整 旧版获取
  • python中的连续比较是什么_在python中提取连续行之间的差异

    你的例子表明你想要在一对线之间进行比较 这与将其定义为line n 1 line n 不同 后者将给出5个结果 而不是3个 在 结果也取决于你认为的差异 它是位置性的 还是仅仅基于奇数行中缺失的字母 还是两者的差异都适用 例如 boat t
  • 优酷 YouTube Twitter及JustinTV视频网站架构设计笔记

    本文是整理的关于优酷 YouTube Twitter及JustinTV几个视频网站的架构或笔记 对于不管是视频网站 门户网站或者其它的网站 在架构上都有一定的参考意义 毕竟成功者的背后总有值得学习的地方 虽然有些文章的发表时间有点久了 但是

随机推荐

  • 将第三方库改为我自己想要的

    将第三方库改为我自己想要的 方法 比较常用的 给出一些例子 React组合方法 高阶组件方法 方法 修改第三方库以适应自己的需求可以通过多种方法实现 下面是一些常见的策略 继承 通过创建继承自第三方库组件或类的子类 你可以重写或扩展其方法
  • Keil警告和错误语句与消除方法笔记

    遇到的keil相关错误 警告内容在这里进行更新 Warning 1 D last line of file ends without a newline 文件最后一行不是新行 解决 保证文件最后一行什么符号也没有 167 D argumen
  • MySQL索引原理B+树

    B 树索引是B 树在数据库中的一种实现 是最常见也是数据库中使用最为频繁的一种索引 B 树中的B代表平衡 balance 而不是二叉 binary 因为B 树是从最早的平衡二叉树演化而来的 在讲B 树之前必须先了解二叉查找树 平衡二叉树 A
  • shader学习笔记(二)纹理采样

    资料参照 Unity Shader入门精要 冯乐乐 第7章 基础纹理 技术美术百人计划 图形 1 3 纹理的秘密 庄懂的技术美术入门课 美术向 直播录屏 第9课 Unity Shader 入门到改行4 最简纹理采样 1 纹理是什么 1 宏观
  • 程序员面试智力题集锦

    1 你让工人为你工作7天 给工人的回报是一根金条 金条平分成相连的7段 你必须在每天结束时给他们一段金条 如果只许你两次把金条弄断 你如何给你 的工人付费 参考答案 day1 给1 段 day2 让工人把1 段归还给2 段 day3 给1
  • 数据挖掘基础一

    一 数据挖掘 又称为数据库中知识发现 Knowledge Discovery from Database 简称KDD 它是一个从大量数据中抽取挖掘出未知的 有价值的模式或规律等知识的复杂过程 数据挖掘的定义过程描述如下图所示 从图中可以看出
  • Hessian4.0.7反序列化BigDecimal类型Bug

    Hessian虽好 bug也不少 今天遇到hessian反序列化bigdecimal类型 传入参数为121 但经序列化后却为0 问题在BigDecimal类型的应该使用BigDecimalDeserializer 在basic没有BigDe
  • 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标

    修改Qt应用图标和窗口图标 GitHub源码 Qt串口调试助手下载 修改应用图标 首先选择一张喜欢的图片 来作为应用图标 图片格式必须为 ico easyicon net 有很多可供下载的资源 下载好后 将其放入工程目录 之后添加到 Qt的
  • X509证书结构解析

    X509证书是采用DER编码的ASN1结构数据 Certificate SEQUENCE tbsCertificate TBSCertificate signatureAlgorithm AlgorithmIdentifier signat
  • 【技术干货】数字电路电平标准

    信号的逻辑电平经历了从单端信号到差分信号 从低速信号到高速信号的发展过程 最基本的单端信号逻辑电平为CMOS TTL 在此基础上随着电压摆幅的降低 出现LVCMOS LVTTL等逻辑电平 随着信号速率的提升又出现ECL PECL LVPEC
  • Qt 实现 360 安全卫士

    作者 一去 二三里 QQ 技术交流群 242790253 个人微信 iwaleon 加我微信 邀请入 500 人微信群 微信公众号 高效程序员 回想起来 这也算是一个有故事的代码 虽然时间比较久远 但还是记忆犹新 那就简单说说吧 也不枉费当
  • codevs代码分类总结

    由于要参加华为软件精英挑战赛 所以需要把以前做过的有关图论的问题翻出来复习一遍 但是关于图论也有很多分类 所以干脆就做一个总结 先对图论的相关题目过一遍 以后如果有时间 把其他分类的题目也过一遍 图论 也不是每个章节都做了题目 Floyd
  • Elasticsearch全文搜索与TF/IDF

    转载 https my oschina net stanleysun blog 1594220 一 TF IDF 1 TF TF Term Frequency 即词频 它表示一个词在内容 如某文章 中出现的次数 为了消除文档本身大小的影响
  • vue如何使用ueditor富文本插件

    UEditor 是由百度 FEX前端研发团队 开发的所见即所得富文本web编辑器 具有轻量 可定制 注重用户体验等特点 开源基于MIT协议 允许自由使用和修改代码 话不多说看流程 一 显示效果如下 二 首先 下载 ueditor npm i
  • Mastercam软件安装包分享(附安装教程)

    目录 一 软件简介 二 软件下载 一 软件简介 Mastercam是一款广泛应用于机械加工领域的计算机辅助设计与计算机辅助制造 CAD CAM 软件 它由美国CNC软件公司开发 旨在帮助制造商设计和制造高精度的零部件 以下是Masterca
  • java Fileread用法及注意事项

    关于其创建 还有注意事项 package IOtest test1 import org junit Test import java io File import java io FileReader import java io IOE
  • 对线性代数库Eigen3中eulerAngles函数的理解

    编写程序时有时会遇到在四元数 旋转矩阵 欧拉角之间进行转换的操作 使用eulerAngles函数从旋转矩阵中获得欧拉角 了解其使用方法才能保证转换时不出错 头文件
  • 基于双参数蜜蜂算法解决车辆路径问题(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 群智能起源于自然环境中生物群体经过长期自然
  • ffmpeg 合并转换文件_使用FFmpeg转换媒体文件的快速指南

    ffmpeg 合并转换文件 有许多开源工具可用于编辑 调整和将多媒体准确地转换为您所需的内容 诸如Audacity或Handbrake之类的工具非常出色 但有时您只想快速将文件从一种格式更改为另一种格式 输入FFmpeg FFmpeg是处理
  • 机器学习实战—利用SVD简化数据

    一 SVD的应用 奇异值分解 优点 简化数据 去除噪声 提高算法的结果 缺点 数据转换难以理解 利用SVD能够实现用小得多的数据集来表示原始数据集 这样做 实际上是去除了噪声和冗余信息 当我们视图节省空间时 去除噪声和冗余信息是目标 但是我