我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用python实现聚类分析K-means算法的详细过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用python实现聚类分析K-means算法的详细过程

K-means算法介绍

  K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

                     

算法过程如下:

1)从N个文档随机选取K个文档作为中心点;

2)对剩余的每个文档测量其到每个中心点的距离,并把它归到最近的质心的类;

3)重新计算已经得到的各个类的中心点;

4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束。

算法优缺点:

优点:

  • 原理简单
  • 速度快
  • 对大数据集有比较好的伸缩性

缺点:

  • 需要指定聚类 数量K
  • 对异常值敏感
  • 对初始值敏感代码实现:

首先我们随机生成200个点,就取(0,2000)之间的,并确定质心个数,这里就取个3个质心,也是随机生成(可以根据需求改变)如下:


import random
import matplotlib.pyplot as plt
 
random_x = [random.randint(0,2000) for _ in range(200)]
random_y = [random.randint(0,2000) for _ in range(200)]
random_poinsts = [(x, y) for x, y in zip(random_x, random_y)]
 
def generate_random_point(min_,max_):
    return random.randint(min_,max_),random.randint(min_,max_)
k1,k2,k3 = generate_random_point(-100,100),generate_random_point(-100,100),generate_random_point(-100,100)
 
plt.scatter(k1[0],k1[1],color = 'red',s=100)
plt.scatter(k2[0],k2[1],color = 'blue',s=100)
plt.scatter(k3[0],k3[1],color = 'green',s=100)
plt.scatter(random_x,random_y)

        结果如下:

 

接着导入numpy,来计算各个点与质心的距离,并根据每个点与质心的距离分类,与第一个点近则分配在列表的第一个位置,离第二个近则分配到第二个位置,以此类推,如下


import numpy as np
def dis(p1,p2):  #这里的p1,p2是一个列表[number1,number2]  距离计算
    return np.sqrt((p1[0] - p2[0])**2 + (p1[1]-p2[1])**2)
random_poinsts = [(x, y) for x, y in zip(random_x, random_y)] #将100个随机点塞进列表
groups = [[],[],[]]  #100个点分成三类
for p in random_poinsts: #k1,k2,k3是随机生成的三个点
    distances = [dis(p,k) for k in [k1,k2,k3]]
    min_index = np.argmin(distances)#取距离最近质心的下标
    groups[min_index].append(p)
groups
 
结果如下:
[[(1000, 867),
  (1308, 840),
  (1999, 1598),
  (1606, 1289),
  (1324, 1044),
  (780, 923),
  (1915, 788),
  (443, 980),
  (687, 908),
  (1763, 1039),
  (1687, 1372),
  (1932, 1759),
  (1274, 739),
  (939, 1302),
  (790, 1169),
  (1776, 1572),
  (1637, 1042),
....

可以看到,这200个点根据与三个质心的距离远近不同,已经被分成了三类,此时groups里面有三个列表,这三个列表里分别是分配给三个质心的点的位置,接着我们将其可视化,并且加入循环来迭代以此找到相对最优的质点,代码如下:


previous_kernels = [k1,k2,k3]
circle_number = 10
for n in range(circle_number):
    plt.close() #将之前的生成的图片关闭
    kernel_colors = ['red','yellow','green']
    new_kernels =[]
    plt.scatter(previous_kernels[0][0],previous_kernels[0][1],color = kernel_colors[0],s=200)
    plt.scatter(previous_kernels[1][0],previous_kernels[1][1],color = kernel_colors[1],s=200)
    plt.scatter(previous_kernels[2][0],previous_kernels[2][1],color = kernel_colors[2],s=200)
 
    groups = [[],[],[]]  #100个点分成三类
    for p in random_poinsts: #k1,k2,k3是随机生成的三个点
        distances = [dis(p,k) for k in previous_kernels]
        min_index = np.argmin(distances)#取距离最近质心的下标
        groups[min_index].append(p)
    print('第{}次'.format(n+1))
    for i,g in enumerate(groups):
        g_x = [_x for _x,_y in g]  
        g_y = [_y for _x,_y in g]
        n_k_x,n_k_y = np.mean(g_x),np.mean(g_y)
        new_kernels.append([n_k_x,n_k_y])
        print('三个点之前的质心和现在的质心距离:{}'.format(dis(previous_kernels[i],[n_k_x,n_k_y])))
        plt.scatter(g_x,g_y,color = kernel_colors[i])
        plt.scatter(n_k_x,n_k_y,color = kernel_colors[i],alpha= 0.5,s=200)
    previous_kernels = new_kernels
 
结果如下:
第1次
三个点之前的质心和现在的质心距离:344.046783724601
三个点之前的质心和现在的质心距离:178.67567512699137
三个点之前的质心和现在的质心距离:85.51258602308063
第2次
三个点之前的质心和现在的质心距离:223.75162213961798
三个点之前的质心和现在的质心距离:41.23571511332308
三个点之前的质心和现在的质心距离:132.0752155320645
第3次
三个点之前的质心和现在的质心距离:87.82012730359548
三个点之前的质心和现在的质心距离:22.289121504444285
三个点之前的质心和现在的质心距离:33.55374236991017
第4次
三个点之前的质心和现在的质心距离:50.94506045880864
三个点之前的质心和现在的质心距离:25.754704854433683
三个点之前的质心和现在的质心距离:23.145028187286528
第5次
三个点之前的质心和现在的质心距离:66.35519842692533
三个点之前的质心和现在的质心距离:31.90944410706013
三个点之前的质心和现在的质心距离:36.247409926389686
第6次
三个点之前的质心和现在的质心距离:46.17069651194525
三个点之前的质心和现在的质心距离:15.076857795406966
三个点之前的质心和现在的质心距离:42.59620276776667
第7次
三个点之前的质心和现在的质心距离:36.7751709217284
三个点之前的质心和现在的质心距离:15.873333735074496
三个点之前的质心和现在的质心距离:23.469882661161705
第8次
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0
第9次
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0
第10次
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0
三个点之前的质心和现在的质心距离:0.0

  这里设置了总共迭代10次,可以看到在迭代到第八次的时候就找到了最优的质点,如图所示:

 

那么,以上就是对于k-means算法的一个简单实现,如果有任何问题,欢迎留言。

到此这篇关于利用python实现聚类分析 - K-means的文章就介绍到这了,更多相关python K-means聚类分析内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用python实现聚类分析K-means算法的详细过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中实现k-means聚类算法详解

算法优缺点:优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。 1.首先我们需要
2022-06-04

python利用K-Means算法实现对数据的聚类案例详解

目的是为了检测出采集数据中的异常值。所以很明确,这种情况下的簇为2:正常数据和异常数据两大类 1、安装相应的库import matplotlib.pyplot as plt # 用于可视化 from sklearn.cluster imp
2022-06-02

K-means聚类算法介绍与利用python实现的代码示例

聚类 今天说K-means聚类算法,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别。 分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时
2022-06-04

如何使用Python语言实现K-Means聚类算法

这篇文章给大家分享的是有关如何使用Python语言实现K-Means聚类算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 概述1.1 无监督学习 在一个典型的监督学习中,我们有一个有标签的训练集,我
2023-06-26

如何用K-means算法的Java实现聚类分析681个三国武将

如何用K-means算法的Java实现聚类分析681个三国武将,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,k-means算法介绍:k-means算法接受输入量 k ;然后
2023-06-17

Python实现K-means聚类算法并可视化生成动图步骤详解

K-means算法介绍 简单来说,K-means算法是一种无监督算法,不需要事先对数据集打上标签,即ground-truth,也可以对数据集进行分类,并且可以指定类别数目 牧师-村民模型 K-means 有一个著名的解释:牧师—村民模型:有
2022-06-02

如何利用python的KMeans和PCA包实现聚类算法

如何利用python的KMeans和PCA包实现聚类算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。题目: 通过给出的驾驶员行为数据(trip.csv),对驾
2023-06-02

Python利用scikit-learn实现近邻算法分类的示例详解

scikit-learn已经封装好很多数据挖掘的算法,这篇文章就来用scikit-learn实现近邻算法分类,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录