首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球形k-means在Python中的实现

球形k-means在Python中的实现
EN

Stack Overflow用户
提问于 2013-10-07 22:03:13
回答 3查看 12.2K关注 0票数 11

我使用scipy's k-means已经有一段时间了,我对它在可用性和效率方面的工作方式非常满意。然而,现在我想探索不同的k均值变体,更具体地说,我想在我的一些问题中应用spherical k-means

你知道球面k-means的Python实现(类似于scipy的k-means)吗?如果不是,修改scipy的源代码以使其k-means算法成为球形会有多难?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2016-08-11 23:47:28

在球形k-means中,您的目标是保证中心在球体上,因此您可以调整算法以使用余弦距离,并且还应该对最终结果的质心进行标准化。

当使用欧几里德距离时,我更倾向于将算法视为在每次迭代中将聚类中心投影到单位球面上,即在每个最大化步骤之后对中心进行归一化。

实际上,当中心和数据点都归一化时,余弦距离和欧几里德距离之间存在1对1的关系

代码语言:javascript
复制
|a - b|_2 = 2 * (1 - cos(a,b))

jasonlaska/spherecluster包将scikit learns的k-means修改为spherical k-means,还提供了另一种球体聚类算法。

票数 14
EN

Stack Overflow用户

发布于 2013-10-07 23:41:20

看起来球面k-means的显着特征是使用余弦距离,而不是标准的欧几里德度量。如上所述,这里有一个很好的纯numpy/scipy适应,所以在另一个答案中:

Is it possible to specify your own distance function using Scikits.Learn K-Means Clustering?

如果这不能满足您的需求,您可能想尝试一下sklearn.cluster

票数 3
EN

Stack Overflow用户

发布于 2018-01-30 17:28:01

如果你在一个3D球体上有极坐标,比如(**lat**,lon**) **,下面是你如何做到这一点的

  1. 如果您的坐标是以度为单位测量的(latlon)坐标,则可以编写一个函数将这些点转换为笛卡尔坐标,例如:

def cartesian_encoder( coord,r_E=6371):“将经度/经度转换为地球表面上的笛卡尔点。输入-coord: numpy 2darray (size=(N,2)) r_E :地球半径输出- out : numpy 2darray (size=(N,3))”def _to_rad( deg ):return deg* np.pi / 180。θ= _to_rad(coord:,0) # lat弧度φ= _to_rad(coord:,1) # lon弧度x= r_E * np.cos( phi ) * np.cos( theta ) y= r_E * np.sin(phi) * np.cos(theta) z= r_E * np.sin(theta) return np.concatenate(x.reshape(-1,1),y.reshape(-1,1),z.reshape(-1,1),axis=1)

如果您的坐标已经是弧度,只需删除function.

  • Install spherecluster包中的前5行。如果您以(latlon)对的行形式给出的极地数据名为X,并且您希望在其中找到10个聚类,则KMeans- cluster的最终代码将为:

将SphericalKMeans(10).fit_predict(X_cart)导入为np导入球簇X_cart = cartesian_encoder(X) kmeans_labels = numpy

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19226925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档