KMeans聚类之降维----矢量化应用

目录

KMeans聚类概述

模型评估指标

有标签评估指标

无标签评估指标

案例:矢量化应用

KMeans聚类概述

KMeans是聚类算法的典型代表,也是最简单的聚类算法;在KMeans算法中,簇的个数K是一个超参数,需要我们人为输入来确定。KMeans的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。

KMeans算法的时间复杂度:KMeans算法的平均复杂度是O(k*n*T),其中k是我们的超参数,所需要输入的簇数,n是整个数据集中的样本量, T是所需要的迭代次数(相对的,KNN的平均复杂度是O(n))。

模型评估指标

聚类模型的结果不是某种标签输出,且聚类的结果是不确定的,其模型效果需要由业务需求或者算法需求来评定;

有标签评估指标

虽然聚类中不输入真实标签,但是所拥有的数据有可能有真实标签,这种情况出现的概率很小,模型评估指标用一下方法:

信息互分:取值范围在(0,1)之中 越接近1,聚类效果越好;在随机均匀聚类下产生0分;

#普通互信息分
metrics.adjusted_mutual_info_score (y_pred, y_true)
#调整的互信息分
metrics.mutual_info_score (y_pred, y_true)
#标准化互信息分
metrics.normalized_mutual_info_score (y_pred, y_true)

基于条件上分析的一系列直观度量V-measure:取值范围在(0,1)之中,越接近1,聚类效果越好 由于分为同质性和完整性两种度量,可以更仔细地研究,模型到底哪个任务 做得不够好
对样本分布没有假设,在任何分布上都可以有不错的表现;在随机均匀聚类下不会产生0分;

#同质性:是否每个簇仅包含单个类的样本
metrics.homogeneity_score(y_true, y_pred)

#完整性:是否给定类的所有样本都被分配给同一个簇中
metrics.completeness_score(y_true, y_pred) 

#同质性和完整性的调和平均,叫做V-measure 
metrics.v_measure_score(labels_true, labels_pred) 

#三者可以被一次性计算出来: 
metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)

调整兰德系数:取值在(-1,1)之间,负值象征着簇内的点差异巨大,甚至相互独立,正类的 兰德系数比较优秀,越接近1越好 对样本分布没有假设,在任何分布上都可以有不错的表现,尤其是在具 有"折叠"形状的数据上表现优秀;在随机均匀聚类下产生0分;

#调整兰德系数
metrics.adjusted_rand_score(y_true, y_pred)

无标签评估指标

在99%的情况下,没有真实标签的数据。这样的聚 类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。其中 轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,它能够同时衡量:

1)样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离 

2)样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离 根据聚类的要求”簇内差异小,簇外差异大“,我们希望b永远大于a,并且大得越多越好。 单个样本的轮廓系数计算为:

廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样 本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相 似度一致,两个簇本应该是一个簇。可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差。 

案例:矢量化应用

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

用K-Means聚类中获得的质心来替代原有的数据,可以把数据上的信息量压缩到非常小,但又不损失太多信息。我 们接下来就通过一张图图片的矢量量化来看一看K-Means如何实现压缩数据大小,却不损失太多信息量。

1. 导入需要的库

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

2. 导入数据,探索数据

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

import pandas as pd
pd.DataFrame(newimage).drop_duplicates().shape
plt.figure(figsize=(15,15))
plt.imshow(china)

图像现在有9W多种颜色。使用K-Means将颜色压缩到64 种,还不严重损耗图像的质量。为此,我们要使用K-Means来将9W种颜色聚类成64类,然后使用64个簇的质心来 替代全部的9W种颜色,记得质心有着这样的性质:簇中的点都是离质心最近的样本点。

为了比较,我们还要画出随机压缩到64种颜色的矢量量化图像。我们需要随机选取64个样本点作为随机质心,计 算原数据中每个样本到它们的距离来找出离每个样本最近的随机质心,然后用每个样本所对应的随机质心来替换原 本的样本。两种状况下,我们观察图像可视化之后的状况,以查看图片信息的损失。

在这之前,我们需要把数据处理成sklearn中的K-Means类能够接受的数据

china = np.array(china, dtype=np.float64) / china.max()
w, h, d = original_shape = tuple(china.shape)
image_array = np.reshape(china, (w * h, d))
image_array

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

n_clusters = 64
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]]
image_kmeans
pd.DataFrame(image_kmeans).drop_duplicates().shape
image_kmeans = image_kmeans.reshape(w,h,d)
image_kmeans.shape

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

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

猜你喜欢

转载自blog.csdn.net/qq_31807039/article/details/130542919
今日推荐