KMeans应用

K-Means聚类最重要的应用之一是非结构数据(图像,声音)上的矢量量化(VQ)。非结构化数据往往占用比较多的储存空间,文件本身也会比较大,运算非常缓慢,我们希望能够在保证数据质量的前提下,尽量地缩小非结构化数据的大小,或者简化非结构化数据的结构。矢量量化就可以帮助我们实现这个目的。KMeans聚类的矢量量化本质是一种降维运用,但它与我们之前学过的任何一种降维算法的思路都不相同。特征选择的降维是直接选取对模型贡献最大的特征PCA的降维是聚合信息,而矢量量化的降维是在同等样本量上压缩信息的大小,即不改变特征的数目也不改变样本的数目,只改变在这些特征下的样本上的信息量
可以使用每个样本所在的簇的质心来覆盖原有的样本,有点类似四舍五入的感觉,类似于用1来代替0.9和0.8,40个样本带有的40种取值,就被我们压缩了4组取值,虽然样本量还是40个,但是这40个样本所带的取值其实只有4个,就是分出来的四个簇的质心。

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
#实例化,导入图片
china=load_sample_image('china.jpg')
china
#查看数据类型
china.dtype
china.shape
#长度*宽度*像素  三个数决定一个颜色
china[0][0]
#包含多少颜色
newimage=china.reshape((427*640,3))
newimage.shape
import pandas as pd
pd.DataFrame(newimage).drop_duplicates().shape
#去重,查看独一无二的颜色种类
#图像可视化
plt.figure(figsize=(15,15))
#导入三维数组形成的图片
plt.imshow(china)
#设定64个质心
n_clusters = 64
#ply.imshow在浮点数上表现优异,把china中的数据转换为浮点数,压缩到【0,1】之间
china = np.array(china, dtype=np.float64) / china.max()
#把china从图像格式转化为矩阵格式
w, h, d = original_shape = tuple(china.shape)
w
d
assert d == 3
#assert相当于raise error if not,表示为不为TRUE就报错
image_array = np.reshape(china, (w * h, d))
#mp.reshape改变结构,参数(a,newshape,order='C'),第一个参数是要改变结构的对象,第二个参数是要改变的新结构
image_array
#对数据进行KMeans矢量量化
#先用1000个数据找出质心
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(image_array_sample)
kmeans.cluster_centers_
#生成64个质心
kmeans.cluster_centers_.shape
#找出质心后按照已存在的质心对所有数据进行聚类
labels = kmeans.predict(image_array)
labels.shape
set(labels) #27w样本点对应的簇质心的索引
#使用质心替换掉所有的样本
image_kmeans = image_array.copy()
image_kmeans
#27w个样本点,9w多种不同的颜色(像素点)
#27w样本点与簇质心的索引一一对应,将27w样本点与所对应的质心匹配
for i in range(w*h):
    image_kmeans[i] = kmeans.cluster_centers_[labels[i]]
image_kmeans.shape
pd.DataFrame(image_kmeans).drop_duplicates().shape
#只剩下64种独一无二的颜色
#恢复图片结构
image_kmeans = image_kmeans.reshape(w,h,d)
image_kmeans.shape
#对数据进行随机矢量量化
centroid_random = shuffle(image_array, random_state=0)[:n_clusters]
labels_random = pairwise_distances_argmin(centroid_random,image_array,axis=0)
#函数pairwise_distances_argmin(x1,x2,axis),x1和x2分别是序列,
#用来计算x2中每个样本到x1中每个样本点的距离,并返回和x2相同形状的x1中对应的最近样本的距离
labels_random
#用随机质心替换所有样本
image_random = image_array.copy()
for i in range(w*h):
    image_random[i] = centroid_random[labels_random[i]]
#恢复图片结构
image_random = image_random.reshape(w,h,d)
image_random.shape
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Original image (96,615 colors)')
plt.imshow(china)

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(image_kmeans)

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Quantized image (64 colors, Random)')
plt.imshow(image_random)

plt.show()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值