keams算法python代码实现

import numpy as np

class KMeans:
    def __init__(self, k=3, max_iters=100, random_state=None):
        """
        初始化 K-Means 模型
        :param k: 簇的数量
        :param max_iters: 最大迭代次数
        :param random_state: 随机种子
        """
        self.k = k
        self.max_iters = max_iters
        self.random_state = random_state
        self.centroids = None
        self.labels = None

    def _initialize_centroids(self, X):
        """
        随机初始化质心
        :param X: 数据集
        """
        np.random.seed(self.random_state)
        random_indices = np.random.choice(X.shape[0], self.k, replace=False)
        self.centroids = X[random_indices]

    def _assign_clusters(self, X):
        """
        将每个数据点分配到最近的质心所在的簇
        :param X: 数据集
        :return: 每个数据点的簇标签
        """
        distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2)
        return np.argmin(distances, axis=1)

    def _update_centroids(self, X, labels):
        """
        更新质心
        :param X: 数据集
        :param labels: 每个数据点的簇标签
        """
        self.centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])

    def fit(self, X):
        """
        训练 K-Means 模型
        :param X: 数据集
        """
        self._initialize_centroids(X)
        for _ in range(self.max_iters):
            labels = self._assign_clusters(X)
            new_centroids = self._update_centroids(X, labels)
            if np.all(self.centroids == new_centroids):
                break
        self.labels = labels

    def predict(self, X):
        """
        预测新数据点的簇标签
        :param X: 新数据点
        :return: 新数据点的簇标签
        """
        return self._assign_clusters(X)

# 示例代码
if __name__ == "__main__":
    # 生成随机数据
    np.random.seed(42)
    X = np.random.rand(100, 2)

    # 初始化 K-Means 模型
    kmeans = KMeans(k=3, max_iters=100, random_state=42)

    # 训练模型
    kmeans.fit(X)

    # 预测簇标签
    labels = kmeans.predict(X)

    # 打印结果
    print("簇标签:", labels)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值