【问题标题】:How to plot the K-means and print the points outside the cluster如何绘制 K-means 并打印集群外的点
【发布时间】:2020-09-23 01:00:51
【问题描述】:

如何绘制以下数据的 K 均值

no,store_id,revenue,profit,state,country
0,101,779183,281257,WD,India
1,101,144829,838451,WD,India
2,101,766465,757565,AL,Japan

我的代码在下面

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df1 = pd.get_dummies(df, columns=['state','country'])
clusters = 2   
km = KMeans(n_clusters=8).fit(df1)
labels = km.predict(df1)
df1['cluster_id'] = km.labels_
def distance_to_centroid(row, centroid):
     row = row[['no','store_id','revenue','profit','state','country']]
     return euclidean(row, centroid)
df1['distance_to_center0'] = df1.apply(lambda r: distance_to_centroid(r,
                             km.cluster_centers_[0]),1)

df1['distance_to_center1'] = df1.apply(lambda r: distance_to_centroid(r,
                             km.cluster_centers_[1]),1)



dummies_df =dummies[['distance_to_center0','distance_to_center1','cluster_id']]
test = {0:"Blue", 1:"Red", 2:"Green",3:"Black",4:"Orange",5:"Yellow",6:"Violet",7:"Grey"}
sns.scatterplot(x="distance_to_center0", y="distance_to_center1", data=dummies_df, hue="cluster_id", palette = test)

下面是找到中心点的代码

km = KMeans(n_clusters=7).fit(dummies)
closest, _ = pairwise_distances_argmin_min(km.cluster_centers_, dummies)
closest
  • 如何为集群绘制散点图

  • 如何让打印点远离集群

至少异常值方法 -1 是异常值(scikit learn)。kmeans.labes_ 仅打印 1 和 0 ,如何获取异常值

【问题讨论】:

  • 您在哪些变量上运行 KMeans?但通常你可以使用plt.scatter(x, y)让打印点远离集群是什么意思?
  • 我做了一个非常相似的项目。你可以看看我是如何在第 166 到 171 行绘制数据的。github.com/moe-assal/Machine-Learning/blob/master/…
  • @moeassal 我不需要预测任何东西,我只想绘制一个图表并找到远离集群的点
  • @moeaassal 你只考虑两个变量
  • 对不起,你想做什么? oyu 想在你的情节中使用多少变量?

标签: python scikit-learn data-science k-means


【解决方案1】:

您不能绘制大于 3 的任何维度的数据(在您的情况下,它是 4 而不计算位置)。相反,您可以做的是找到特征和 K 点之间的距离,并使用它来大致了解正在发生的事情。我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    由于您基于超过 3 个特征(WD、AL、印度、日本、..)进行聚类,您需要执行以下任一操作来可视化图表。

    1. 使用降维方法(如 PCA、TSNE 或自动编码器)到 2 个变量(用于 2D 图)或 3 个变量(3D 图)

    2. 一次获取 2 或 3 个特征以保持其余不变。

    【讨论】:

      【解决方案3】:

      集群的散点图:您只能在 2D 或 3D 中绘图/可视化,但您示例中的数据至少具有 4 个特征(即 4 个维度)。要绘制集群,您需要根据需要将维度数量减少到 2 或 3,方法是减少用于聚类的特征集(例如,通过人工预选或使用特征减少技术)和/或将结果投影到降低维度(例如,如果您只有 3 个节点/集群,则可以使用包含所有 3 个质心的平面)

      远离“簇”/异常值的点:Kmeans 算法会将每个点分配给一个簇。集群的紧凑性反映在惯性值中。获取异常值的一种简单方法是查看点与其指定质心的距离,并使用阈值(如标准偏差的倍数)对异常值进行分类。另一种更复杂的方法是运行算法,然后删除到其指定质心的欧几里得距离最长的数据点,重新运行算法并检查平均间距的下降。重复直到没有明显下降。移除点的集合就是异常值。

      还有其他聚类算法(如 DBCSAN)试图隐式检测异常值。

      【讨论】:

        【解决方案4】:

        不要听反对者的话。尽管不可能在 2d 图像中合理准确地表示超过 3d 的数据,但像 PCATSNE 这样的降维技术可以通过在较低的图像上使用线性 (PCA) 或非线性 (TSNE) 投影来帮助实现这一点维空间。

        这里是一个葡萄酒数据集的例子,它有 13 个维度。您提供的数据只有 3 个数据点,因此不会很有说明性。

        import pandas as pd
        import numpy as np
        import matplotlib.pyplot as plt
        from sklearn.preprocessing import scale
        from sklearn.cluster import KMeans
        from sklearn.datasets import load_wine
        from sklearn.decomposition import PCA
        import matplotlib.cm as cm
        
        # Load wine dataset. It has 13 float-type features and 3 classes of wine
        data = load_wine()
        
        df = pd.DataFrame(data = scale(data.data), columns=data.feature_names)
        
        # Create a separate dataframe for target and predictions
        df_labels = pd.DataFrame(data=data.target, columns=['target'])
        
        class_names = list(data.target_names)
        
        # Perform K-means clustering
        km = KMeans(n_clusters=3).fit(df)
        df_labels['predictions'] = km.predict(df)
        
        # Use PCA to reduce dataset dimentions to project 13 dimensional dataset onto 2 dimensions
        pca = PCA(n_components=2).fit(df)
        
        df_reduced = pd.DataFrame(data=PCA(n_components=2).fit_transform(df.values), columns=['x', 'y'])
        
        fig, (ax_true, ax_pred) = plt.subplots(1, 2, figsize=(20, 10))
        
        # Use red, green, and blue to color different clusters
        colors = ['r', 'g', 'b']
        colors_true = [colors[i] for i in df_labels['target'].values]
        colors_pred = [colors[i] for i in df_labels['predictions'].values]
        
        # Plot cluster centroids with X symbols
        centroids = pca.transform(km.cluster_centers_)
        
        x = df_reduced['x'].values
        y = df_reduced['y'].values
        titles = ['target', 'predictions']
        
        for ax, colors, title in zip([ax_true, ax_pred], [colors_true, colors_pred], titles):
            ax.scatter(x, y, marker='o', s=5, linewidths=3, color=colors)
        
            # Plot the centroids as a black X
            ax.scatter(centroids[:, 0], centroids[:, 1],
                        marker='x', s=50, linewidths=2,
                        color='black', zorder=10)
        
            ax.set_title(title, fontsize= 14)
            ax.set_xticks(())
            ax.set_yticks(())
        
        plt.xlim((1.1*min(x), 1.1*max(x)))
        plt.ylim((1.1*min(y), 1.1*max(y)))
        plt.show()
        

        应该产生这样的情节:

        左侧的着色对应于真实的聚类,右侧表示 KMeans 预测。将targetdf_labels 中的prediction 进行比较,将揭示错误分类的点(在任何给定集群之外)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-10
          • 2017-07-28
          • 2017-08-10
          • 2016-03-13
          • 2015-05-03
          • 1970-01-01
          • 2017-10-13
          • 2021-04-19
          相关资源
          最近更新 更多