热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python机器学习之聚类算法KMeans——案例:聚类算法用于降维,KMeans的矢量量化应用

聚类算法用于降维,KMeans的矢量量化应用重要属性:重要接口:案例矢量量化的降维是在同等样本量上压缩信息的大小,即
聚类算法用于降维,KMeans的矢量量化应用

重要属性:
在这里插入图片描述

重要接口:
在这里插入图片描述

案例

矢量量化的降维是在同等样本量上压缩信息的大小,即不改变特征的数目也不改变样本的数目,只改变在这些特征下的样本上的信息量。

用K-Means聚类中获得的质心来替代原有的数据,可以把数据上的信息量压缩到非常小,但又不损失太多信息。我们接下来就通过一张图图片的矢量量化来看一看K-Means如何实现压缩数据大小,却不损失太多信息量。

1、导入需要的库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin#对两个序列中的点进行距离匹配的函数
from sklearn.datasets import load_sample_image#导入图片数据所用的类
from sklearn.utils import shuffle #洗牌

2、导入数据,探索数据

导入数据:

# 实例化,导入颐和园的图片
china = load_sample_image("china.jpg")
china

在这里插入图片描述
查看数据:

#查看数据类型
china.dtypechina.shape
#长度 x 宽度 x 像素 > 三个数决定的颜色china[0][0]#包含多少种不同的颜色?
newimage = china.reshape((427 * 640,3))
newimage.shape

在这里插入图片描述
数据去重:

import pandas as pd
pd.DataFrame(newimage).drop_duplicates().shape#我们现在有9W多种颜色

图像可视化:

# 图像可视化
plt.figure(figsize=(15,15))
plt.imshow(china) #导入3维数组形成的图片

在这里插入图片描述
导入另一张图片:

#查看模块中的另一张图片
flower = load_sample_image("flower.jpg")
plt.figure(figsize=(15,15))
plt.imshow(flower)

在这里插入图片描述
图像探索完毕,我们了解了,图像现在有9W多种颜色。我们希望来试试看,能否使用K-Means将颜色压缩到64种,还不严重损耗图像的质量。为此,我们要使用K-Means来将9W种颜色聚类成64类,然后使用64个簇的质心来替代全部的9W种颜色,记得质心有着这样的性质:簇中的点都是离质心最近的样本点。

为了比较,我们还要画出随机压缩到64种颜色的矢量量化图像。我们需要随机选取64个样本点作为随机质心,计算原数据中每个样本到它们的距离来找出离每个样本最近的随机质心,然后用每个样本所对应的随机质心来替换原本的样本。两种状况下,我们观察图像可视化之后的状况,以查看图片信息的损失。

3、决定超参数,数据预处理

将数据维度数量保存,并将数据降维:

n_clusters = 64china = np.array(china, dtype=np.float64) / china.max()
w, h, d = original_shape = tuple(china.shape)
assert d == 3
image_array = np.reshape(china, (w * h, d))

#plt.imshow在浮点数上表现非常优异,在这里我们把china中的数据,转换为浮点数,压缩到[0,1]之间
china = np.array(china, dtype=np.float64) / china.max()
(china < 0).sum()

在这里插入图片描述
解释上述中的命令含义&#xff1a;

#把china从图像格式&#xff0c;转换成矩阵格式
w, h, d &#61; original_shape &#61; tuple(china.shape)

在这里插入图片描述

assert d &#61;&#61; 3#assert相当于 raise error if not&#xff0c;表示为&#xff0c;“不为True就报错”
#要求d必须等于3&#xff0c;如果不等于&#xff0c;就报错image_array &#61; np.reshape(china, (w * h, d)) #reshape是改变结构
image_array

在这里插入图片描述
reshape&#xff1a;

#np.reshape(a, newshape, order&#61;&#39;C&#39;), reshape函数的第一个参数a是要改变结构的对象&#xff0c;第二个参数是要改变的新结构
#展示np.reshape的效果a &#61; np.random.random((2,4))
a.shape
a.reshape((4,2)) &#61;&#61; np.reshape(a,(4,2))
np.reshape(a,(8,1))

在这里插入图片描述

4、对数据进行K-Means的矢量量化

找出质心&#xff1a;

#首先&#xff0c;先使用1000个数据来找出质心
image_array_sample &#61; shuffle(image_array, random_state&#61;0)[:1000]
kmeans &#61; KMeans(n_clusters&#61;n_clusters, random_state&#61;0).fit(image_array_sample)kmeans.cluster_centers_.shape

在这里插入图片描述
对数据进行聚类&#xff1a;

#找出质心之后&#xff0c;按照已存在的质心对所有数据进行聚类
labels &#61; kmeans.predict(image_array)
labels.shape
set(labels)

在这里插入图片描述
用质心替换样本&#xff1a;

#使用质心来替换所有的样本
image_kmeans &#61; image_array.copy()image_kmeans #27W个样本点&#xff0c;9W多种不同的颜色&#xff08;像素点&#xff09;labels #这27W个样本点所对应的簇的质心的索引kmeans.cluster_centers_[labels[0]]for i in range(w*h):image_kmeans[i] &#61; kmeans.cluster_centers_[labels[i]]
#查看生成的新图片信息
image_kmeans.shapepd.DataFrame(image_kmeans).drop_duplicates().shape

在这里插入图片描述
恢复图片结构&#xff1a;

#恢复图片的结构
image_kmeans &#61; image_kmeans.reshape(w,h,d)
image_kmeans.shape

在这里插入图片描述

5、对数据进行随机的矢量量化

centroid_random &#61; shuffle(image_array, random_state&#61;0)[:n_clusters]
centroid_random.shapelabels_random &#61; pairwise_distances_argmin(centroid_random,image_array,axis&#61;0)#函数pairwise_distances_argmin(x1,x2,axis) #x1和x2分别是序列
#用来计算x2中的每个样本到x1中的每个样本点的距离&#xff0c;并返回和x2相同形状的&#xff0c;x1中对应的最近的样本点的索引
labels_random.shape

在这里插入图片描述
使用随机数质心替换样本&#xff1a;

#使用随机质心来替换所有样本
image_random &#61; image_array.copy()for i in range(w*h):image_random[i] &#61; centroid_random[labels_random[i]]

恢复结构&#xff1a;

#恢复图片的结构
image_random &#61; image_random.reshape(w,h,d)
image_random.shape

在这里插入图片描述

6、将原图&#xff0c;按KMeans矢量量化和随机矢量量化的图像绘制出来

plt.figure(figsize&#61;(10,10))#画布大小
plt.axis(&#39;off&#39;)#不要坐标
plt.title(&#39;Original image (96,615 colors)&#39;)#标题
plt.imshow(china)#显示图片plt.figure(figsize&#61;(10,10))
plt.axis(&#39;off&#39;)
plt.title(&#39;Quantized image (64 colors, K-Means)&#39;)
plt.imshow(image_kmeans)plt.figure(figsize&#61;(10,10))
plt.axis(&#39;off&#39;)
plt.title(&#39;Quantized image (64 colors, Random)&#39;)
plt.imshow(image_random)
plt.show()

在这里插入图片描述
可以发现&#xff0c;用聚类的时候是楼有颜色&#xff0c;天空比较像素低&#xff0c;用随机质心的时候楼颜色比较暗淡&#xff0c;整体来看&#xff0c;还是看着聚类的时候区别不是很大。

单独对比&#xff1a;

原图与聚类&#xff1a;
在这里插入图片描述
原图与随机&#xff1a;
在这里插入图片描述
聚类和随机&#xff1a;
在这里插入图片描述
区别还是蛮大的。


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
author-avatar
莎ss侄莎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有