use*_*314 2 python numpy cluster-analysis distance
所以我正在运行一个KNN来创建集群.从每个集群,我想获得集群的medoid.
我使用小数距离度量来计算距离:
其中d是维数,第一个数据点的坐标是x ^ i,第二个数据点的坐标是y ^ i,f是0到1之间的任意数
然后我会将medoid计算为:
其中S是数据点的集合,δ是上面使用的距离度量的绝对值.
我在网上看起来没有用,试图找到medoid的实现(即使有其他距离指标,但大多数事情特别是k-means或k-medoid,[我认为]与我想要的相对不同.
从本质上讲,这归结为我无法将数学转化为有效的编程.任何帮助或指示正确的方向将非常感谢!这是我到目前为止的简短列表:
所以我在这里接受了答案,但我想如果其他人试图做类似的事情,我会提供我的实现:
(1) 这是距离函数:
def fractional(p_coord_array, q_coord_array):
# f is an arbitrary value, but must be greater than zero and
# less than one. In this case, I used 3/10. I took advantage
# of the difference of cubes in this case, so that I wouldn't
# encounter an overflow error.
a = np.sum(np.array(p_coord_array, dtype=np.float64))
b = np.sum(np.array(q_coord_array, dtype=np.float64))
a2 = np.sum(np.power(p_coord_array, 2))
ab = np.sum(p_coord_array) * np.sum(q_coord_array)
b2 = np.sum(np.power(p_coord_array, 2))
diffab = a - b
suma2abb2 = a2 + ab + b2
temp_dist = abs(diffab * suma2abb2)
temp_dist = np.power(temp_dist, 1./10)
dist = np.power(temp_dist, 10./3)
return dist
Run Code Online (Sandbox Code Playgroud)
(2) medoid 函数(如果数据集的长度小于 6000 [如果大于该长度,我会遇到溢出错误......老实说,我仍在努力解决这一点......]):
def medoid(dataset):
point = []
w = len(dataset)
if(len(dataset) < 6000):
h = len(dataset)
dist_matrix = [[0 for x in range(w)] for y in range(h)]
list_combinations = [(counter_1, counter_2, data_1, data_2) for counter_1, data_1 in enumerate(dataset) for counter_2, data_2 in enumerate(dataset) if counter_1 < counter_2]
for counter_3, tuple in enumerate(list_combinations):
temp_dist = fractional(tuple[2], tuple[3])
dist_matrix[tuple[0]][tuple[1]] = abs(temp_dist)
dist_matrix[tuple[1]][tuple[0]] = abs(temp_dist)
Run Code Online (Sandbox Code Playgroud)
有任何问题,欢迎评论!
| 归档时间: |
|
| 查看次数: |
3567 次 |
| 最近记录: |