所以我运行KNN来创建集群。从每个群集中,我想获得群集的medoid。
我使用分数距离度量来计算距离:
其中d是维数,第一个数据点的坐标是x^i,第二个数据点的坐标是y^i,f是0到1之间的任意数
然后我将计算medoid为:
其中S是数据点的集合,δ是上面使用的距离度量的绝对值。
我在网上找过medoid的实现,但没有结果(即使有其他距离度量,但大多数都是专门的k-means或k-medoid,[我认为]与我想要的相对不同。
从本质上讲,这归结为我无法将数学转化为有效的编程。任何帮助或在正确的方向指针将不胜感激!以下是我迄今为止的简短列表:
- 我已经找到了如何计算分数距离度量(第一个等式),所以我认为我在那里很好。
- 我知道numpy有一个argmin()函数(文档here)。
- 额外的点数可以提高效率而不缺乏准确性(我试图不通过计算每一个分数距离度量来进行蛮力计算(因为点对的数量可能会导致阶乘复杂度...)。
6条答案
按热度按时间5tmbdcev1#
1.计算成对距离矩阵
1.计算列和或行和
即
numpy.argmin(distMatrix.sum(axis=0))
或类似。8qgya5xd2#
所以我接受了这里的答案,但我想如果其他人试图做类似的事情,我会提供我的实现:
(1)这是距离函数:
(2)medoid函数(如果数据集的长度小于6000 [如果大于6000,我会遇到溢出错误.我仍然在努力工作,这一点是完全诚实的...]):
任何问题,请随时发表评论!
qzwqbdag3#
如果你不介意使用暴力,这可能会有所帮助:
z6psavjg4#
下面是一个用欧氏距离计算单个聚类的中心点的例子。
还可以使用以下包为一个或多个集群计算medoid
yftpprvb5#
一个简单的(但简单的)方法是仅仅平均集群中的向量(质心),然后找到集群中接近质心的向量吗?
ajsxfq5m6#
我会说你只需要计算中位数。
np.median(np.asarray(points), axis=0)
你的中位数是最大的中心点。
注意:如果你使用的距离不同于欧几里德,这是不成立的。