在 python / pyspark 中获取 k-means 质心和异常值
Posted
技术标签:
【中文标题】在 python / pyspark 中获取 k-means 质心和异常值【英文标题】:Obtaining k-means centroids and outliers in python / pyspark 【发布时间】: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"))
【问题讨论】:
【参考方案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。这是否消除了您的疑虑? 不,它们不是异常值。如果它们离质心足够远,就不会被分配到该集群。以上是关于在 python / pyspark 中获取 k-means 质心和异常值的主要内容,如果未能解决你的问题,请参考以下文章
PySpark - 如何根据 CoordinateMatrix 中表示的相似点获取前 k 个 ID?
如何从 Pyspark / Python 数据集中先前计算的列中获取值
如何使用 Python 或 Pyspark 或 scala 在数据块中获取笔记本的作业运行结果日志
在 spark 版本 2.2.0 中使用 python(pyspark) 从 mqtt 获取数据流