4.4 聚类分析评估

聚类评估可以用来估计在数据集上进行聚类的可行性和被聚类方法产生结果的质量,聚类评估的工作主要是:

  1. 估计聚类趋势,只有在数据中存在非随机结构,聚类结果才会有意义。所以要分析是否具有聚类趋势
  2. 确定数据集的簇
  3. 测定聚类质量,最常用的方法是轮廓函数。在度量聚类中簇的你和邢,可以计算所有对象轮廓系数的平均值,轮廓系数越接近于1,聚类效果越好

聚类

当你在山上徒步旅行时,你偶然发现了一种你从未见过的植物。你环顾四周,发现了更多。它们不完全相同,但它们非常相似,你可以知道它们很可能属于同一个物种(或至少属于同一个属)。你可能需要一个植物学家来告诉你那是什么物种,但你肯定不需要专家来识别相似的物体群。这称为集群:它是识别相似实例并将其分配给集群或相似实例组的任务。就像在分类中一样,每个实例都被分配给一个组。然而,与分类不同,聚类是一项无监督的任务。考虑图9-1:左边是iris数据集(在第4章中介绍),其中每个实例的物种(即它的类)用不同的标记表示。它是一个带标签的数据集,分类算法如Logistic回归、支持向量机或随机森林分类器非常适合。右侧是相同的数据集,但没有标签,因此您不能再使用分类算法。这是312个聚类算法介入的地方:其中许多算法可以很容易地检测到最底层的集群。用我们自己的眼睛也很容易看到,但是右上角的簇是由两个不同的子簇组成的就不那么明显了。也就是说,数据集有两个额外的特征(萼片的长度和宽度),这里没有表示,而且聚类算法可以很好地利用所有的特征,所以事实上它们可以很好地识别这三个聚类(例如,使用高斯混合模型,150个实例中只有5个被分配到错误的簇)。
4.4 聚类分析评估_第1张图片

# 加载包
import numpy as np
import os
# 使此笔记本的输出在运行期间保持稳定
np.random.seed(42)
## 显示的图片格式(mac中的高清格式),还可以设置为"bmp"等格式
%config InlineBackend.figure_format = "retina"
## 输出图显示中文
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = "D:\Desktop\python在机器学习中的应用\方正粗黑宋简体.ttf",size=14)
import matplotlib as mpl
import matplotlib.pyplot as plt
## 忽略提醒
import warnings
warnings.filterwarnings("ignore")
# 聚类
# 简介-分类与聚类
from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target
data.target_names

在这里插入图片描述

**plt.figure(figsize=(9, 3.5))
plt.subplot(121)
plt.plot(X[y==0, 2], X[y==0, 3], "yo", label="Iris setosa")
plt.plot(X[y==1, 2], X[y==1, 3], "bs", label="Iris versicolor")
plt.plot(X[y==2, 2], X[y==2, 3], "g^", label="Iris virginica")
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(fontsize=12)
plt.subplot(122)
plt.scatter(X[:, 2], X[:, 3], c="k", marker=".")
plt.xlabel("Petal length", fontsize=14)
plt.tick_params(labelleft=False)
plt.show()

4.4 聚类分析评估_第2张图片
高斯混合模型(解释如下)实际上可以很好地分离这些簇(使用所有4个特征:花瓣的长度和宽度以及萼片的长度和宽度)。

from sklearn.mixture import GaussianMixture
y_pred = GaussianMixture(n_components=3, random_state=42).fit(X).predict(X)
mapping = np.array([2, 0, 1])
y_pred = np.array([mapping[cluster_id] for cluster_id in y_pred])
plt.plot(X[y_pred==0, 2], X[y_pred==0, 3], "yo", label="Cluster 1")
plt.plot(X[y_pred==1, 2], X[y_pred==1, 3], "bs", label="Cluster 2")
plt.plot(X[y_pred==2, 2], X[y_pred==2, 3], "g^", label="Cluster 3")
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="upper left", fontsize=12)
plt.show()

4.4 聚类分析评估_第3张图片
4.4 聚类分析评估_第4张图片
聚类应用于各种各样的应用程序中,其中包括:对于客户细分,您可以根据客户的购买情况和他们在您的网站上的活动对客户进行聚类。这有助于了解谁是您的客户以及他们需要什么,这样您就可以根据每个细分市场调整您的产品和营销活动。例如,在推荐系统中,客户细分可以帮助推荐同一集群中的其他用户喜欢的内容。对于分析新数据集时的数据分析,运行一个聚类算法,然后分别分析每个簇可能会很有帮助。作为一种维度缩减技术,一旦数据集被集群化,通常可以测量每个实例与每个集群的亲和力(亲和力是衡量一个实例在集群中的适合程度的任何度量)。每个实例的特征向量x可以被313替换为它的簇亲和力向量。如果有k个簇,那么这个向量就是k维的。这个向量通常比原始的特征向量低很多,但是它可以保留足够的信息以供进一步处理。对于异常检测(也称为离群点检测),任何与所有集群具有低亲和力的实例都可能是异常。例如,如果您已根据用户的行为将其聚集在一起,则可以检测到行为异常的用户,例如每秒请求的数量异常。异常检测在检测制造缺陷或欺诈检测中特别有用。对于半监督学习,如果您只有几个标签,您可以执行集群并将标签传播到同一个集群中的所有实例。该技术可以大大增加后续监督学习算法的标签数量,从而提高算法的性能。对于搜索引擎,有些搜索引擎允许您搜索与参考图像相似的图像。要构建这样一个系统,首先要对数据库中的所有图像应用一个聚类算法;相似的图像最终会出现在同一个集群中。然后,当用户提供一个参考图像时,您所需要做的就是使用经过训练的聚类模型来找到该图像的聚类,然后您就可以简单地从该聚类中返回所有图像。通过根据像素的颜色对像素进行聚类,然后用其聚类的平均颜色替换每个像素的颜色,可以大大减少图像中不同颜色的数量。图像分割在许多目标检测和跟踪系统中得到了广泛的应用,因为它可以更容易地检测出每个目标的轮廓。

K-Means

K-Means算法是一种简单的算法,能够非常快速和高效地对这类数据集进行聚类,通常只需几次迭代。1957年,Stuart Lloyd在贝尔实验室提出了一种脉冲编码调制技术,但1982年才在公司外发表。1965年,Edward W.Forgy发布了几乎相同的算法,因此K-均值有时被称为Lloyd-Forgy。
图9-2所示的未标记数据集:可以清楚地看到五个实例。

4.4 聚类分析评估_第5张图片

让我们在这个数据集中训练一个K均值聚类器。它将尝试找到每个blob的中心,并将每个实例分配给最近的blob:

# K-Means
from sklearn.datasets import make_blobs
blob_centers = np.array(
    [[ 0.2,  2.3],
     [-1.5 ,  2.3],
     [-2.8,  1.8],
     [-2.8,  2.8],
     [-2.8,  1.3]])
blob_std = np.array([0.4, 0.3, 0.1, 0.1, 0.1])
X, y = make_blobs(n_samples=2000, centers=blob_centers,
                  cluster_std=blob_std, random_state=7)
def plot_clusters(X, y=None):
    plt.scatter(X[:, 0], X[:, 1], c=y, s=1)
    plt.xlabel("$x_1$", fontsize=14)
    plt.ylabel("$x_2$", fontsize=14, rotation=0)    
plt.figure(figsize=(8, 4))
plot_clusters(X)
plt.show()

4.4 聚类分析评估_第6张图片

注意,必须指定算法必须找到的簇数k。在这个例子中,从数据中可以很明显地看出k应该被设置为5,但一般来说,这并不容易。我们将很快讨论这个问题。每个实例被分配到五个集群中的一个。在聚类的上下文中,实例的标签是算法分配给这个实例的集群的索引:这不要与分类中的类标签混淆(记住,聚类是一个无监督的学习任务)。KMeans实例保留了训练它的实例的标签副本,可通过labels_uinstance变量获得:

# 拟合和预测
from sklearn.cluster import KMeans
k = 5
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)
# 每个实例都被分配到5个集群中的一个
y_pred

4.4 聚类分析评估_第7张图片

from sklearn.metrics import silhouette_score
silhouette_score(X, kmeans.labels_)

在这里插入图片描述
轮廓系数越接近于1,聚类效果越好

你可能感兴趣的:(机器学习)