【问题标题】:Obtaining k-means centroids and outliers in python / pyspark在 python / pyspark 中获取 k-means 质心和异常值
【发布时间】:2021-04-13 12:03:37
【问题描述】:

有谁知道 Python / PySpark 中的任何简单算法来检测 K-means 聚类中的异常值并创建这些异常值的列表或数据框?我不确定如何获得质心。我正在使用以下代码:

n_clusters = 10

kmeans = KMeans(k = n_clusters, seed = 0)
model = kmeans.fit(Data.select("features"))

【问题讨论】:

    标签: python apache-spark pyspark k-means outliers


    【解决方案1】:

    model.clusterCenters() 将为您提供质心。

    要获取异常值,一种直接的方法是获取大小为 1 的聚类。

    例子:

    data.show()
    +-------------+
    |     features|
    +-------------+
    |    [0.0,0.0]|
    |    [1.0,1.0]|
    |    [9.0,8.0]|
    |    [8.0,9.0]|
    |[100.0,100.0]|
    +-------------+
    
    from pyspark.ml.clustering import KMeans
    kmeans = KMeans()
    model = kmeans.fit(data)
    model.summary.predictions.show()
    +-------------+----------+
    |     features|prediction|
    +-------------+----------+
    |    [0.0,0.0]|         0|
    |    [1.0,1.0]|         0|
    |    [9.0,8.0]|         0|
    |    [8.0,9.0]|         0|
    |[100.0,100.0]|         1|
    +-------------+----------+
    
    print(model.clusterCenters())
    [array([4.5, 4.5]), array([100., 100.])]
    
    print(model.summary.clusterSizes)
    [4, 1]
    
    # Get outliers with cluster size = 1
    import pyspark.sql.functions as F
    model.summary.predictions.filter(
        F.col('prediction').isin(
            [cluster_id for (cluster_id, size) in enumerate(model.summary.clusterSizes) if size == 1]
        )
    ).show()
    +-------------+----------+
    |     features|prediction|
    +-------------+----------+
    |[100.0,100.0]|         1|
    +-------------+----------+
    

    【讨论】:

    • 还可以查看 scipys kmeans 模块 docs.scipy.org/doc/scipy/reference/generated/…
    • @mck 只是为了确保我理解:您将每个集群定义为大小 = 1,然后将在大小为 1 的集群之外的观察定义为异常值?而将大小定义为 1 的步骤是“model.clusterCenters() [array([4.5, 4.5]), array([100., 100.])]”?
    • @Johanna 不,集群的大小由 kmeans 算法确定。异常值被定义为大小为 1 的集群。
    • 是的,没错。这些异常值不会成为任何其他集群的一部分,因此它将形成自己的集群,大小为 1。这是否消除了您的疑虑?
    • 不,它们不是异常值。如果它们离质心足够远,就不会被分配到该集群。
    猜你喜欢
    • 2018-09-19
    • 2018-04-27
    • 2019-05-14
    • 2020-02-21
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2019-08-17
    • 2022-01-23
    相关资源
    最近更新 更多