我不清楚为什么k均值聚类可以在聚类中重叠。在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.,and Liu,S.(2018年)。基于K均值和PROMETHEE方法的有序聚类算法。国际机器学习与控制论杂志,9(6),917-926。
K-均值通过平均逼近计算k个聚类。每个聚类由其计算的中心定义,因此按定义是唯一的。
样品分配是在距群集中心最近距离的群集上进行的,根据定义,群集也是唯一的。因此,从这个意义上讲,存在NO OVERLAP。
但是对于给定的距离d>0
,一个样本可能在d
距离以内的一个以上聚类中心的距离内(可能)。这就是您说overlap时看到的。但是,样本仍被分配给最接近的聚类,而不是所有样本。因此没有重叠。
NOTE:如果样本到一个以上聚类中心的距离最近完全相同,则可以在最接近的聚类之间进行随机分配,并且这对算法或结果没有什么影响,因为聚类可以重新分配后计算。