K-Means专题02

KMeans的矢量量化应用

KMeans聚类的矢量量化本质是一种降纬运用,但它与我们之前学的降维算法的思路都不相同,特征选择的降纬是直接选取对模型贡献最大的特征,PCA的降纬是聚合信息,而矢量量化的降纬是在同等样本量上压缩信息的大小,即不改变特征的数目也不改变样本的数目,只是改变在这些特征下的样本上的信息量。

1、导入所需要的库
import numpy as np
import pandas as pd
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')  (427, 640, 3)
newimage = china.reshape((427 * 640 , 3)) 
(273280, 3)# 图片中包含27w种的颜色
pd.DataFrame(newimage).drop_duplicates().shape 
(96615, 3)# 图片中27w种颜色不重复的只有9w多
plt.figure(figsize = (15,15))
plt.imshow(china)  #图片导出还是需要三维数据
-------------------------------------------------------------------
3、决定超参数,数据进行预处理
n_clusters = 64
#plt.imshow在浮点数上表现非常优异,在这里我们把china中的数据,转换为浮点数,压缩到[0,1]之间
china = np.array(china , dtype = np.float64)/china.max()
#把china从图像格式,转换成矩阵格式
w ,h,d = original_shape = tuple(china.shape)
#assert相当于 raise error if not,表示为,“不为True就报错”
#要求d必须等于3,如果不等于,就报错
assert d == 3
image_array = np.reshape(china , (w*h , d))
-------------------------------------------------------------------
4、对数据进行K-Means的矢量量化
#特征样本取前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_
#求出对应的聚类标签
labels = kmeans.predict(image_array)
labels.shape
#使用质心来替换所有的样本
image_kmeans = image_array.copy()
for i in range(w*h):
    image_kmeans[i] = kmeans.cluster_centers_[labels[i]]
#由27W个样本点,9W多种不同的颜色(像素点)变为64种不同的颜色
image_kmeans
pd.DataFrame(image_kmeans).drop_duplicates().shape
#恢复为可以导入图片的三维结构
image_kmeans = image_kmeans.reshape(w,h,d)
image_kmeans.shape
-------------------------------------------------------------------
5、对数据进行随机的矢量量化
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.shape
len(set(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
-------------------------------------------------------------------
6、绘图,将原图,K-Means,随机矢量量化后的结果进行比较
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()

在这里插入图片描述在这里插入图片描述在这里插入图片描述

可以发现,K-Means矢量量化的降纬相对于随机降纬还是比较可靠的,能在同等的样本量上对样本信息进行压缩

参考:CDA课堂,直播课后的个人笔记总结,仅供参考,有不一样的想法的大佬们,请辩证地观看,如果有问题可以在评论区指出我再订正。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页