当前位置: 首页 > article >正文

聚类算法k-means(手撕和调用skl)

定义

K均值聚类(k-means clustering)算法是一种常用的、基于原型的聚类算法,简单、直观、高效。其步骤为:

第一步:根据事先已知的聚类数,随机选择若干样本作为聚类中心,计算每个样本与每个聚类中心的欧式距离,离哪个聚类中心近,就算哪个聚类中心的聚类,完成一次聚类划分.

第二步:计算每个聚类的几何中心,如果几何中心与聚类中心不重合,再以几何中心作为新的聚类中心,重新划分聚类. 重复以上过程,直到某一次聚类划分后,所得到的各个几何中心与其所依据的聚类中心重合或足够接近为止. 聚类过程如下图所示:

 

注意事项:

(1)聚类数(K)必须事先已知,来自业务逻辑的需求或性能指标.

(2)最终的聚类结果会因初始中心的选择不同而异,初始中心尽量选择离中心最远的样本.

手撸k-means

原理

上述公式不好求解,一般我们通过迭代的方式近似化求解 

代码实现 

数据集选择西瓜书中提供的数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math

data = pd.read_csv('西瓜数据集4.0.csv')
feature = ['密度','含糖率']
data = data[feature]

K = 3

#随机选取簇初始化
C_list = data.sample(K).values

data = data.values
while True:
    C_cluster = [[] for _ in range(K)]#存放每个簇的数据
    for i in range(len(data)):
        C_dist = {}#字典形式存放每个元素对于每个簇的距离,以此来判断该放入哪个簇
        for j in range(len(C_list)):
            diff = math.sqrt((data[i][0]-C_list[j][0])**2+(data[i][1]-C_list[j][1])**2)
            C_dist[j] = diff
        C_dist_sort = sorted(C_dist.items(),key = lambda x:x[1])    
        print(C_dist_sort)
        C_cluster[C_dist_sort[0][0]].append(data[i])
    print(C_cluster)
    
    flag = True#用于判断是否结束循环
    
    #计算每个簇的均值并置为新的中心点,若均值与之前相等则结束循环
    for i in range(len(C_list )):
        i_mean = np.mean(C_cluster[i],axis = 0)
        for j in range(i_mean.shape[0]):
            if i_mean[j] != C_list [i][j]:
                flag = False
                C_list [i] = i_mean
                break
    if flag:
        break

color = np.random.random((3,K)) #随机颜色

#得到最终的分类结果并绘图
for i in range(K):
    C = C_cluster[i] #每一簇的元素
    x = [i[1] for i in C]
    y = [i[0] for i in C]
    plt.scatter(x,y,c = color[i],label = 'C'+str(i)) #随机颜色
plt.legend()
plt.xlabel('midu')
plt.ylabel('hantang')
plt.show()

 将聚类后结果绘制出来

调用sklearn的库函数 

import pandas as pd
import matplotlib.pyplot as plt
import sklearn.cluster as sc

data = pd.read_csv('西瓜数据集4.0.csv')
feature = ['密度','含糖率']
data = data[feature]

model = sc.KMeans(n_clusters=4)

model.fit(data)

label = model.labels_

result_y = model.predict([[0.4,0.5]])
print(result_y)

plt.scatter(data['含糖率'],data['密度'],c= label,cmap='spring')
plt.xlabel('midu')
plt.ylabel('hantang')
plt.legend()
plt.show()

 

特点及使用

优点

(1)原理简单,实现方便,收敛速度快;

(2)聚类效果较优,模型的可解释性较强;

缺点

(1)需要事先知道聚类数量;

(2)聚类初始中心的选择对聚类结果有影响;

(3)采用的是迭代的方法,只能得到局部最优解;

(4)对于噪音和异常点比较敏感.

什么时候选择k-means

(1)事先知道聚类数量

(2)数据分布有明显的中心


http://www.kler.cn/news/283889.html

相关文章:

  • Python编码系列—Python项目架构的艺术:最佳实践与实战应用
  • 【数据结构】关于哈希表内部原理,你到底了解多少???(超详解)
  • 自动化01:认识接线端子
  • vue脚手架的创建
  • 基于多条件复杂查询的JSON指令搜索与排序算法设计
  • -[meetingbot4ios.AppDelegate window]: unrecognized selector sent to instance
  • 黑屏环境下,如何利用OBD部署OceanBase企业版集群
  • Web3开发与安全:6个月高效学习路径
  • Python从入门到进阶教程文章分享汇总~持续更新
  • 缓存:浅谈双写导致的数据一致性问题
  • 【2024 CCF编程能力等级认证(GESP)Python 】一级大纲
  • 桥接与NET
  • AI-Talk开发板硬件适配
  • 改造小蚁摄像头支持免费无限容量云储存(Samba挂载篇)
  • 零基础入门转录组数据分析——基因Wilcoxon秩和检验
  • python进阶篇-day02-面向对象高级
  • DIFFUSION 系列笔记| Latent Diffusion Model、Stable Diffusion基础概念、数学原理、代码分析、案例展示
  • 【node.js】基础之修改文件
  • APP渠道来源方案探索
  • 第22周:调用Gensim库训练Word2Vec模型
  • 使用对象池优化 C++ 程序性能的实用指南
  • 传输层协议-UDP数据报
  • 6 自研rgbd相机基于rk3566之深度计算库程序详解
  • 第一次用macos快速上手教程
  • 算法进阶篇 之 实用数据结构
  • 【图论简介】
  • 深入理解Python中的`super()`函数:如何调用父类的方法
  • 【数字IC】——逻辑综合,物理数据的读入
  • Vxe UI vue vxe-table 如何在表格中使用上传附件、上传图片
  • Linux下编译安装SuperLU