聚类算法用于降维

K-Means聚类最重要的应用之一是非结构数据上的矢量量化。非结构化数据往往占用比较多的储存空间,文件本身也会比较大,运算非常缓慢,我们希望能够在保证数据质量的前提下,尽量地缩小非结构化数据的大小,或者简化非结构化数据的结构。矢量量化就可以帮助我们实现这个目的。 KMeans聚类的矢量量化本质是一种降维运用,但它与我们之前学过的任何一种降维算法的思路都不相同。特征选择的降维是直接选取对模型贡献最大的特征,PCA的降维是聚合信息,而矢量量化的降维是在同等样本量上压缩信息的大小,即不改变特征的数目也不改变样本的数目,只改变在这些特征下的样本上的信息量。

矢量量化( Vector Quantization) 是 20 世纪70 年代后期新发展起来的一种有效的有损压缩技术,其理论基础是香农的速率失真理论。矢量量化的基本原理是用码书中与输入矢量最匹配的码字的索引代替输入矢量进行传输与存储,而解码时仅需要简单地查表操作。其突出优点是压缩比大、解码简单且能够很好地保留信号的细节。矢量量化在图像压缩领域中的应用非常广阔,如卫星遥感照片的压缩与实时传输、数字电视与DVD 的视频压缩、医学图像的压缩与存储以及图像识别等。因此矢量量化已经 成为图像压缩编码的重要技术之一。

import numpy as np

import pandas as pd

import cv2 as cv

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")

newimage = china.reshape((427*640, 3))

pd.DataFrame(newimage).drop_duplicates().shape

我们了解到图像有9W多种颜色。我们希望使用K-Means将颜色压缩到64种,并且不严重损耗图像的质量。为此,我们要使用K-Means来将9W种颜色聚类成64类,然后使用64个簇的质心来替代全部的9W种颜色。为了比较,我们还要画出随机压缩到64种颜色的矢量量化图像。 在这之前,我们需要把数据处理成sklearn中的K-Means类能够接受的数据。

n_clusters = 64

china = 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))

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

image_array_sample = shuffle(image_array, random_state=0)[:1000]

kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(image_array_sample)

labels = kmeans.predict(image_array)

#用质心替换像素点

image_kmeans = image_array.copy()

for i in range(w*h):

image_kmeans[i] = kmeans.cluster_centers_[labels[i]]

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

image_kmeans = image_kmeans.reshape(w,h,d) #恢复图片

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

centroid_random = shuffle(image_array, random_state=0)[:n_clusters]

labels_random = pairwise_distances_argmin(centroid_random, image_array, axis=0)

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)

下面展示图片,分别是原图、KMeans量化、随机量化

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()

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: