利用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聚类分析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    目的是为了检测出采集数据中的异常值.所以很明确,这种情况下的簇为2:正常数据和异常数据两大类 1.安装相应的库 import matplotlib.pyplot as plt # 用于可视化 from sklearn.cluster import KMeans # 用于聚类 import pandas as pd # 用于读取文件 2.实现聚类 2.1 读取数据并可视化 # 读取本地数据文件 df = pd.read_excel("../data/output3.xls", heade

  • python实现k-means聚类算法

    k-means聚类算法 k-means是发现给定数据集的k个簇的算法,也就是将数据集聚合为k类的算法. 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类,我们一般取欧几里得距离 3)重新计算已经得到的各个类的质心 4)迭代步骤(2).(3)直至新的质心与原质心相等或迭代次数大于指定阈值,算法结束 算法实现 随机初始化k个质心,用dict保存质心的值以及被聚类到该簇中的所有data. def initCent(dataSe

  • python 代码实现k-means聚类分析的思路(不使用现成聚类库)

    一.实验目标 1.使用 K-means 模型进行聚类,尝试使用不同的类别个数 K,并分析聚类结果. ​ 2.按照 8:2 的比例随机将数据划分为训练集和测试集,至少尝试 3 个不同的 K 值,并画出不同 K 下 的聚类结果,及不同模型在训练集和测试集上的损失.对结果进行讨论,发现能解释数据的最好的 K 值.二.算法原理 首先确定k,随机选择k个初始点之后所有点根据距离质点的距离进行聚类分析,离某一个质点a相较于其他质点最近的点分配到a的类中,根据每一类mean值更新迭代聚类中心,在迭代完成后分别

  • Python用K-means聚类算法进行客户分群的实现

    一.背景 1.项目描述 你拥有一个超市(Supermarket Mall).通过会员卡,你用有一些关于你的客户的基本数据,如客户ID,年龄,性别,年收入和消费分数. 消费分数是根据客户行为和购买数据等定义的参数分配给客户的. 问题陈述:你拥有这个商场.想要了解怎么样的顾客可以很容易地聚集在一起(目标顾客),以便可以给营销团队以灵感并相应地计划策略. 2.数据描述 字段名 描述 CustomerID 客户编号 Gender 性别 Age 年龄 Annual Income (k$) 年收入,单位为千

  • python基于K-means聚类算法的图像分割

    1 K-means算法 实际上,无论是从算法思想,还是具体实现上,K-means算法是一种很简单的算法.它属于无监督分类,通过按照一定的方式度量样本之间的相似度,通过迭代更新聚类中心,当聚类中心不再移动或移动差值小于阈值时,则就样本分为不同的类别. 1.1 算法思路 随机选取聚类中心 根据当前聚类中心,利用选定的度量方式,分类所有样本点 计算当前每一类的样本点的均值,作为下一次迭代的聚类中心 计算下一次迭代的聚类中心与当前聚类中心的差距 如4中的差距小于给定迭代阈值时,迭代结束.反之,至2继续下

  • python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

    一.分散性聚类(kmeans) 算法流程: 1.选择聚类的个数k. 2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心. 3.对每个点确定其聚类中心点. 4.再计算其聚类新中心. 5.重复以上步骤直到满足收敛要求.(通常就是确定的中心点不再改变. 优点: 1.是解决聚类问题的一种经典算法,简单.快速 2.对处理大数据集,该算法保持可伸缩性和高效率 3.当结果簇是密集的,它的效果较好 缺点 1.在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用 2.必须事先给出k(要生成的簇的数

  • 利用Python如何实现K-means聚类算法

    目录 前言 算法原理 目标函数 算法流程 Python实现 总结 前言 K-Means 是一种非常简单的聚类算法(聚类算法都属于无监督学习).给定固定数量的聚类和输入数据集,该算法试图将数据划分为聚类,使得聚类内部具有较高的相似性,聚类与聚类之间具有较低的相似性. 算法原理 1. 初始化聚类中心,或者在输入数据范围内随机选择,或者使用一些现有的训练样本(推荐) 2. 直到收敛 将每个数据点分配到最近的聚类.点与聚类中心之间的距离是通过欧几里德距离测量得到的. 通过将聚类中心的当前估计值设置为属于

  • 利用C语言实现页面置换算法的详细过程

    目录 操作系统实验 页面置换算法(FIFO.LRU.OPT) 概念: 题目: 代码 总结 操作系统实验 页面置换算法(FIFO.LRU.OPT) 概念: 1.最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面:如无这样的页面存在,则选择最长时间不需要访问的页面.于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率. 2.先进先出置换算法(FIFO):是最简单的页面置换算法.这种算法的基本思想是:当需要淘汰一个页面时,总是选择

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

    K-means算法介绍 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标. 算法过程如下: 1)从N个文档随机选取K个文档作为中心点: 2)对剩余的每个文档测量其到每个中心点的距离,并把它归到最近的质心的类: 3)重新计算已经得到的各个类的中心点: 4)迭代2-3步直至新的质心与原质心相等或小于指定阈值,算法结束. 算法优缺点: 优点: 原理简单 速度

  • python机器学习基础K近邻算法详解KNN

    目录 一.k-近邻算法原理及API 1.k-近邻算法原理 2.k-近邻算法API 3.k-近邻算法特点 二.k-近邻算法案例分析案例信息概述 第一部分:处理数据 1.数据量缩小 2.处理时间 3.进一步处理时间 4.提取并构造时间特征 5.删除无用特征 6.签到数量少于3次的地点,删除 7.提取目标值y 8.数据分割 第二部分:特征工程 标准化 第三部分:进行算法流程 1.算法执行 2.预测结果 3.检验效果 一.k-近邻算法原理及API 1.k-近邻算法原理 如果一个样本在特征空间中的k个最相

  • Python爬取Coursera课程资源的详细过程

    有时候我们需要把一些经典的东西收藏起来,时时回味,而Coursera上的一些课程无疑就是经典之作.Coursera中的大部分完结课程都提供了完整的配套教学资源,包括ppt,视频以及字幕等,离线下来后会非常便于学习.很明显,我们不会去一个文件一个文件的下载,只有傻子才那么干,程序员都是聪明人! 那我们聪明人准备怎么办呢?当然是写一个脚本来批量下载了.首先我们需要分析一下手工下载的流程:登录自己的Coursera账户(有的课程需要我们登录并选课后才能看到相应的资源),在课程资源页面里,找到相应的文件

  • 用Python编写简单的gRPC服务的详细过程

    gRPC 是可以在任何环境中运行的现代开源高性能 RPC 框架.它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证.它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务. 用Python编写简单的gRPC服务 grpc官网python参考:https://www.grpc.io/docs/languages/python/quickstart/ http://grpc.github.io/grpc/python/

  • 基于 Python 实践感知器分类算法

    Perceptron是用于二进制分类任务的线性机器学习算法.它可以被认为是人工神经网络的第一种和最简单的类型之一.绝对不是"深度"学习,而是重要的组成部分.与逻辑回归相似,它可以快速学习两类分类任务在特征空间中的线性分离,尽管与逻辑回归不同,它使用随机梯度下降优化算法学习并且不预测校准概率. 在本教程中,您将发现Perceptron分类机器学习算法.完成本教程后,您将知道: Perceptron分类器是一种线性算法,可以应用于二进制分类任务. 如何使用带有Scikit-Learn的Pe

  • 为什么说Python可以实现所有的算法

    今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万. 这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各种算法的代码实现. 传送门在此: https://github.com/TheAlgorithms/Python 简单介绍下. 算法的基本原理讲解部分,包括排序算法.搜索算法.插值算法.跳跃搜索算法.快速选择算法.禁忌搜索算法.加密算法等. 这部分内容,主要介绍各种不同算法的原理,其中不少介绍还给

  • 利用python数据分析处理进行炒股实战行情

    作为一个新手,你需要以下3个步骤: 1.用户注册 > 2.获取token > 3.调取数据 数据内容: 包含股票.基金.期货.债券.外汇.行业大数据, 同时包括了数字货币行情等区块链数据的全数据品类的金融大数据平台, 为各类金融投资和研究人员提供适用的数据和工具. 1.数据采集 我们进行本地化计算,首先要做的,就是将所需的基础数据采集到本地数据库里 本篇的示例源码采用的数据库是MySQL5.5,数据源是xxx pro接口. 我们现在要取一批特定股票的日线行情 部分代码如下: # 设置xxxxx

  • 利用python汇总统计多张Excel

    为什么越来越多的非程序员白领都开始学习 Python ?他们可能并不是想要学习 Python 去爬取一些网站从而获得酷酷的成就感,而是工作中遇到好多数据分析处理的问题,用 Python 就可以简单高效地解决.本文就通过一个实际的例子来给大家展示一下 Python 是如何应用于实际工作中高效解决复杂问题的. 背景 小明就职于一家户外运动专营公司,他们公司旗下有好多个品牌,并且涉及到很多细分的行业.小明在这家公司任数据分析师,平时都是通过 Excel 来做数据分析的.今天老板丢给他一个任务:下班前筛

随机推荐