冈萨雷斯算法

计算科学 Python 数据分析
2021-12-16 13:00:27

我对实施用于 k 中心聚类的 Gonzalez 算法感到困惑。

算法是:

  • 为数据集S
  • 任意选择数字是中心。(一般让)。z1SzZi={z1,,zi}
  • 对于 i = 2 到 k 做
    • 设置zi=argmaxxSd(x,ϕ(Zi1)(x))

的公式 ϕ(Z)(x)=argminzZd(x,z)

我应该在 Python 中实现它。Python中曾经有用于聚类的函数,Python中有没有针对该算法的函数?

1个回答

Gonzalez 算法的输入是要聚类的一组元素以及每对元素之间的距离。Gonzalez 算法的第一步是随机选择一个元素,这将是你的第一个中心(我们称之为 c_1)。由于您已经有了一个中心,您必须计算从每个元素到 c_1 的距离。接下来,选择距离 c_1 最远的元素作为新中心。在剩余的步骤 (k-2) 中,您必须继续计算从每个元素到已选择中心集的距离,并选择最远的元素作为中心。这里重要的是,在这种情况下,从元素 e 到一组中心 C 的距离,距离(e,C),被定义为从 e 到其在 C 中最近的中心的距离。我给你一个一般的冈萨雷斯算法的草图,其中 matrix[i][j] 存储元素 i 到元素 j 的距离。我是 python 的新手,所以我的代码不是最优的,但给了你一个想法。

def gon():
    C = []
    global distance = []
    for i in range(0,n):
        distance.append(float("inf"))
    f = random.randint(0, n-1)
    C.append(f)
    update_distance(C, 0)
    for i in range(1, k):
        f = farthest_element()
        C.append(f)
        update_distance(C, i)
    size = solution_size()
    out = [size, C]
    return out

# Update the distance of every element to the set of added centers
def update_distance(centers, max_index):
    global distance
    for i in range(0, n):
        if matrix[i][centers[max_index]] < distance[i]:
            distance[i] = matrix[i][centers[max_index]]

# Get the farthest element
def farthest_element():
    max_dist = 0
    max_dist_element = 0
    global distance
    for i in range(0,n):
        if distance[i] > max_dist:
            max_dist = distance[i]
            max_dist_element = i
    return max_dist_element