我正在尝试使用Python进行各种聚类算法和字符串距离度量,最终目的是根据Levenshtein,Jaro等各种距离度量对字符串列表进行聚类(每个字符串通常包含1个或2个单词)
我已经构建了用于根据不同距离度量(使用水母包)计算字符串之间距离的代码,并将它们与sklearn.cluster包提供的不同算法进行聚类。这是Jaro距离和MeanShift聚类的一些示例代码:
tokens = np.array(["test1", "test2", "test3", "cat", "cat food", "apple", "apple pie"])
distances = -1 * np.array([[jellyfish.jaro_distance(w1, w2) for w1 in tokens] for w2 in tokens])
meanshift = sklearn.cluster.MeanShift()
meanshift.fit(distances)
clusters = dict()
key = 0
for cluster_id in np.unique(meanshift.labels_):
cluster = np.unique(tokens[np.nonzero(meanshift.labels_ == cluster_id)])
clusters[key] = cluster.tolist()
key += 1
plot_clusters(clusters, ...)
现在,我想将聚类的结果绘制/可视化/保存为与该图相似的网络图[1]。我将对简单的可视化感到满意,该可视化使您可以轻松查看(并计数)不同的群集。这就是为什么我仅使用簇元素构建字典的原因。但是,如果可视化考虑到预先计算出的数据点之间的距离,那就太好了。无论哪种方式对我来说都行得通。我只想要一些不错的可视化效果以及对实际群集的分析。
有人对如何解决这个问题有想法或指示吗?任何帮助将不胜感激!
谢谢!
[1] https://www.kdnuggets.com/wp-content/uploads/k-means-datasci.jpg
免责声明:我是python和机器学习的新手
答案 0 :(得分:0)
它还没有显示距离,但是您可以做一些彩色的散点图,例如
import matplotlib.pyplot as plt
from matplotlib.pyplot import cm
plt.figure()
clustercount = len(clusters)
color=iter(cm.rainbow(np.linspace(0,1,clustercount)))
for cl in clusters:
c=next(color)
x = # x data of your cluster here
y = # y data of your cluster here
label = # label of your cluster here
plt.scatter(x, y, color=c, label=label)
plt.xlabel('X');
plt.ylabel('Y');
plt.legend(loc=2);
plt.show()
这将以不同的颜色可视化群集,以便您可以轻松查看和计数它们
也许您可以通过meanshift.cluster_centers_访问群集中心。如果是这样,您也可以用静态颜色绘制它们以可视化距离。