获取簇数 (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还有一大堆其他的聚类算法,看看吧!
希望对您有所帮助!
我有一个关于聚类的问题。当您使用 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还有一大堆其他的聚类算法,看看吧!
希望对您有所帮助!