手写K均值聚类

文章目录

K-Means-Clustering

  • 数据集:链接:https://pan.baidu.com/s/1aEgDpQoeT_kFbwD1YyrCaw
    提取码:2021

  • 代码:

    #!/usr/bin/env python
    # coding: utf-8
    
    # In[6]:
    
    
    ## import Module 
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # In[5]:
    
    
    ## data analysis
    data = np.loadtxt('数据集//testSet.txt')
    data.shape #(80, 2)
    
    
    # In[7]:
    
    
    ## 数据可视化
    plt.scatter(data[:,0],data[:,1])
    plt.show()
    
    
    # In[54]:
    
    
    # 初始化K个质心
    def initCentroids(data, k):
        shape = data[0].shape[0]
        centroids = np.empty((k,shape))
        for i in range(shape):
            centroids[:,i] = (data[:,i].min() + data[:,i].ptp() * np.random.rand(k,1)).flatten() # 转换成一维的
        return centroids
    
    
    # In[118]:
    
    
    initCentroids(data,4)
    
    
    # In[119]:
    
    
    ## 计算质心 和样本距离的函数
    def euclDistance(v1,v2):
        return np.sqrt(np.sum(np.power(v2-v1,2)))
    
    
    # In[147]:
    
    
    ## algorithm core
    def KMeans(data, k):
        row = data.shape[0]
        centroids = initCentroids(data,k)
        #存放 K 个簇
        while(True):
            flag = True
            lists = [[] for i in range(k)]
            for i in range(row):
                ds = 1000000
                cs = 0
                for j in range(k):
                    d = euclDistance(data[i],centroids[j])
                    if d<ds:
                        ds = d
                        cs = j
                #找到 当前样本距离最近的质心,放到 对应集合中
                lists[cs].append(data[i])
            newLists = np.array([np.mean(lists[i], axis = 0) for i in range(k)])
            if np.array_equal(newLists, centroids) == True:
                break
            else:
                centroids = newLists
            #lists 是 划分好的 聚簇,newLists 是 质点集合
        return lists,newLists
    
    
    # In[152]:
    
    
    ## 调用函数
    lists,newLists = KMeans(data,k = 4)
    newLists
    
    
    # In[153]:
    
    
    ## 在原图中画出 最终质点
    plt.scatter(data[:,0],data[:,1])
    plt.scatter(newLists[:,0],newLists[:,1])
    plt.show()
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Klaus1205

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值