我试图Kmeans
在python中实现算法,它将使用cosine distance
而不是欧几里德距离作为距离度量.
我知道使用不同的距离函数可能是致命的,应该仔细进行.使用余弦距离作为度量迫使我改变平均函数(根据余弦距离的平均值必须是归一化向量的元素平均值的元素).
我已经看到了这种手动覆盖sklearn的距离函数的优雅解决方案,我想使用相同的技术来覆盖代码的平均部分,但我找不到它.
有谁知道怎么做?
距离度量不满足三角不等式有多重要?
如果有人知道kmeans的不同有效实现,我使用余弦度量或满足距离和平均函数,它也将是真正有用的.
非常感谢你!
编辑:
使用角距离而不是余弦距离后,代码看起来像这样:
def KMeans_cosine_fit(sparse_data, nclust = 10, njobs=-1, randomstate=None):
# 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 np.arccos(cosine_similarity(X, Y))/np.pi
k_means_.euclidean_distances = euc_dist
kmeans = k_means_.KMeans(n_clusters = nclust, n_jobs = njobs, random_state = randomstate)
_ = kmeans.fit(sparse_data)
return kmeans
Run Code Online (Sandbox Code Playgroud)
我注意到(通过数学计算)如果向量被归一化,则标准平均值适用于角度量.据我了解,我必须改变_mini_batch_step()
在k_means_.py.但功能非常复杂,我无法理解如何做到这一点.
有谁知道替代解决方案?
或许,有没有人知道我怎么能用一个总是迫使质心标准化的功能来编辑这个功能?
python k-means cosine-similarity scikit-learn sklearn-pandas