使用 KMeans 算法根据数据框列分配唯一的集群

数据挖掘 Python 聚类 熊猫 k-均值 麻木的
2022-03-11 01:18:00

我有以下df

    x1      x2    x3   x4     
   1000   5000    0.8  restaurant1
   2000   7000   0.75  restaurant1
    500   1000    0.5  restaurant2
    700   1400    0.6  restaurant2
   1000   5000    0.8  restaurant2
    100    600    0.9  restaurant3
    200   1200    0.9  restaurant3
     50   1000    0.9  restaurant3

对 2 个集群应用 Kmeans 算法会发生什么y

    x1      x2    x3   x4             Y
   1000   5000    0.8  restaurant1    1
   2000   7000   0.75  restaurant1    1   
    500   1000    0.5  restaurant2    2
    700   1400    0.6  restaurant2    2
   1000   5000    0.8  restaurant2    1
    100    600    0.9  restaurant3    2
    200   1200    0.9  restaurant3    2
     50   1000    0.9  restaurant3    2

可能的期望输出:

     x1      x2    x3   x4             Y
    1000   5000    0.8  restaurant1    1
    2000   7000   0.75  restaurant1    1   
     500   1000    0.5  restaurant2    2
     700   1400    0.6  restaurant2    2
    1000   5000    0.8  restaurant2    2
     100    600    0.9  restaurant3    2
     200   1200    0.9  restaurant3    2
      50   1000    0.9  restaurant3    2 

或者

     x1      x2    x3   x4             Y
    1000   5000    0.8  restaurant1    1
    2000   7000   0.75  restaurant1    1   
     500   1000    0.5  restaurant2    1
     700   1400    0.6  restaurant2    1
    1000   5000    0.8  restaurant2    1
     100    600    0.9  restaurant3    2
     200   1200    0.9  restaurant3    2
      50   1000    0.9  restaurant3    2

我想设置这个边界:一家餐厅必须属于 1 个且仅属于 1 个集群。

我明白为什么会有这个输出,但我怎么能避免和修复它呢?

下面是我在笔记本中使用的代码:

  #Converting float64 to numpy array 
  x1=df['x1'].to_numpy()
  x2=df['x2'].to_numpy()
  x3=(df['x5']/df['x2']).to_numpy()
  x4=df_joint_raw['x4'].cat.codes.to_numpy()

  X=np.stack((x1,x2,x3,x4),axis=1)
  #Getting clusters
  y_pred=KMeans(n_clusters=2, random_state=0).fit_predict(X)
1个回答

非常有趣的问题!我尽力了:

这在一定程度上取决于集群的数量和餐厅的数量,但总的来说我会稍微解释一下。

如果餐厅和集群的数量相同,那么理论上,您的问题只有一个微不足道的答案“每个餐厅都是一个集群”你甚至不需要任何算法。我更深入一点。

大多数 ML 算法解决优化问题以找到答案。有时优化问题会受到一些约束。

示例

  1. 集群餐厅,这样所有类似的餐厅都必须分配到同一个集群。
  2. 集群餐厅,使得同一集群中相同餐厅的密度最大

第一个有我之前给出的微不足道的答案,但第二个可以解决。您运行了几种聚类方法(或者只是 k-means,但有几个初始条件)并接受在相同聚类中相似餐厅数量较多的方法。为此,您需要将“同一集群中相同餐厅的密度”转换为数学公式,并将其用作选择标准。如果您需要帮助,请发表评论,以便我更新答案。

在任何情况下,您都更改了聚类的输出,并且当您推送算法中通常不考虑的标准时,您不会让它“自然地”找到聚类。但别担心!好消息是,至少你有一个集群“好”的标准,这在集群问题中通常不存在。

更新

咱们试试吧χ2先测试。它非常简化,但尝试一下,如果它不起作用,我们可以考虑其他方法。为了知道如何,我以一种简单的方式为你准备了它,这样你就不会对网络上的不同教程感到困惑。

想象一下,您有 4 家餐厅,并且想要 4 个集群。您最终会得到这样一个频率表,其中显示了哪些类型的餐厅属于哪个集群:

在此处输入图像描述

然后在 Python 中,您只需计算χ2统计数据告诉您集群和餐厅是否“相关”。

from scipy.stats import chi2_contingency
obs = np.array([[10,1,2,1], [1,11,0,1], [1,2,8,1], [0,2,2,12]])
chi, p, _,_ = chi2_contingency(obs)
print('The chi-square statistic of {} with p-value of {}'.format(chi,p))

如您所知,P 值告诉您统计数据是否显着。此解决方案中有理论上的考虑,但我不会将您与此混淆。我很抱歉,因为我没有在评论中通过你的建议。只要我有时间看一下,就会相应地回答。

祝你好运!