获取簇数 (3D)

Get number of Clusters (3D)

我有一个关于聚类的问题。当您使用 k-最近邻算法时,您必须说出您期望有多少个集群。我现在的问题是,我有一些运行,其中集群的数量有所不同。我查了一下,有一些方法可以限制你有多少个集群,但这些算法适用于二维问题。就我而言,我具有三个特征。你知道我可以使用什么算法来解决三维问题吗?如果有人能帮助我,我会很高兴,因为我自己也做了一些研究,但找不到任何东西。 :)

这里以定位两个簇为例,一个单点,数据行作为第二个簇:

这里以第二个例子为例,这里我希望算法能自动找到三个簇,长线,短线和单点:

谢谢。 :)

正如@ForceBru 在评论中所说,您也可以对 3D 数据使用 k-means 算法。当我必须处理要聚类的 3D 点时,我总是使用 sklearn.cluster.KMeans class

另请查看此 link,您可以从中找到一个简单的示例来开始:

上面link中提供的示例的关键部分如下:

from sklearn.cluster import KMeans
from sklearn import datasets

np.random.seed(5)

iris = datasets.load_iris()
X = iris.data
y = iris.target

estimators = [
    ("k_means_iris_8", KMeans(n_clusters=8)),
    ("k_means_iris_3", KMeans(n_clusters=3)),
    ("k_means_iris_bad_init", KMeans(n_clusters=3, n_init=1, init="random")),
]

你也可以尝试使用DBSCAN算法(但我不是这方面的专家)。看看here.

编辑

我研究了一点 sklearn.cluster 库中的 DBSCAN 算法,我还发现了一个有趣的 SO 答案 here。 所以,当集群的数量未知时 a-priori 你可以这样做(我已经尝试重现你的输入):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

data = np.array(
    [[0,0,0], [1,1,1], [2,2,2], [3,3,3], [4,4,4], [5,5,5], [20, 20, 20]]
)

model = DBSCAN(eps=2.5, min_samples=2)
model.fit_predict(data)
pred = model.fit_predict(data)

fig = plt.figure()
ax = plt.axes(projection='3d')

ax.scatter(data[:,0], data[:,1], data[:,2], c=model.labels_, s=20)
plt.show()

print("number of cluster found: {}".format(len(set(model.labels_))))
print('cluster for each point: ', model.labels_)

这是我从上面的代码中得到的:

尝试研究 documentation 中的 DBSCAN 参数,然后调整它们以满足您的目标。

最后,here还有一大堆其他的聚类算法,看看吧!

希望对您有所帮助!