确定最佳聚类数matlab代码_主成分分析和k均值聚类可视化高维数据集

关键点:

  • National Health and Nutrition Exam Survey (综合饮食,医学和检查机器学习数据集,2013年至2014年)中有一些聚类,这些聚类只能通过降维来显示。
  • PCA与k-means结合使用是一种可视化高维数据的强大方法。

本文主要时将主成分分析(PCA)付诸实践,首先下载机器学习数据集:National Health and Nutrition Examination Survey(https://www.kaggle.com/cdc/national-health-and-nutrition-examination-survey)。这个机器学习数据集包含近200个特征(列),我们无法通过传统的可视化方法对所有这些特征进行全面概述。这就是PCA的意义所在。你需要将很多特征投射到较低维度的空间,即将它们简化为几个重要的主要特征,并将它们可视化。也可以在机器学习管道中使用这些简化的成分。

为了更好地理解这一点,让我们看看这是如何使用机器学习数据集在三个步骤中完成的。

第1步:降维

在这一步中,我们将找到捕获数据中最大方差的最优成分数量。Python代码如下:

# Importsimport pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScaler%config InlineBackend.figure_format='retina'# Load in the datadf = pd.read_csv('2013_2014_cleaned.csv')# Standardize the data to have a mean of ~0 and a variance of 1X_std = StandardScaler().fit_transform(df)# Create a PCA instance: pcapca = PCA(n_components=20)principalComponents = pca.fit_transform(X_std)# Plot the explained variancesfeatures = range(pca.n_components_)plt.bar(features, pca.explained_variance_, color='black')plt.xlabel('PCA features')plt.ylabel('variance %')plt.xticks(features)# Save components to a DataFramePCA_components = pd.DataFrame(principalComponents)
9c8e204d9696451c4a8a7bc14a087168.png
3b6be635a3b37d6b4be83b96c6faac66.png

图1

从图1可以看出,前三个成分解释了我们数据中大部分的方差。对于这个可视化用例,我们将快速绘制前两个。我们这样做是为了注意是否有清晰的聚类。Python实现如下:

plt.scatter(PCA_components[0], PCA_components[1], alpha=.1, color='black')plt.xlabel('PCA 1')plt.ylabel('PCA 2')
ca8d448fc78915a60bbc4284e15ff35b.png
4712205d8484f012870d98e0f0c05f5b.png

图2. PCA模型前两个成分的散点图

图2显示了至少两个明显可区分的聚类。这个factoid告诉我们数据集中的观察结果可以分组。因为数据中的每个观察都是针对一个人的饮食,实验和体检,我们可以说这些聚类代表不同的人群。重要的是要注意我们没有用于标记这些组的目标变量,因此我们不确切知道这些标签是什么。在理想情况下,这种类型的分析可以让我们看到按健康状况隔离的样本人群。然而,图2并没有显示所有有意义的主成分。为了以更大的粒度可视化还原数据集的其余部分,我们将使用k均值聚类。

第2步:找到聚类

在此步骤中,我们将使用k-means聚类来查看前三个PCA成分。为此,我们首先将这些主要成分拟合到k-means算法并确定最佳聚类数。确定k-means模型的理想聚类数可以通过测量到最近的聚类中心(即inertia)的平方距离之和来完成。与图2中主成分分析的scree图非常相似,下面的k-means scree图表示的是解释的方差百分比,但是用不同的术语来表示,聚类数量的函数。

ks = range(1, 10)inertias = []for k in ks: # Create a KMeans instance with k clusters: model model = KMeans(n_clusters=k)  # Fit model to samples model.fit(PCA_components.iloc[:,:3])  # Append the inertia to the list of inertias inertias.append(model.inertia_) plt.plot(ks, inertias, '-o', color='black')plt.xlabel('number of clusters, k')plt.ylabel('inertia')plt.xticks(ks)plt.show()
20bda47a75c48067dcd873cd76090abd.png
646586a23fa116c96a7aeddf7edbe067.png

图3.显示k = 4后inertia缓慢下降的Scree图

图3显示,在(elbow)4个聚类之后,inertia值的变化不再显着,并且最可能的是,在elbow point之后其余数据的方差也不再显着。因此,我们可以在k = 4之后丢弃所有内容并继续进行该过程的最后一步。

第3步:可视化和解释聚类

人们可以根据体检结果、全血计数和饮食记录等特征进行分组吗?将所有这些特征降维,然后使用k-means提示可视化这些主成分中的聚类,这意味着我的问题的答案很可能是肯定的。

78b4e4e6e34ffb24bc2ca46f58696956.png

图4. k-means聚类PCA成分的交互式3-D可视化

图4是用Plotly制作的(https://plot.ly/create/?fid=dimakav:22#/),并在数据中显示了一些明确定义的聚类。我没有标记数据集,所以我们不知道标签是什么。但这并不意味着我们不能回过头来标记这些聚类。现在我们知道了数据中有多少个聚类,我们就能更好地了解可以为总体标记多少个组。举个例子,我们可以提出一个模型,将这个人群的幸福感分为四个等级。在每个示例的唯一id上将这些标签重新引入到简化的数据集中,这将允许我们通过聚类对它们进行可视化。

能够发现其他不可见的模式并通过一个模型来将这些模式泛化到观察,这正是PCA和k-means方法在任何数据科学家工具箱中存在的至关重要的原因。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值