笔试题,一小时手写k-means算法

循环智能-算法工程师 笔试题:手写k-means算法

1.题目描述

数据输出:
一个 N * 1 的一维向量,代表进行聚类之后各个点所属的类id。

要求:
代码可执行、正确、清晰
不得参考任何现成代码,否则自动fail

样例函数:
def clustering(data, k):
N, m = data.shape

return data_cluster

算法流程为(使用欧几里得距离):
令S为质心集合,初始化为空集
从数据集中随机选取一个样本点,加入S成为第一个质心
for i = 2 to k:
对于不在S中的每个样本,计算其与当前S中所有质心的距离的最大值D
选取D值最大的点,加入S成为第i个质心
(此时S中包含k个质心)
对每个样本点:
计算其与S中各个质心的距离
将样本点分配至最近质心所属的类
对某个类:
将质心设置为该类所有样本点的均值
在S中更新对应的类的质心
如果S中有质心发生改变,则重复上述过程(4-5)

2.题目解释

相信大家一下子就看出来了,这不就是要实现k-means聚类算法吗?哈哈

3.第一版回答

这是我第一版手写的k-means算法,过于冗余,而且只能处理特征数为2的数据集,并且不能处理重复的数据点…缺点不一而足,后续进行了优化

import numpy as np

#初始化质心
def init_c(data, k):
    key_1=np.random.randint(0, len(data))#选取第一个质心
    c_list = []  # 质心集合
    c_list.append(list(data[key_1]))
    temp = np.delete(data,key_1, axis = 0)
    length=len(temp)
for i in range(k-1):
        max_dis=0
        for j in range(0,length):
            D=0
            for c in c_list:
if dis_E(c,list(temp[j]))>D:
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值