机器学习实战第十四章-利用SVD简化数据

2023-11-12

一,什么是SVD

SVD(Singular Value Decomposition):奇异值分解。
基本知识如下图所示:
SVD原理

SVD分解

其中U和V都可以作为高维转低维的转换矩阵将原始高维冗余数据转换到一个低维无冗余语义空间中,从而实现数据的降维。

SVD的应用

  • 优点:简化数据,去除噪声,提高算法的结果。
  • 缺点:数据的转换可能难以理解。
  • 适用数据类型:数值型数据。
  • 应用:LSA/LSI(隐性语义索引或隐性语义分析)、推荐系统、图像压缩等等

二,Numpy实现SVD

from numpy import *
def loadExData():
    return [[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]]
Data = loadExData()
U,sigma,VT = linalg.svd(Data)
reconData = U[:,:3]*mat(diag(sigma[:3]))*VT[:3,:]
print(Data,'\n',reconData,'\n',sum(Data-reconData))

三,SVD在推荐系统中的应用

1,基于协同过滤的推荐系统

它和基于内容的内容系统有本质的不同。
本质:协同过滤是通过将用户与其他用户的数据进行对比,然后将相似度高的用户喜欢的东西推荐给该用户来实现推荐的。
分为两类:

  • 基于物品的协同过滤
  • 基于用户的协同过滤

用户数量一般都远远大于物品,所以一般情况下都是基于物品的协同过滤。

2,相似度计算

  • 欧式距离相似度:相似度=1/(1+距离)
  • 皮尔逊相关系数相似度:相似度=0.5+0.5*linalg.corrcoef()
  • 余弦相似度:相似度= 0.5+0.5cosθ=0.5+0.5A⃗ B⃗ |A⃗ ||B⃗ |
    这样可以把所有的相似度的取值归一化到0到1之间。
def euclidSim(inA,inB):
        return 1.0/(1+linalg.norm(inA-inB))
def pearsSim(inA,inB):
        if len(inA)<3:return 1.0
        return 0.5+0.5*linalg.corrcoef(inA,inB,rowvar=0)[0][1]
def cosSim(inA,inB):
        num = float(inA.T*inB)
        denom = linalg.norm(inA)*linalg.norm(inB)
        return 0.5+0.5*(num/denom)

3,推荐系统的评价

具体做法:将某些已知的评分去掉,然后对它们进行预测,最后计算预测值与真实值之间的差异。
最常用的评价指标为:最下均方根误差(Root Mean Squared Error,RMSE)

4,原始的推荐系统(推荐未用过的物品)

计算相似度时,维度很大导致计算量很大。

5,利用SVD提高推荐的效果

我们可以将用户物品评分矩阵进行SVD分解,将原始矩阵降维到一个低维语义矩阵(其中U矩阵可以将物品转换到低维空间,而V矩阵可以将用户转换到低维空间),从而减少计算相似度时的计算量,提高效率(当然也有可能提升推荐效果,因为它低维是从语义上计算相似度的,可能去除掉噪声)。

四,基于SVD的图像压缩

def printMat(inMat,thresh=0.8):
    for i in range(32):
        for j in range(32):
            if float(inMat[i,j])>thresh:
                print('1',end='')
            else:print('0',end='')
        print('')
def imgCompress(numSV=3,thresh=0.8):
    myl = []
    for line in open('0_5.txt').readlines():
        newRow = [int(i) for i in line.strip()]
        myl.append(newRow)
    myMat = mat(myl)
    print('******The original matrix******')
    printMat(myMat,thresh)
    U,sigma,VT = linalg.svd(myMat)
    reconMat = U[:,:numSV]*mat(diag(sigma[:numSV]))*VT[:numSV,:]
    print('******The reconstructed matrix using %d singular values******'%numSV)
    printMat(reconMat,thresh)

效果如下:

>>> svd.imgCompress(2)
******The original matrix******
00000000000000110000000000000000
00000000000011111100000000000000
00000000000111111110000000000000
00000000001111111111000000000000
00000000111111111111100000000000
00000001111111111111110000000000
00000000111111111111111000000000
00000000111111100001111100000000
00000001111111000001111100000000
00000011111100000000111100000000
00000011111100000000111110000000
00000011111100000000011110000000
00000011111100000000011110000000
00000001111110000000001111000000
00000011111110000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000001111100000000011111000000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000011111000000
00000000111110000000111111000000
00000000111111000001111110000000
00000000011111111111111110000000
00000000001111111111111110000000
00000000001111111111111110000000
00000000000111111111111000000000
00000000000011111111110000000000
00000000000000111111000000000000
******The reconstructed matrix using 2 singular values******
00000000000000000000000000000000
00000000000000000000000000000000
00000000000001111100000000000000
00000000000011111111000000000000
00000000000111111111100000000000
00000000001111111111110000000000
00000000001111111111110000000000
00000000011110000000001000000000
00000000111100000000001100000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001110000000
00000000111100000000001100000000
00000000001111111111111000000000
00000000001111111111110000000000
00000000001111111111110000000000
00000000000011111111100000000000
00000000000011111111000000000000

使用SVD压缩后的图像只需要存储 UVT 和两个奇异值,共32*2*2+2=130个数,比原始数目32*32=1024少得多了!

五,总结

SVD是一种强大的降维工具,我们可以利用SVD来逼近矩阵并从中提取重要特征。通过保留矩阵80%~90%的能量,就可以得到重要的特征并去掉噪声。SVD已有很多应用,其中一个成功的应用案例就是推荐引擎。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习实战第十四章-利用SVD简化数据 的相关文章

  • Chrome 扩展程序开发

    按chrome开发规范 我们首先建一个文件夹 如D AutoClickDemo 在该文件夹下新建一个名为manifest json的文本文件 并按实际情况放一个图片文件 作为插件的图标 然后新建一个名为myscript js的js脚本文件
  • SQL查询一个表中根据其中一个列的属性来拼接多个列并SELECT INTO 新表显示

    将同一个表中 不同 Group 属性的添加列分成一整行 SELECT INTO VP Temp FROM SELECT DISTINCT A ID A TypeName A ItemType A isBad A sNo sNo1 A Che
  • C++ 类的静态成员详细讲解

    在C 中 静态成员是属于整个类的而不是某个对象 静态成员变量只存储一份供所有对象共用 所以在所有对象中都可以共享它 使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则 保证了安全性还可以节省内存 静态成员的定义或声明要加个关键st
  • C++控制台输入

    我们在刷牛客网的题目时 经常遇到多组输入 执行到文件结束 下面介绍几种写法 1 C语言的输入多个整数 while scanf d n EOF 为End Of File的缩写 通常在文本的最后存在此字符表示资料结束 code 2 C 输入字符

随机推荐

  • PyQt实现图形化界面的视频播放

    PyQt实现图形化界面的视频播放 PyQt是一款流行的Python GUI库 它可以与Python的许多其他工具和库结合使用 OpenCV是一个功能强大的计算机视觉库 可以处理图像和视频 本文将介绍如何结合使用PyQt和OpenCV来创建一
  • SSL单双向认证

    一 TLS SSL协议 HTTPS协议是在HTTP TLS SSL协议组成的可进行加密传输 身份认证的网络协议 旨在保证数据传输过程中的保密性 完整性和安全性 HTTPS在HTTP和TCP之间 增加了TLS SSL协议 正是通过TLS协议
  • Property xxx was accessed during render but is not defined on instance

    vue3 x版本在结合element plus使用如果使用了表单元素以及v model指令会在控制台看到类似的警告 虽然不影响js运行 但是对于强迫症玩家难受的不行 下面我们来看一下这个问题是如何产生的 应该怎么解决 原因 vue3 x版本
  • HDFS加密区加密过程

    HDFS加密区 encryption zone 中的每个文件都使用唯一的数据加密密钥 data encryption key DEK 进行加密 明文DEK被区域级加密密钥 加密区密钥 encryption zone key EZK 加密成加
  • 灵感爆发:An/flash 影片剪辑动画播放一遍后,摆脱paly()的控制

    有一个影片剪辑我只想让他播放一次就停下来 但是我的播放按钮 就一个命令 this play 现在有个矛盾 播放按钮和暂停按钮都在 暂停在影片剪辑动画的中间还好 但是不小心暂停在最后一帧 在播放就会从头 播放按钮只有一个功能就是从当前帧继续播
  • MySQL高阶语句(三)

    一 NULL值 在 SQL 语句使用过程中 经常会碰到 NULL 这几个字符 通常使用 NULL 来表示缺失 的值 也就是在表中该字段是没有值的 如果在创建表时 限制某些字段不为空 则可以使用 NOT NULL 关键字 不使用则默认可以为空
  • Webpack 4.X 配置cdn加载资源

    众所周知 SPA单页应用 首次访问需要加载近全部资源 从而导致首页渲染速度很慢 继而 出现很多性能优化方案 图片 资源懒加载 减少http请求 减小请求资源大小 减少dom操作避免触发回流重绘 gzip压缩 cdn加载等等 今天 我们就具体
  • 使用OpenSSL搭建CA

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 SSL TLS 1 机密性 数据加密 对称加密 2 完整性 保证数据不会被篡改 或是因为数据传输丢失 单向加密 提高特征码 附加到数据后 3 可靠性 二 概述 如何实现
  • ubuntu 18.04 校园网连接问题:MAC物理地址不匹配。

    ifconfig belong to net tools net tools have been removed in Ubuntu 18 04 so we need to install net tools by hand Notice
  • Stable Diffusion实现AI绘画,尝试向实际业务迈进...

    前置 由于处于学习初期 懂得较少以及可能会出现理解错误等情况 故而文章仅供参考学习使用 旨在分享知识 共同学习 不能作为依据 如有错误 感谢指出 文章主题分为两部分 学习部分也就理论知识 实践部分主要包括问题及解决方案 一 Stable D
  • less-loader 报错

    当vue页面中初次使用了 lang less 通常会报错 信息比如 Module not found Error Can t resolve xxxxxxxx node modules less loader dist cjs js 此时需
  • 多元线性回归模型可视化

    绘制平面图 绘制 房价 与 房价面积 及 房间数量 之间关系的散点图 import numpy as np import matplotlib pyplot as plt from mpl toolkits mplot3d import A
  • 通俗理解数字签名,数字证书和https

    前言 最近在开发关于PDF合同文档电子签章的功能 大概意思就是在一份PDF合同上签名 盖章 使其具有法律效应 签章有法律效应必须满足两个条件 能够证明签名 盖章者是谁 无法抵赖 PDF合同在签章后不能被更改 在纸质合同中 由于签名字迹的不可
  • 【渗透测试笔记】之【内网渗透——CS流量隐蔽】

    文章目录 1 修改端口特征 2 修改证书特征 2 配置CDN 3 生成自定义配置文件 4 效果演示 1 修改端口特征 vim teamserver 将默认端口修改 Dcobaltstrike server port 54321 2 修改证书
  • C++入门——命名空间

    文章目录 前言 命名空间的定义 命名空间的使用 前言 在c c 中 会有变量 函数以及后面的类 这些名称都要存在于局部的 可能会有冲突 所以使用命名空间的意义就是 对标识符的名称进行本地化 以避免命名冲突或者名字的污染 namespace关
  • WSL 2 网络配置

    文章目录 WSL 2 访问局域网内设备 WSL 2 访问本机 Windows WSL 2 访问非本机 Windows 设备 局域网内设备访问 WSL 2 本机 Windows 访问 WSL 2 非本机 Windows 设备访问 WSL 2
  • 支持向量机matlab代码程序_多核支持向量机原理及实现

    了解非线性支持向量机模型后 应该对支持向量机的原理与核技巧都有掌握 本文在传统非线性支持向量机基础上向大家介绍多核支持向量机 这里就不对支持向量机原理与核函数花费太多笔墨了 主要介绍将单核支持向量机转换为多核支持向量机的思想 原理介绍完之后
  • Some collections were archived because you’ve reached the shared requests limits.错误解决

    今天打开我的postman 发现我的一个collection不见了 左下角出现一个提示 Some collections were archived because you ve reached the shared requests li
  • win11安装WSA(安卓子系统)教程

    1 更新到最新版win11 截止2021年10月23日 最新版本号是22000 282 2 启用Windows沙盒和Windows虚拟机监控程序平台 控制面板打开程序与功能 启用或关闭Windows功能 找到这两个选项 打钩确定 等待安装
  • 机器学习实战第十四章-利用SVD简化数据

    一 什么是SVD SVD Singular Value Decomposition 奇异值分解 基本知识如下图所示 其中U和V都可以作为高维转低维的转换矩阵将原始高维冗余数据转换到一个低维无冗余语义空间中 从而实现数据的降维 SVD的应用