基于python的k-means算法实现

k-means算法

此次的作业是要求我们利用所学知识实现利用python实现k-means算法,首先我们先来简单的介绍一下k-means算法:
k-means算法接受输入量k;然后将n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”来进行计算的。

算法实现思路

k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。在利用python实现时,主要为以下5步:
①首先,设定一个k值,k值为分成类的数量,需要几个类,k就为多少;
②随机选取k个点,将这k个点作为此次聚类的中心点(在此次算法实现的过程中,由于我们是随机选取的中心点,所以每次的结果可能不同,属于正常情况);
③遍历所有的点,计算所有的点距离k个聚类中心点的距离,最终求的结果,比较所选取的点到各个聚类中心的距离,哪个聚类中心距离样本点最近,该样本点就归属于哪一类,即归属于哪个聚类中心点;
④现在,我们通过第②布所随机选区的k个中心点,进而通过第③步得到了k个聚类,现在,我们需要根据我们所得的新的聚类,计算新的聚类中心,此时,新的聚类中心即为我们所得聚类的包含的所有点的平均值,通过计算平均值,我们得到了新的聚类中心点;
⑤通过第⑤步我们得到了新的聚类中心点,再利用新的聚类中心点继续执行步骤③和步骤④,直到聚类中心点不再变化为止,最终我们会得到一个最优聚类。

实现代码

import matplotlib.pyplot as plt
import numpy as np

#加载数据
def load_data_set():
    """
    加载数据
    :return:返回两个数组
            data_arr  原始数据的特征
            label_arr   每个样本对应的类别
    """
    data_arr = []
    label_arr = []

    f = open('存放数据的txt文件地址','r')
    for line in f.readlines():
        line_arr = line.strip().split()
        data_arr.append([np.float(line_arr[0]),np.float(line_arr[1])])
        label_arr.append(int(line_arr[2]))
    return np.array(data_arr),np.array(label_arr)
x,label = load_data_set()
#绘制出数据点分析看有几个聚类
#创建k个聚类数组,用于存放属于该聚类的点
clusters = []
p1 = [6,4]
p2 = [1,3]
cluster_center = np.array([p1,p2])
k = 2
for i in range(k):
    clusters.append([])

epoch = 3
for _ in range(epoch):
    for j in range(k):
        clusters[i] = []
        #计算所有点到该聚类中心的距离
    for i in range(x.shape[0]):
        xi = x[i]
        distances = np.sum((clusters_center-xi)**2,axis=1)
        #距离哪个聚类中心点近,就把这个点的序号加到那个聚类中
        c = np.argmin(distances)
        clusters[c].append(i)

    #重新计算k个聚类的聚类中心,(没各聚类所有的点加起来取平均值)
    for i in range(k):
        clusters_center[i] = np.sum(x[clusters[i]],axis=0)/len(clusters[i])

plt.scatter(x[clusters[0],0],x[clusters[0],1])
plt.scatter(x[clusters[1],0],x[clusters[1],1])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值