题解 | 用户分群

用户分群

https://www.nowcoder.com/practice/ba24c14adb424bd2b4888c70ddfe9568

import math


def k_means_fast(K, R, M, centers, data):
    for _ in range(R):
        # 1. 初始化 K 个簇的容器
        groups = [[] for _ in range(K)]

        # 2. 遍历每个数据点,直接分配到最近的簇
        for point in data:
            # 利用列表推导式计算点到所有中心的距离,并用 min 找出最小距离对应的索引
            distances = [math.dist(point, c) for c in centers]
            closest_idx = distances.index(min(distances))
            groups[closest_idx].append(point)

        # 3. 重新计算中心点
        for i in range(K):
            if not groups[i]:
                continue  # 如果该簇没有分配到点,保持原中心不变

            # 核心技巧:zip(*groups[i]) 会把所有点的第0维、第1维...分别打包
            # 例如点是 [[1,2,3], [4,5,6]] -> zip后变成 [(1,4), (2,5), (3,6)]
            centers[i] = [sum(dim) / len(groups[i]) for dim in zip(*groups[i])]

    return centers


if __name__ == "__main__":
    K = int(input())
    centers = [[float(x) for x in input().split()] for _ in range(K)]

    R = int(input())
    M = int(input())
    data = [[float(x) for x in input().split()] for _ in range(M)]

    res = k_means_fast(K, R, M, centers, data)

    for row in res:
        print(" ".join(f"{val:.2f}" for val in row))

全部评论

相关推荐

03-31 14:46
已编辑
门头沟学院 Web前端
励志成为双港第一ja...:这其实很正常,离的太远了,他认为你不会来,就为了混个面试,而且成本很高,实习生都优先选本地高校。吃了地域的亏,所有很多时候地域可能比院校层次更重要。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务