聚类算法用于降维

本文介绍了K-Means聚类算法如何用于图像压缩,通过将大量颜色聚类为少数代表色来降低非结构化数据的大小,同时保持图像质量。在示例中,将一张图片的颜色从约9万种压缩到64种,对比了K-Means和随机量化的效果,展示了K-Means在图像压缩领域的优势。
摘要由CSDN通过智能技术生成

聚类算法用于降维

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值