Part10__机器学习实战学习笔记__SVD

简介: 本文对SVD算法原理进行简要的介绍,然后在iris数据集上面测试算法的效果。

Step By Step

1、奇异值分解算法原理简介
2、Code Sample
3、优缺点


一、算法原理简介
SVD算法本质是:将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性。

图片.png

图片.png

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解,进而得到隐含的用户需求来做推荐。同时也可以用于NLP中的算法,比如潜在语义索引(LSI)。
二、Code Sample
  • 2.1 数据降维测试
from sklearn.datasets import load_iris
from sklearn.decomposition import TruncatedSVD

# 加载数据集
iris = load_iris()
X = iris.data
Y = iris.target

print("------原始数据------")
print(X[:10])

truncatedSVD = TruncatedSVD(3)
result = truncatedSVD.fit_transform(X)

print("------SVD转换后的数据------")
print(result[:10])
back_X = truncatedSVD.inverse_transform(result)

print("------还原后的数据------")
print(back_X[:10])

The Result

------原始数据------
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]]
------SVD转换后的数据------
[[ 5.91274714  2.30203322 -0.00740154]
 [ 5.57248242  1.97182599 -0.24459225]
 [ 5.44697714  2.09520636 -0.01502926]
 [ 5.43645948  1.87038151 -0.02050488]
 [ 5.87564494  2.32829018  0.11033827]
 [ 6.47759822  2.32464996  0.23720249]
 [ 5.5159752   2.07090423  0.22985312]
 [ 5.85092859  2.14807482 -0.01879377]
 [ 5.15891972  1.77506408 -0.06103922]
 [ 5.64500117  1.99000106 -0.22485292]]
------还原后的数据------
[[5.09900942 3.50097959 1.4014844  0.19767844]
 [4.86870364 3.03094925 1.44689807 0.12665275]
 [4.69422107 3.20571484 1.30865982 0.18645629]
 [4.62518119 3.0750981  1.4622656  0.25901553]
 [5.01947963 3.58073643 1.37080948 0.24565314]
 [5.40687172 3.89320449 1.68970262 0.41610481]
 [4.61617117 3.38400818 1.37576725 0.33789933]
 [5.01454656 3.38561478 1.47820176 0.23409183]
 [4.40998651 2.89012425 1.38503506 0.22340474]
 [4.91842577 3.08177859 1.4723887  0.14318329]]
通过对比看,使用转换后的数据可以很好的还原原始数据。
  • 2.2 图片压缩使用示例
import numpy as np
import cv2
from sklearn.decomposition import TruncatedSVD

# jingtian1.jpeg
img = cv2.imread('jingtian1.jpeg')
print('origin image shape is ', img.shape)

def Svd_Compression_Pic(img, k):
    res_image = np.zeros_like(img)
    for i in range(img.shape[2]):
        # 奇异值分解
        truncatedSVD = TruncatedSVD(k)
        result = truncatedSVD.fit_transform(img[:,:,i]) # 转换后的数据
        res_image[:, :, i] = truncatedSVD.inverse_transform(result) # 还原数据
    return res_image

res1 = Svd_Compression_Pic(img, k=400)
res2 = Svd_Compression_Pic(img, k=300)
res3 = Svd_Compression_Pic(img, k=100)
res4 = Svd_Compression_Pic(img, k=20)

row11 = np.hstack((res1, res2))
row22 = np.hstack((res3, res4))
res = np.vstack((row11, row22))

cv2.imshow('img', res)
cv2.waitKey(0)  # 展示等待,点击任意键继续
cv2.imwrite('svd.png', res) # 保存图片
cv2.destroyAllWindows()

The Result

图片.png

可以看到,当我们取到前面400个奇异值来重构图片时,基本与原图看不出来差别,甚至100的都可以比较清晰的恢复原图。
三、优缺点

优点

  • 简化数据,去除噪声,提高算法的结果;

缺点

  • 数据的转换可能难以理解;

适用的数据类型

  • 数值型数据。

更多参考

Python机器学习笔记:奇异值分解(SVD)算法
Opencv-Python :图片读取、保存、显示
奇异值分解(SVD)原理与在降维中的应用

相关文章
|
3月前
|
JSON 算法 数据可视化
5.3 目标检测YOLOv3实战:叶病虫害检测——损失函数、模型训练
这篇文章详细介绍了使用YOLOv3模型进行叶病虫害检测时的损失函数配置、模型训练过程、评估方法以及模型预测步骤,并提供了相应的代码实现和可能的改进方案。
|
5天前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
25 5
|
23天前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
54 2
|
23天前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
44 1
|
1月前
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
49 5
|
1月前
|
机器学习/深度学习 数据采集 分布式计算
【Python篇】深入机器学习核心:XGBoost 从入门到实战
【Python篇】深入机器学习核心:XGBoost 从入门到实战
70 3
|
1月前
|
机器学习/深度学习 算法 数据可视化
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧2
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
35 1
|
17天前
|
数据采集 机器学习/深度学习 TensorFlow
声纹识别实战:从数据采集到模型训练
【10月更文挑战第16天】声纹识别技术通过分析个人的语音特征来验证其身份,具有无接触、便捷的特点。本文将带你从零开始,一步步完成声纹识别系统的构建,包括数据采集、音频预处理、特征提取、模型训练及评估等关键步骤。我们将使用Python语言和相关的科学计算库来进行实践。
60 0
|
2月前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【9月更文挑战第13天】在数据科学与机器学习领域,Scikit-learn是不可或缺的工具。本文通过问答形式,指导初学者从零开始使用Scikit-learn进行模型训练、评估与选择。首先介绍了如何安装库、预处理数据并训练模型;接着展示了如何利用多种评估指标确保模型性能;最后通过GridSearchCV演示了系统化的参数调优方法。通过这些实战技巧,帮助读者逐步成长为熟练的数据科学家。
97 3
|
2月前
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。