V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
allenwuli
V2EX  ›  机器学习

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

  •  
  •   allenwuli · 2019-05-06 14:14:21 +08:00 · 7327 次点击
    这是一个创建于 2031 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    4 条回复    2019-05-07 09:50:19 +08:00
    SleipniR
        1
    SleipniR  
       2019-05-06 14:31:05 +08:00   ❤️ 1
    allenwuli
        2
    allenwuli  
    OP
       2019-05-06 14:44:06 +08:00
    @SleipniR 先谢谢大佬,我咋打不开链接呢。
    SleipniR
        3
    SleipniR  
       2019-05-06 15:46:17 +08:00   ❤️ 1
    好像需要梯子:

    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
        4
    allenwuli  
    OP
       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
    这个算法在这步改成用余弦相似度。计算聚类中心是怎么计算的我点进源码也没看明白。能帮我解释一下他是如何计算类中心的吗?谢谢大佬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:24 · PVG 11:24 · LAX 19:24 · JFK 22:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.