kmeans 算法,距离改用余弦相似度, Python 实现。

2019-05-06 14:14:21 +08:00
 allenwuli

如题,有大佬写过这个算法吗? sklearn 中的 kmeans 算法用的是欧式距离,且不支持修改。

7323 次点击
所在节点    机器学习
4 条回复
SleipniR
2019-05-06 14:31:05 +08:00
allenwuli
2019-05-06 14:44:06 +08:00
@SleipniR 先谢谢大佬,我咋打不开链接呢。
SleipniR
2019-05-06 15:46:17 +08:00
好像需要梯子:

from sklearn.cluster import k_means_
from sklearn.metrics.pairwise import cosine_similarity, pairwise_distances
from sklearn.preprocessing import StandardScaler


def create_cluster(sparse_data, nclust = 10):

# Manually override euclidean
def euc_dist(X, Y = None, Y_norm_squared = None, squared = False):
#return pairwise_distances(X, Y, metric = 'cosine', n_jobs = 10)
return cosine_similarity(X, Y)
k_means_.euclidean_distances = euc_dist

scaler = StandardScaler(with_mean=False)
sparse_data = scaler.fit_transform(sparse_data)
kmeans = k_means_.KMeans(n_clusters = nclust, n_jobs = 20, random_state = 3425)
_ = kmeans.fit(sparse_data)
return kmeans.labels_
allenwuli
2019-05-07 09:50:19 +08:00
@SleipniR 大佬,我看了下这个算法
def euc_dist(x, y=None):
return cosine_similarity(x, y)
k_means_.euclidean_distances = euc_dist
这个算法在这步改成用余弦相似度。计算聚类中心是怎么计算的我点进源码也没看明白。能帮我解释一下他是如何计算类中心的吗?谢谢大佬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX