K-Means聚类算法

2023-10-31

K-Means聚类算法

​ k-means算法又名k均值算法,K-means算法中的k表示的是聚类的k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个聚类的质心对该簇进行描述。

​ 其算法思想大致为:先从样本集中随机选取k个样本作为簇中心,并计算所有样本与这k个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。

​ 根据以上描述,我们大致可以猜测到实现kmeans算法的主要四点:

  1. 簇个数k的选择
  2. 各个样本点到“簇中心”的距离
  3. 根据新划分的簇,更新“簇中心”
  4. 重复上述2,3过程,直至“簇中心”没有移动

K-means算法步骤详解

1、K值的选择

​ k 的选择一般是按照实际需求进行决定,或在实现算法时直接给定 k 值。

2、距离的确定

将对象点分到距离聚类中心最近的那个簇中需要最近邻的度量策略,在欧式空间中采用的是欧式距离,在处理文档中采用的是余弦相似度函数,有时候也采用曼哈顿距离作为度量,不同的情况实用的度量公式是不同的。

欧式距离:

img

曼哈顿距离:

img

余弦相似度:

A与B表示向量(x1,y1),(x2,y2),分子为A与B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。
img

3、新质心的计算

​ 对于分类后的产生的k个簇,分别计算到簇内其他点距离均值最小的点最为质心(对于拥有坐标的簇可以计算没个簇坐标的均值作为质心)。

4、是否停止K-means

  • 当质心不再改变,或给定loop最大次数loopLimit
  • 当每个簇的质心,不再改变时就可以停止k-menas
  • 当loop次数超过looLimit时,停止k-means
  • 只需要满足两者的其中一个条件,就可以停止k-means
  • 如果Step4没有结束k-means,就再执行step2-step3-step4
  • 如果Step4结束了k-means,则就打印(或绘制)簇以及质心

5、Python代码实现

# -*- codeing = utf-8 -*-
# @Time : 2022/1/14 18:10
# @Author : lcl
# @File : K-means.py
# @Software : PyCharm
import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# 计算欧拉距离
def calcDis(dataSet, centroids, k):
    clalist = []
    for data in dataSet:
        diff = np.tile(data, (k,
                              1)) - centroids  # 相减   (np.tile(a,(2,1))就是把a先沿x轴复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍得到array([[0,1,2],[0,1,2]]))
        squaredDiff = diff ** 2  # 平方
        squaredDist = np.sum(squaredDiff, axis=1)  # 和  (axis=1表示行)
        distance = squaredDist ** 0.5  # 开根号
        clalist.append(distance)
    clalist = np.array(clalist)  # 返回一个每个点到质点的距离len(dateSet)*k的数组
    return clalist


# 计算质心
def classify(dataSet, centroids, k):
    # 计算样本到质心的距离
    clalist = calcDis(dataSet, centroids, k)
    # 分组并计算新的质心
    minDistIndices = np.argmin(clalist, axis=1)  # axis=1 表示求出每行的最小值的下标
    newCentroids = pd.DataFrame(dataSet).groupby(
        minDistIndices).mean()  # DataFramte(dataSet)对DataSet分组,groupby(min)按照min进行统计分类,mean()对分类结果求均值
    newCentroids = newCentroids.values

    # 计算变化量
    changed = newCentroids - centroids

    return changed, newCentroids


# 使用k-means分类
def kmeans(dataSet, k):
    # 随机取质心
    centroids = random.sample(dataSet, k)

    # 更新质心 直到变化量全为0
    changed, newCentroids = classify(dataSet, centroids, k)
    while np.any(changed != 0):
        changed, newCentroids = classify(dataSet, newCentroids, k)

    centroids = sorted(newCentroids.tolist())  # tolist()将矩阵转换成列表 sorted()排序

    # 根据质心计算每个集群
    cluster = []
    clalist = calcDis(dataSet, centroids, k)  # 调用欧拉距离
    minDistIndices = np.argmin(clalist, axis=1)
    for i in range(k):
        cluster.append([])
    for i, j in enumerate(minDistIndices):  # enymerate()可同时遍历索引和遍历元素
        cluster[j].append(dataSet[i])

    return centroids, cluster


# 创建数据集
def createDataSet():
    return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]


if __name__ == '__main__':
    dataset = createDataSet()
    centroids, cluster = kmeans(dataset, 2)
    print('质心为:%s' % centroids)
    print('集群为:%s' % cluster)
    for i in range(len(dataset)):
        plt.scatter(dataset[i][0], dataset[i][1], marker='o', color='green', s=40, label='原始点')
        #  记号形状       颜色      点的大小      设置标签
        for j in range(len(centroids)):
            plt.scatter(centroids[j][0], centroids[j][1], marker='x', color='red', s=50, label='质心')
            plt.show

k-means模型的一种理解思路是,它在每个类蔟的中心放置了一个圈(或者,更高维度超球面),其半径由聚类中最远的点确定。该半径充当训练集中聚类分配的一个硬截断:任何圈外的数据点不被视为该类的成员。我们可以使用以下函数可视化这个聚类模型。

而当数据分布的形状不近似为圆形,这时不应该使用K-means算法聚类,可以使用GMM算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K-Means聚类算法 的相关文章

随机推荐

  • Cellant:中文基站+google地图+轨迹记录+自制基站数据库

    资料名称 Cellant 中文基站 google地图 轨迹记录 自制基站数据库 0 a7Y6 H Z7e 国内领先的通信技术论坛MSCBSC 移动通信论坛6d x0k2 H g4F r j 资料作者 jesperzx k A5t C m t
  • qt中颜色对话框弹出时应用程序输出栏出现QWindowsWindow::setGeometry: Unable to set geometry 180x30+345+311 (frame: 202x8

    引言 在项目中点击按钮 弹出颜色选择对话框 但同时应用程序会在应用程序输出一栏中显示 QWindowsWindow setGeometry Unable to set geometry 180x30 345 311 frame 202x86
  • 创建并运行一个 Spring项目

    创建并运行一个 Spring项目 第一个 Spring 项目 步骤 1 创建一个 spring 项目 1 创建一个 maven 项目 2 添加 spring 框架支持 spring context spring beans 3 配置国内源
  • 手把手教你外排序

    排序总体来说分为两类 数据在内存中的叫做内排序 数据存在磁盘的叫外排序 一般而言 磁盘中存放的都是大型数据 所以 外排序主要是应用于磁盘中大型数据的 一 排序思想 对于外排序而言 因为待排的数据往往远大于内存容量 所以在排序时通常将数据切分
  • 如何在React Native中制作实时SoundCloud波形

    by Pritish Vaidya 通过Pritish Vaidya 如何在React Native中制作实时SoundCloud波形 How to make realtime SoundCloud Waveforms in React N
  • 13个应用案例,讲述最真实的大数据故事!

    大数据目前是当下最火热的词了 你要是不知道大数据这个概念 都不好意思在众人面前开口了 然而实际上很多人都对大数据的应用模糊不清 现在就让我们从下面十三个鲜明的大数据应用案例来了解下最真实的大数据故事 大数据改变的那些行业 大数据目前是当下最
  • DOM0,DOM2,DOM3事件处理方式区别

    引子 文档对象模型是一种与编程语言及平台无关的API Application programming Interface 借助于它 程序能够动态地访问和修改文档内容 结构或显示样式 W3C协会早在1988年就开始了DOM标准的制定 W3C
  • 微信小程序音频录制时bindtouchend不触发 音频录制代码

    问题描述 微信小程序项目 长按录制音频 手松开录制结束 长按时确实可以出发bindtouchstart 但是手松开之后不触发bindtouchend 从网上看很多说把bindtouchend换成bindtouchcancel 但是我这边依然
  • 如何给页面元素添加水印背景,在vue中怎么处理?

    您的三连支持是我创作的动力 这里写一个简单的给页面元素添加水印背景的方法 主要是添加文字行的 步骤1 在canvas中画出这个水印 这里我写的注释很详细了 不会的可以看看canvas的相关api 给一个页面元素添加水印背景 param te
  • Micropython ESP32 tcpserver 把玩【一】

    文章目录 测试TCP通信 解决供电问题 Hello World 传输文本文件 ESP32新建txt文件 ESP32运行的TCP SERVER程序 电脑上运行的TCP CLIENT程序 测试TCP通信 测试代码源自uPyCraft V1 1内
  • 【开启报名】大模型研讨会

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 以下内容来源于THU基础模型 基础模型研究中心 自 2018 年 BERT GPT 等语言模型问世以来 大规模语言模型取得了显著进步 对社会经济发展产生了深远影响 尽管如此 该领
  • jQuery与Ajax 面试题库(长期更新中...)

    jQuery 部分 JavaScript 是客户端脚本的标准语言 而 jQuery 使得编写 JavaScript 更加简单 你可以只用写几行的jQuery 代码就能实现更多的东西 它是最长被用到的 JavaScript 库之一 并且现在已
  • Puppeteer开发过程中遇到的问题及解决方案

    最新出了一个BUG 最新版的安装之后在MacOS M1芯片无法打开新窗口 工欲善其事必先利其器 请先检查本机是否安装NodeJS环境以及查阅API Google官方文档 https developers google com web too
  • Linux svn 命令每次都要输入密码o(╯□╰)o

    环境 Ubuntu 20 04 服务器ssh远程登录 所以运行不了钱包之类的图形工具管理密码 subversion 1 13 验证可行的步骤 1 删除原来的配置 rm subversion rf 2 执行一次svn命令输入密码后 会在目录
  • 为什么int类型可以直接赋值给char类型?

    1 为什么int类型变量不能直接赋值给char类型变量 char a 97 gt a 为char类型变量 a 赋值常量值 97 char b a 3 gt d 97 3 100 ASCII对应的字符为 d char c a 3 gt 报错
  • 入门:使用MySQL Workbench新增MySQL数据库并授权给新用户

    一 新增用户 打开MySQL Workbench可视化工具 点击左侧菜单的 Users and Privileges 链接 再点击右侧界面下方的 Add Account 按钮 输入新用户名 user kagome 主机连接地址 表示从任何地
  • 使用webpack打包的单页面项目如何设置favicon.icon文件

    上一篇文章 如何给网站设置favicon ico图标 介绍了favicon ico是什么 怎么配置 有哪几种方式 但发现webpack打包的单页面项目却与普通项目不同 所以这篇文章介绍一下使用webpack打包的单页面项目如何设置favic
  • 详解nginx服务器绑定域名和设置根目录的方法

    主要介绍了详解nginx服务器绑定域名和设置根目录的方法 nginx服务器绑定域名以及设置根目录非常方便 小 编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 nginx服务器绑定域名以及设置根目录非常方便 首先进入
  • COSCon'20 开源硬件论坛&深圳开源聚会

    COSCon开源硬件论坛 发轫于2018 软硬同台 共享大开源 共生于2019 多元携手 共筑源生态 开源硬件生态的可持续 更需要产业落地前行 今年 在制造业行业固有困难凸显和全球贸易多方遭受冲击的影响下 开源硬件论坛将同大家一起聚焦探索开
  • K-Means聚类算法

    K Means聚类算法 k means算法又名k均值算法 K means算法中的k表示的是聚类的k个簇 means代表取每一个聚类中数据值的均值作为该簇的中心 或者称为质心 即用每一个聚类的质心对该簇进行描述 其算法思想大致为 先从样本集中