You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写聚类程序实现数据点归至最近簇并定制输出文件格式

实现基于最近邻的聚类分配程序

没问题,我来帮你搞定这个聚类分配的核心逻辑和完整程序。核心就是计算每个点到簇中心的距离,把它分配到最近的那个簇里对吧?下面分模块给你讲清楚:

核心归簇模块(程序的心脏)

这部分是最关键的代码,负责计算距离并完成簇的分配。我默认用欧氏距离(如果需要曼哈顿距离或者其他度量,改一下距离计算函数就行):

import math

def calculate_euclidean_distance(point, cluster_center):
    """计算两个点之间的欧氏距离,支持任意维度"""
    return math.sqrt(sum((p - c)**2 for p, c in zip(point, cluster_center)))

def assign_to_nearest_cluster(data_points, cluster_centers):
    """
    核心函数:将每个数据点分配到最近的簇
    参数:
        data_points: 列表,每个元素是一个数据点(比如二维坐标 [x,y])
        cluster_centers: 列表,每个元素是簇中心的坐标
    返回:
        元组:(每个点对应的簇标签列表, 每个簇包含的点的索引列表)
    """
    cluster_assignments = []
    cluster_members = [[] for _ in range(len(cluster_centers))]
    
    for idx, point in enumerate(data_points):
        # 计算当前点到所有簇中心的距离
        distances = [calculate_euclidean_distance(point, center) for center in cluster_centers]
        # 找到距离最小的簇的索引
        nearest_cluster_idx = distances.index(min(distances))
        # 记录分配结果
        cluster_assignments.append(nearest_cluster_idx)
        cluster_members[nearest_cluster_idx].append(idx)
    
    return cluster_assignments, cluster_members

完整程序(含输入输出流程)

把核心模块整合到完整流程里,包含数据加载、执行分配、输出指定格式文件的逻辑:

import csv

def load_data_from_csv(file_path):
    """从CSV加载数据点,假设每行是x,y(可根据实际格式修改)"""
    data_points = []
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        next(reader)  # 跳过表头行
        for row in reader:
            point = tuple(map(float, row))
            data_points.append(point)
    return data_points

def save_cluster_results(output_path, data_points, cluster_assignments):
    """保存分配结果到指定格式文件,示例格式:每行x,y,cluster_id"""
    with open(output_path, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['x', 'y', 'cluster_id'])  # 写入表头
        for point, cluster_id in zip(data_points, cluster_assignments):
            # 簇ID从1开始(如果需求是从0开始,去掉+1即可)
            writer.writerow([point[0], point[1], cluster_id + 1])

# 主执行流程
if __name__ == "__main__":
    # 1. 加载输入数据
    input_data_path = "data_points.csv"
    data_points = load_data_from_csv(input_data_path)
    
    # 2. 初始化簇中心(这里假设你已经有初始中心,比如K-means的随机中心或给定值)
    cluster_centers = [(1.5, 3.2), (6.1, 7.9), (9.3, 1.4)]
    
    # 3. 核心步骤:分配数据点到最近簇
    cluster_assignments, cluster_members = assign_to_nearest_cluster(data_points, cluster_centers)
    
    # 4. 保存结果到指定格式文件
    output_result_path = "cluster_assignments.csv"
    save_cluster_results(output_result_path, data_points, cluster_assignments)
    
    print(f"聚类分配完成!结果已保存到 {output_result_path}")

输出格式说明

上面示例输出的是CSV格式,每行包含数据点坐标和对应的簇ID,样例如下:

x,y,cluster_id
0.4,2.1,1
6.8,8.7,2
10.2,0.9,3

如果你的指定格式是其他类型(比如TXT每行是点ID 簇ID),只需要修改save_cluster_results函数的写入逻辑即可,核心归簇模块完全不需要改动。

优化小提示

如果处理大数据量,手动计算距离会比较慢,可以用numpy替换距离计算,速度会提升很多:

import numpy as np
def calculate_euclidean_distance(point, cluster_center):
    return np.linalg.norm(np.array(point) - np.array(cluster_center))

内容的提问来源于stack exchange,提问作者vic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:23:13