聚类算法用于降维,KMeans的矢量量化应用(图片压缩)

文章目录

  • 案例实战:聚类算法用于降维,KMeans的矢量量化应用
          • 1、导入相关库
          • 2、读取数据
          • 3、数据处理
          • 4、对数据进行KMeans的矢量量化
          • 5、对数据进行随机矢量量化
          • 6、画图,查看结果


案例实战:聚类算法用于降维,KMeans的矢量量化应用

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、读取数据
flower=load_sample_image('flower.jpg')

plt.imshow(flower)

聚类算法用于降维,KMeans的矢量量化应用(图片压缩)_第1张图片

3、数据处理
w,h,d=flower.shape
flower_array=np.reshape(flower,(w*h,d))
flower_array

聚类算法用于降维,KMeans的矢量量化应用(图片压缩)_第2张图片
图片数据为三维数据,第三维数据为像素信息,将其转化为二维数据,带入模型

4、对数据进行KMeans的矢量量化
image_array_sample=shuffle(flower_array,random_state=0)[:1000]
kms=KMeans(n_clusters=k,random_state=0).fit(image_array_sample)

label=kms.predict(flower_array)

image_kmeans=flower_array.copy()
for i in range(w*h):
    image_kmeans[i]=kms.cluster_centers_[label[i]]

pd.DataFrame(image_kmeans).drop_duplicates().shape

image_kmeans=image_kmeans.reshape(w,h,d)

shuffle:该函数是将图片二维数据随机排序,类似于洗牌,取出前1000个色素信息,训练模型,确定质心,然后利用已知质心再去分类所有的二维图片色素信息,分为k类,然后将这k类中的质心色素代替新的图片色素信息,再将二维数据改为三维,成为图片格式。

5、对数据进行随机矢量量化
random_sample=shuffle(flower_array,random_state=0)[:k]
labels_random=pairwise_distances_argmin(random_sample,flower_array,axis=0)

image_random=flower_array.copy()
for i in range(w*h):
    image_random[i]=random_sample[labels_random[i]]
    
image_random=image_random.reshape(w,h,d)

随机取出k个色素数据
pairwise_distances_argmin(x,y)
返回和y一样的结构,该结构中是从x中找出y每个元素到x欧式距离最小样本的索引,和上面的label类似

6、画图,查看结果
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('original')
plt.imshow(flower)

聚类算法用于降维,KMeans的矢量量化应用(图片压缩)_第3张图片

plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('KMeans')
plt.imshow(image_kmeans)

聚类算法用于降维,KMeans的矢量量化应用(图片压缩)_第4张图片

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

聚类算法用于降维,KMeans的矢量量化应用(图片压缩)_第5张图片
由上图可以看出用KMeans压缩的图片和原图片差不多,因为KMeans是将所有色素信息聚类,不同类的色素信息用该类的中心点代替,所以颜色并没有什么缺失
然而随机取出的色素来代替,颜色会有缺失,因为随机选取色素的过程中丧失了主要的色素信息。

你可能感兴趣的:(机器学习,我的大学时光,聚类,python,机器学习,人工智能,数据挖掘)