程序员的数学【线性代数高级】(三)

简介: 本文其实值属于:程序员的数学【AIoT阶段二】 的一部分内容,本篇把这部分内容单独截取出来,方便大家的观看,本文介绍 线性代数高级

七、SVD进行数据压缩

🚩根据奇异值分解,进行数据压缩,以图片为例进行展示:

首先我们需要下载一张图片:

链接:https://pan.baidu.com/s/1pyywQWO4U4WWxtuAhAQHMQ?pwd=l7vv

提取码:l7vv

import numpy as np
import matplotlib.pyplot as plt
# 图片压缩
def pic_compress(r, img):
    u, sigma, vt = np.linalg.svd(img)
    compress_img = np.dot(np.dot(u[:, :r], np.diag(sigma[:r])), vt[:r, :])# 还原图像
    size = u.shape[0] * r + r * r + r * vt.shape[1]  # 压缩后大小
    return compress_img, size
filename = './bird.jpg'
img = plt.imread(filename)[:, :, 0] # 取其中的一个颜色通道
compress_img, size = pic_compress(30, img)
print('原图尺寸:' + str(img.shape[0] * img.shape[1]))
print('压缩尺寸:' + str(size))
# 图片绘制
fig, ax = plt.subplots(1, 2,figsize = (12,4))
ax[0].imshow(img,cmap = 'gray')
ax[0].set_title('before compress')
ax[1].imshow(compress_img,cmap = 'gray')
ax[1].set_title('after compress')
plt.show()

image.png

八、SVD进行PCA降维

import numpy as np
from sklearn import datasets
r = 2 # 筛选特征个数
X,y = datasets.load_iris(return_X_y = True)
print('原始数据特征个数是:', X.shape[1])
# 1、去中心化
mean_ = np.mean(X, axis=0)
X -= mean_
# 2、奇异值分解
u, s, v = np.linalg.svd(X)
# 3、符号翻转(如果为负数,那么变成正值)
max_abs_cols = np.argmax(np.abs(u), axis = 0)
display(max_abs_cols)
signs = np.sign(u[max_abs_cols, range(u.shape[1])])
display(signs)
u *= signs
# 4、降维特征筛选
u = u[:, :r]
# 5、归一化
u = (u - u.mean(axis = 0)) / u.std(axis = 0, ddof = 1) # ddof计算样本标准差
display(u[:5])
print('经过PCA降维,数据特征个数是:', u.shape[1])

10.png

九、SVD进行矩阵求逆

9.1 SVD求逆矩阵原理

🚩在矩阵求逆过程中,矩阵通过 S V D  转换到正交空间。不同得奇异值和奇异值向量代表了矩阵中不同的线性无关(或独立)项。对矩阵进行 S V D 分解,形式如下所示:

image.png

奇异值矩阵为:

image.png

image.png

奇异值矩阵逆矩阵为:

image.png

从上面可以看出,S V D 求逆是原始奇异值的倒数,这就使得通过 S V D 对矩阵求逆变得非常简单:奇异值求倒数,奇异矩阵转置。

9.2 SVD求逆代码演示

import numpy as np
A = np.array([[ 3,  4,  5,  5],
              [ 7,  5,  3,  6],
              [ 6,  5,  7,  7],
              [ 4,  9,  8,  9],
              [ 5, 10,  5,  7]])
# A是奇异矩阵
print('矩阵A的形状是:', A.shape)
print('矩阵A的秩是:')
display(np.linalg.matrix_rank(A))
display(np.linalg.inv(A)) # 无法直接求解逆矩阵

11.png

使用奇异值分解,进行逆矩阵求解

import numpy as np
import warnings
warnings.filterwarnings('ignore')
A = np.array([[ 3,  4,  5],
              [ 7,  5,  3],
              [ 6,  5,  7],
              [ 4,  9,  8],
              [ 5, 10,  5]])
u, s, v = np.linalg.svd(A)
display(u, s, v)
m, n = A.shape
# 奇异值求倒数
# sigma = np.concatenate([np.diag(s),np.full(shape = (m-n,n),fill_value = 0)],axis = 0)
# sigma = sigma**(-1)
# cond = np.isinf(sigma)
# sigma[cond] = 0
sigma = np.diag(np.concatenate([s**(-1),[0]*(m-n)]))[:,:3]
# 逆矩阵求解
B = v.T.dot(sigma.T).dot(u.T)
print('矩阵B是A的逆矩阵,两个进行矩阵运算得到单位矩阵:')
display(B.dot(A).round(5))

12.png

十、SVD进行协同过滤

10.1 协同过滤

🚩协同过滤是一种从大量用户给出的兴趣爱好集合中预测用户的偏好和兴趣的技术。 它的基本假设是,对某个事物,人们过去喜欢那么将来也会喜欢。 协作过滤可以用于推荐系统,该推荐系统自动向用户建议他/她的首选产品。


推荐系统的任务就是联系用户和信息,一方面帮助用户发现对自己有价值的信息,而另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息生产者的双赢。


10.2 干饭人

🚩下面是用户午餐点外卖倾向评分,分值1~5,分值越大表示倾向越大。0表示数据缺失,需要你使用SVD分解,将缺失值,进行补全,预测。数据如下:

外卖意向 寿司 牛肉拉面 麻辣烫 黄焖鸡米饭 排骨饭
张三 2 1 3 2 5
李四 3 5 2 4 3
王五 1 3 1 1 4
赵六 0 2 4 5 2
Michael 4 4 5 0 5
Sara 5 5 2 3 1
John 1 1 4 2 2
Daniel 2 4 3 5 4
Po 1 3 3 2 1
辰chen 5 0 1 3 5

奇异值分解算法可以用于矩阵近似问题。如果分解时,中间的矩阵取部分特征值(只取前面若干个最大的特征值),这样就可以对原矩阵进行近似了。基于这种思想,奇异值分解可以用于预测用户对外卖点餐的倾向评分。

10.3 SVD进行协同过滤

import numpy as np
food = np.mat([[2, 1, 3, 2, 5], 
               [3, 5, 2, 4, 3], 
               [1, 3, 1, 1, 4], 
               [0, 2, 4, 5, 2],
               [4, 4, 5, 0, 5],
               [5, 5, 2, 3, 1],
               [1, 1, 4, 2, 2],
               [2, 4, 3, 5, 4],
               [1, 3, 3, 2, 1],
               [5, 0, 1, 3, 5]]) 
u, sigma, v = np.linalg.svd(food)
# 选取前2大特征值,做近似表达
food_result = np.mat(u[:, :2]) * np.mat(np.diag(sigma[:2])) * np.mat(v[:2, :])
food_result.round(1)

13.png

根据SVD分解,对缺失值数据,进行了预测,结果如下:

外卖意向 寿司 牛肉拉面 麻辣烫 黄焖鸡米饭 排骨饭
张三 2 1 3 2 5
李四 3 5 2 4 3
王五 1 3 1 1 4
赵六 1.2 2 4 5 2
Michael 4 4 5 2.3 5
Sara 5 5 2 3 1
John 1 1 4 2 2
Daniel 2 4 3 5 4
Po 1 3 3 2 1
辰chen 5 1.4 1 3 5


目录
相关文章
|
数据采集 SQL 分布式计算
常用的数据集成ETL工具有哪些?
六种常用的数据集成ETL工具
常用的数据集成ETL工具有哪些?
|
存储 数据安全/隐私保护
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
现在很多网站都需要注册账号和密码,由于数量众多,每个网站的账号不通用,所有我们经常会用浏览器记录密码功能记住密码,但时间一长就会忘记密码,想换个浏览器登陆或其他原因无法直接查看到密码,下面有2种查看密码的方法仅供参考。
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
|
12月前
|
监控 虚拟化 云计算
从物理到云:使用自动化工具简化服务器迁移流程
【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
365 6
|
7月前
|
XML JSON Linux
Reqable:跨平台HTTP开发与调试工具
Reqable是一款功能强大且易于使用的跨平台HTTP开发与调试工具,具有多平台支持、全面的HTTP请求构建与解析、请求历史记录和环境管理等功能。它简化了HTTP请求的构建、发送和响应分析过程,为开发者提供了极大的便利。通过Reqable,开发者可以更高效地进行HTTP开发和调试,提高工作效率和代码质量。
536 26
|
机器学习/深度学习 人工智能 自然语言处理
Hugging Face 论文平台 Daily Papers 功能全解析
【9月更文挑战第23天】Hugging Face 是一个专注于自然语言处理领域的开源机器学习平台。其推出的 Daily Papers 页面旨在帮助开发者和研究人员跟踪 AI 领域的最新进展,展示经精心挑选的高质量研究论文,并提供个性化推荐、互动交流、搜索、分类浏览及邮件提醒等功能,促进学术合作与知识共享。
368 0
|
10月前
|
数据可视化 数据挖掘 DataX
Python 数据可视化的完整指南
Python 数据可视化在数据分析和科学研究中至关重要,它能帮助我们理解数据、发现规律并以直观方式呈现复杂信息。Python 提供了丰富的可视化库,如 Matplotlib、Seaborn、Plotly 和 Pandas 的绘图功能,使得图表生成简单高效。本文通过具体代码示例和案例,介绍了折线图、柱状图、饼图、散点图、箱形图、热力图和小提琴图等常用图表类型,并讲解了自定义样式和高级技巧,帮助读者更好地掌握 Python 数据可视化工具的应用。
567 3
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1478 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
网络协议 文件存储 Docker
如何搭建HomeAssistant智能家居管理平台并实现公网访问内网管理界面
如何搭建HomeAssistant智能家居管理平台并实现公网访问内网管理界面
|
并行计算 算法 量子技术
量子计算与材料科学:加速新材料研发进程
【9月更文挑战第24天】量子计算与材料科学的深度融合,正在开启一个全新的科研时代。通过利用量子计算技术的优势,我们可以更加高效地模拟和预测材料的性能,加速新材料的研发进程。这不仅有助于推动材料科学的进步,还将为工业、能源、环保等领域带来革命性的变革。让我们共同期待量子计算技术在材料科学领域的辉煌未来!
|
Ubuntu 网络协议 Linux
ubuntu linux 系统搭建我的世界基岩版 私服我的世界服务器
ubuntu linux 系统搭建我的世界基岩版 私服我的世界服务器
380 0