k-means聚类代码实现(1)

k-means聚类代码实现(1)

题目描述

本题要求实现一个基于KMeans聚类算法的函数,使其在给定样本集D和初始簇中心centroids的前提下,根据KMeans算法完成聚类.

注意:聚类的结束条件为: 各簇中心不再发生改变.

函数接口定义:
在这里描述函数接口。例如:

def KMeans_with_init_centroids(D, init_centroids)

函数参数说明:
D: 样本集,shape为(N, M)的 numpy array, 其中N为样本数量, M为样本特征维数.
init_centroids: 初始化的K个中心,shape为(K, M)的 numpy array.

输出: 函数需要返回聚类完成后的K个簇的中心centroids 和 每个样本聚类后所属的簇编号 labels.
centroids: 聚类完成后的K个簇中心,shape为(K,M)的numpy array
labels: 聚类后样本所属簇的编号, shape为(N,)的numpy array.
注意: labels中样本的簇编号应该与centroids中的簇中心对应. 例如labels[i] 表示样本集D中第i个样本的所属的簇中心为centroids[labels[i]]

裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

import numpy as np

def KMeans_with_init_centroids(D, init_centroids)
/* 请在这里填写答案 */

N = int(input())
D = []
for i in range(N):
    D.append(eval(input()))
D = np.array(D).astype(np.float32)

K = int(input())
init_centroids = []
for i in range(K):
    init_centroids.append(eval(input()))

init_centroids = np.array(init_centroids).astype(np.float32)
centroids, labels =  KMeans_with_init_centroids(D, init_centroids)
print(centroids)
print(labels)

输入样例:
在这里给出一组输入。例如:

5
[1, 2]
[0, 1]
[3, 4]
[7, 9]
[8, 6]
2
[0, 0]
[5, 5]

输出样例:
在这里给出相应的输出。例如:

[[1.3333334 2.3333333]
 [7.5       7.5      ]]
[0 0 0 1 1]
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

我的解答

def KMeans_with_init_centroids(D, init_centroids):
    #将每个点分配到最近质心
    lablels = []
    for i in range(len(D)):
        lablels.append(-1)
        min = float('inf')
        for j in range(len(init_centroids)):
            if sum((D[i] - init_centroids[j])**2) < min:
                min = sum((D[i] - init_centroids[j])**2)
                lablels[i] = j
    # 计算新的质心
    centroids = []
    for i in range(len(init_centroids)):
        count = 0
        sumPoint = [x*0 for x in range(int(init_centroids.shape[0]))]
        for j in range(len(lablels)):
            if lablels[j] == i:
                sumPoint += D[j]
                count += 1
        sumPoint /= count
        centroids.append(list(sumPoint))
    centroids = np.array(centroids).astype(np.float32)
    
    #判断是否继续
    # 在得到新质心后进行分配
    nextLables = []
    for i in range(len(D)):
        nextLables.append(-1)
        min = float('inf')
        for j in range(len(centroids)):
            if sum((D[i] - centroids[j])**2) < min:
                min = sum((D[i] - centroids[j])**2)
                nextLables[i] = j
    # 比较新质心后和当前质心对聚类的区别
    if lablels == nextLables:
        # 没有区别 结束
        return centroids,np.array(lablels)
    else:
        # 不同 继续
        return KMeans_with_init_centroids(D, centroids)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值