k-Means算法实现

import numpy as np

# 计算欧式距离
def euclDistance(vector1, vector2):
    return np.sqrt(sum((vector2 - vector1) ** 2))


# 初始化质心
def initCentroids(dataSet, k):
    n_samples, n_feature = dataSet.shape
    # 初始化一个n_feature维数组记录每一个质心
    centroids = np.zeros((k, n_feature))
    # 随机选出k个质心
    for i in range(k):
        # 随机选出一个样本的索引
        index = int(np.random.uniform(0, n_samples))
        # 记录质心
        centroids[i, :] = dataSet[index, :]
    return centroids


def kmeans(dataSet, k):
    n_samples = dataSet.shape[0]
    # 一个二维数组,第一列记录样本所在的簇,第二列记录此样本到质心的距离
    samples_info = np.array(np.zeros((n_samples, 2)))
    cluster_changed = True

    # 初始化质心
    centroids = initCentroids(dataSet, k)

    while cluster_changed:
        cluster_changed = False
        # 遍历每一个样本
        for i in range(n_samples):
            # 样本到质心最小距离
            min_dist = np.inf
            # 样本所在的簇
            min_index = 0
            # 遍历每一个质心
            for j in range(k):
                distance = euclDistance(centroids[j, :], dataSet[i, :])
                if distance < min_dist:
                    min_dist = distance
                    samples_info[i, 1] = min_dist

            # 如果样本的所属的簇发生了变化
            if samples_info[i, 0] != min_index:
                cluster_changed = True
                samples_info[i, 0] = min_index
        # 更新质心
        for j in range(k):
            # 获取所在类别为j的簇内所有样本的索引
            cluster_index = np.nonzero(samples_info[:, 0] == j)
            # 类别为j的簇内所有样本
            temp = dataSet[cluster_index]
            # 计算质心
            centroids[j, :] = np.mean(temp, axis=0)

    return centroids, samples_info

if __name__ == '__main__':
    data = np.genfromtxt("kmeans.txt", delimiter=" ")
    centroids, samples_info = kmeans(data, k)
    print(centroids)
    print(samples_info)

K-Means算法是一种常用的聚类算法,它通过将数据集划分为k个簇,使得簇内的数据点相似度最大化,簇间的相似度最小化。以下是K-Means算法实现步骤: 1. 初始化:随机选择k个中心点作为初始聚类中心。 2. 分配:对于每个数据点,计算其与每个聚类中心的距离,并将其分配到距离最近的聚类簇。 3. 更新:对于每个聚类簇,重新计算其新的聚类中心,即取该簇内所有数据点的均值作为新的聚类中心。 4. 重复步骤2和步骤3,直到达到停止条件(如达到最大迭代次数或聚类中心不再变化)。 下面是一个简单的Python代码示例,实现K-Means算法: ```python import numpy as np def k_means(data, k, max_iterations): n = data.shape[0] # 随机初始化聚类中心 centroids = data[np.random.choice(n, k, replace=False)] for _ in range(max_iterations): # 分配步骤 distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2) cluster_labels = np.argmin(distances, axis=1) # 更新步骤 new_centroids = np.array([data[cluster_labels == i].mean(axis=0) for i in range(k)]) # 判断是否收敛 if np.all(centroids == new_centroids): break centroids = new_centroids return centroids, cluster_labels ``` 在上述代码中,`data`是输入的数据集,`k`是聚类的簇数,`max_iterations`是最大迭代次数。函数返回最终的聚类中心和每个数据点的聚类标签。 这只是一个简单的K-Means算法实现,实际应用中可能需要考虑更多的细节和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值