机器学习算法

K-Means 算法

K-Means 是一种无监督学习算法,用于将数据点划分为 k 个不同的簇。下面是使用 PyTorch 实现 K-Means 算法的代码示例:

import torch

def kmeans(X, k, max_iter=100):
    """
    K-Means 算法的 PyTorch 实现

    参数:
    X (torch.Tensor): 输入数据,形状为 (n_samples, n_features)
    k (int): 簇的数量
    max_iter (int): 最大迭代次数

    返回:
    torch.Tensor: 每个数据点所属的簇的索引
    torch.Tensor: 每个簇的中心点
    """
    # 随机初始化中心点
    n_samples, n_features = X.shape
    indices = torch.randperm(n_samples)[:k]
    centroids = X[indices]

    for _ in range(max_iter):
        # 计算每个数据点到每个中心点的距离
        distances = torch.cdist(X, centroids)

        # 找到每个数据点最近的中心点
        labels = torch.argmin(distances, dim=1)

        # 更新中心点
        new_centroids = torch.zeros(k, n_features, dtype=X.dtype, device=X.device)
        for i in range(k):
            cluster_points = X[labels == i]
            if len(cluster_points) > 0:
                new_centroids[i] = torch.mean(cluster_points, dim=0)
            else:
                # 如果某个簇为空,重新随机初始化该中心点
                new_centroids[i] = X[torch.randint(0, n_samples, (1,))]

        # 判断是否收敛
        if torch.allclose(centroids, new_centroids):
            break

        centroids = new_centroids

    return labels, centroids

你可以使用以下方式调用这个函数:

# 生成一些示例数据
n_samples = 100
n_features = 2
X = torch.randn(n_samples, n_features)

# 运行 K-Means 算法
k = 3
labels, centroids = kmeans(X, k)

print("每个数据点所属的簇的索引:", labels)
print("每个簇的中心点:", centroids)

代码解释:

  1. 初始化中心点:从输入数据中随机选择 k 个点作为初始中心点。
  2. 迭代更新
    • 计算每个数据点到每个中心点的距离。
    • 找到每个数据点最近的中心点,并将其分配到该簇。
    • 更新每个簇的中心点,即计算该簇中所有数据点的平均值。
  3. 收敛判断:如果中心点不再发生变化,则认为算法收敛,停止迭代。

注意事项:

  • 该实现使用欧几里得距离来计算数据点之间的距离。
  • 如果某个簇为空,我们重新随机初始化该簇的中心点,以避免出现中心点为零向量的情况。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注