cluster-analysis - k-means 聚类中是否存在重叠?
问题描述
我不清楚为什么 k-means 聚类可以在聚类中有重叠。从 Chen (2018) 我看到了以下定义:
“..让观察成为一个样本集,被划分为 K 个不相交的集群”
但是,我在我的情节中看到了重叠,并且不确定为什么会这样。
作为参考,我正在尝试使用三个变量(新近度、频率、收入)对多维数据集进行聚类。为了可视化聚类,我可以使用 PCA 将 3D 数据投影到 2D 并在其上运行 k-means。下面是我得到的代码和情节:
df1=tx_user[["Recency","Frequency","Revenue"]]
#standardize
names = df1.columns
# Create the Scaler object
scaler = preprocessing.StandardScaler()
# Fit your data on the scaler object
scaled_df1 = scaler.fit_transform(df1)
df1 = pd.DataFrame(scaled_df1, columns=names)
df1.head()
del scaled_df1
sklearn_pca = PCA(n_components = 2)
X1 = sklearn_pca.fit_transform(df1)
X1 = X1[:, ::-1] # flip axes for better plotting
kmeans = KMeans(3, random_state=0)
labels = kmeans.fit(X1).predict(X1)
plt.scatter(X1[:, 0], X1[:, 1], c=labels, s=40, cmap='viridis');
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
def plot_kmeans(kmeans, X, n_clusters=4, rseed=0, ax=None):
labels = kmeans.fit_predict(X)
# plot the input data
ax = ax or plt.gca()
ax.axis('equal')
#ax.set_ylim(-5000,7000)
ax.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2)
# plot the representation of the KMeans model
centers = kmeans.cluster_centers_
radii = [cdist(X[labels == i], [center]).max()
for i, center in enumerate(centers)]
for c, r in zip(centers, radii):
ax.add_patch(plt.Circle(c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1))
kmeans = KMeans(n_clusters=4, random_state=0)
plot_kmeans(kmeans, X1)
我的问题是: 1. 为什么会有重叠?如果有,我的聚类是否错误?2. 如果存在重叠,k-means 如何决定集群分配?
谢谢
参考文献:Chen, L.、Xu, Z.、Wang, H. 和 Liu, S. (2018)。基于K-means和PROMETHEE方法的有序聚类算法。国际机器学习和控制论杂志,9(6),917-926。
解决方案
K-means 通过平均近似计算 k 个集群。每个集群由它们的计算中心定义,因此根据定义是唯一的。
样本分配到距离聚类中心最近的聚类,根据定义也是唯一的。因此,从这个意义上说,没有 OVERLAP。
然而,对于给定的距离d>0
,样本可能在距离d
多个聚类中心的距离内(这是可能的)。这就是您说重叠时看到的内容。然而,样本仍然被分配到最近的集群而不是所有集群。所以没有重叠。
注意:在样本与多个集群中心的最近距离完全相同的情况下,可以在最近的集群之间进行任何随机分配,这不会改变算法或结果中的任何重要内容,因为集群是在分配后重新计算的。
推荐阅读
- javascript - Clearing files from clipboardData - window:paste
- android - 如何显示数据,显示加载屏幕,或报告基于错误的状态
在 Android Studio Compose 官方示例项目中? - autodesk-forge - 无法使用 forge api/app 从 Autodesk Construction Cloud 获取表单数据
- go - 如何使用通道实现功能
- jestjs - 测试开始运行后无法添加挂钩。钩子必须同步定义
- activemq - ActiveMQ 5.15.9 - 当 producerFlowControl 为 false 且未设置 Systemusage 时将存储限制为 100 GB
- git - 如何将存储库克隆到本地机器上?
- python - 为什么 Dask 在读取时显示 FileNotFound 错误?
- c# - 依赖注入模式如何在开始时初始化静态类的变量
- wal - TDengine的WAL机制对性能的影响