k-means算法简介

2023-11-14

k-means算法简介

一.什么是k-means

我们假设有这样一个场景。有一大堆硬币毫无任何规则的散落在那里,你事先并不知道这些硬币都是哪个国家的硬币。但是你却想按照国家对这些硬币进行分门别类。该怎么办?

这个时候就需要k-means算法的支持。回到上述例子,我们首先事先并不知道有哪些类别的硬币,即:并不知道目标值是什么,所以k-means算法是一种无监督的学习方式。同时,把不同国家队硬币分门别类,故,这是一种分类算法。“物以类聚,币以国分”,所以k-means这种算法又是“聚类”算法的一种。

二.k-means算法的步骤

k-means算法有如下步骤:

  • step1、随机设置K个特征空间内的点作为初始的聚类中心点。说到这里,应该能想到:这个K是一个超参数,需要自己指定。如果不好拿捏,那么可以运用交叉验证和网格搜索的方式进行处理。

  • step2、对于其他每个点,分别计算到它们到K个中心的距离(即:每个点都要经过k次计算),每个点经过k次计算之后,在这k个计算结果当中选择最近的一个聚类中心点作为标记类别

  • step3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值),并且与旧的中心点作比较

  • step4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

在step2当中,提到了一个名词:中心距离。那么K-means算法当中的这个中心距离是怎么衡量的呢?

与k-近邻算法一样,可以是欧氏距离,可以是曼哈顿距离,也可以是余弦距离。这个也被称为相似度算法,对于这个,不止这三个,具体看:聚类算法第一部分

在这里插入图片描述

其中,A,B代表属性向量。

三.k-means性能评估指标

k-means属于聚类算法的一种,关于聚类算法的评估指标,有不止一种方式,这里,只简单的介绍一些轮廓系数,它的公式如下:

在这里插入图片描述

其他的评估指标,具体见:聚类算法第四部分
对于每个点i为聚类数据中的样本 ,bi 为i 到其它族群的所有样本的距离的最小值,ai为i 到本身簇的距离平均值

最终计算出所有的样本点的轮廓系数平均值。这个值越接近1,说明性能越好,越接近-1,则说明性能越差。k-means所要达到的最终的目的:外部距离(即:不同类别之间的距离)要尽可能的大,但是内部距离(即:相同类别的点之间的距离)要尽可能的小,如下图所示:

在这里插入图片描述

在sklearn中,为我们提供了k-means性能评估指标的API如下:

sklearn.metrics.silhouette_score

sklearn.metrics.silhouette_score(X, labels) #计算所有样本的平均轮廓系数
"""
X:特征值
labels:被聚类标记的目标值
"""

四.k-means的使用

4.1 相关API

sklearn中k-means的api如下:

sklearn.cluster.KMeans

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++) #k-means聚类
"""
n_clusters:开始的聚类中心数量
init:初始化方法,默认为'k-means ++’
labels_:默认标记的类型,可以和真实值比较(不是值比较)
"""

4.2 具体案例

有几个表格,记录了一个商场客户买东西的情况,根据所买东西类别,判断用户类型

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

# 读取四张表的数据
prior = pd.read_csv("./Data/Instacart/order_products__prior.csv")
products = pd.read_csv("./Data/Instacart/products.csv")
orders = pd.read_csv("./Data/Instacart/orders.csv")
aisles = pd.read_csv("./Data/Instacart/aisles.csv")

# 将四张表合并成一个表
_mg = pd.merge(prior,products,on = ['product_id','product_id'])
_mg = pd.merge(_mg,orders, on = ['order_id','order_id'])
mt = pd.merge(_mg,aisles,on = ['aisle_id','aisle_id'])

#交叉表
#将user_id作为列,aisle作为行,形成了一个二维表,这样就把每个用户都买了什么类别的商品展示出来了
cross = pd.crosstab(mt['user_id'],mt['aisle'])

# 主成分分析,先进行降维处理
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
# 减少样本数量
x = data[:500]

# k-means算法,将数据分成四个类别
km = KMeans(n_clusters=4)
km.fit(x)
#预测
predict = km.predict(x) #predict为一个np二维数组,元素值相同的为一类

# 画图
plt.figure(figsize=(20,8),dpi = 80)

# 四个类别分别用四个颜色表示
colors = ['orange','green','blue','purple']
colr = [colors[i] for i in predict]
plt.scatter(x[:,1],x[:,20],color = colr)

plt.show()

# 评估聚类效果,计算轮廓系数
silhouette_score(x, predict)

输出结果如下:
在这里插入图片描述

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

k-means算法简介 的相关文章

  • 如何理解Zookeeper的顺序一致性

    2017饿了么做异地多活 我的团队承担Zookeeper的异地多活改造 在此期间我听到2种不同的关于一致性的说法 一种说法是Zookeeper是最终一致性 因为由于多副本 以及保证大多数成功的Zab协议 当一个客户端进程写入一个新值 另外一
  • OpenCV代码提取:erode函数的实现

    Morphological Operations A set of operations that process images based on shapes Morphological operations apply a struct

随机推荐

  • 备战电赛,该如何学习

    距2023年电赛 全称 全国大学生电子设计竞赛 只有二个月的时间了 今年是国赛通道 作为A类级竞赛 很多电子类专业的学生 以及非电子类专业的学生都想去参加 但是它的门槛有很高 很多大一的学生参加电赛只是为了获得体验感 当然你也可以抱学长的大
  • leetcode刷题(10.15总结)

    1 2的幂 题目描述 https leetcode cn problems power of two class Solution def isPowerOfTwo self n int gt bool return n gt 0 and
  • 部署elasticsearch集群

    创建es集群 编写一个docker compose yaml文件 内容如下 version 2 2 services es01 image elasticsearch 7 12 1 container name es01 environme
  • Android Studio中BitmapDrawable的使用2-1

    1 Drawable Android Studio中的Drawable叫做可绘制资源 指的是可以在屏幕上绘制的图形 Drawable资源分为BitmapDrawable 可绘制的位图文件 NinePatchDrawable 可绘制的九宫格文
  • 牛客网mysql刷题记录

    牛客网mysql刷题记录 SQL26 计算25岁以上和以下的用户数量 if expression A B select if age lt 25 or age is null 25岁以下 25岁及以上 as age cut count u
  • 云计算基础——期末大作业

    1 例举出目前云服务提供商最常用的云计算安全架 并说明其安全策略和安全机制 1 云计算安全框架中的模块组成及功能架构必须有图例说明 配以文字说明 2 云计算安全策略的一般应用的原则和针对性的问题 举例一个案例进行具体论述 3 云计算的安全机
  • 使用Python,OpenCV进行图像平移转换

    使用Python OpenCV进行图像平移转换 1 效果图 2 原理 3 源码 参考 这篇博客将介绍如何使用Python OpenCV对图像进行平移转换 平移是图像沿x轴和y轴的移动 使用平移 可以将图像上下左右移动 以及上述任意组合 要使
  • ESP8266引脚参考详解

    ESP8266引脚参考详解 ESP8266 ESP12 E芯片自带17个GPIO管脚 并不是所有的gpio在所有的ESP8266开发板中都是公开的 有些gpio不推荐使用 有些gpio有非常具体的功能 通过本指南 您将学习如何正确使用ESP
  • RxJava之PublishSubject、BehaviorSubject、ReplaySubject和AsyncSubject

    public class T2 subject 是一个神奇的对象 它可以是一个Observable同时也可以是一个Observer 它作为连接这两个世界的一座桥梁 一个主题可以订阅一个Observable 就像一个观察者 并且它可以发射新的
  • SpringBoot整合WebSocket实现后端向前端发送消息

    目录 一 什么是 websocket 接口 二 适用场景 三 示例代码 3 1 添加pom xml依赖 3 2 创建WebSokcet配置类 3 3 创建测试发送消息接口 3 4 测试webSocket http www jsons cn
  • C++三种计时方法pcl::console::TicToc

    目录 一 clock 二 gettimeofday 三 pcl console TicToc time Windows 10 VM Ware 16 Ubuntu 20 04 Ubuntu环境下测试了两种测量代码运行时间的函数 二者精度接近
  • bash: ip: command not found

    问题 想进入docker容器中ip addr查看ip地址 提示bash ip command not found 解决 bash ip command not found的主要原因是 当前环境下载Centos基础镜像只包含简单的操作系统 相
  • Android之 弹框总结

    一 简介 1 1 弹框即浮与页面之上的窗口 如键盘弹框 吐司弹框 确认弹框 下拉选择框 应用悬浮框等 1 2 弹框控件也很多 比如常用的Spinner Dialog Toast PopWindow等 以及新增的SnackBar Dialog
  • 如何使用Python中的异常处理机制来捕获和处理除零错误

    定义一个除法函数 用于演示异常处理 def divide x y try result x y except ZeroDivisionError print 错误 除数不能为零 else print 结果为 result finally p
  • 软件测试拿了几个20K offer,分享一波面经

    1 你的测试职业发展是什么 测试经验越多 测试能力越高 所以我的职业发展是需要时间积累的 一步步向着高级测试工程师奔去 而且我也有初步的职业规划 前3年积累测试经验 按如何做好测试工程师的要点去要求自己 不断更新自己改正自己 做好测试任务
  • llama/llama2论文解读

    llama 摘要 llama在约1 4T的token上 训练出参数量7B到65B的模型 其模型规模如下 在仅使用开源数据集的情况下 llama 13B在多数benchmarks上与GPT 3效果相当 llama 65B也与最好的模型 Chi
  • MySQL多表查询与事务的操作

    目录 1 表连接查询 1 1 多表查询的概念 1 2 内连接 1 3 外连接 2 子查询 3 事务 1 表连接查询 1 1 多表查询的概念 所需要的查询结果在多张不同的表中 因此需要用到多表查询 多表查询分为 内连接和外连接 内连接包含 隐
  • 二叉树遍历(递归实现前序/中序/后序遍历)

    1 准备工作 我们先定义一棵普通的二叉树 如下图 2 前序遍历 通过递归进行遍历 如果二叉树为空 则操作返回 如果非空 否则从根结点开始 然后遍历左子树 再遍历右子树 前序遍历的结果是 ABDGHEICFJK 为什么会遍历出这种结果 请看上
  • %d,%ld,%lld的区别

    在代码printf打印的时候我们经常会遇到 printf d xxx printf ld xxx printf lld xxx 那么在什么时候使用 d ld lld呢 d int ld long lld long long 在32位编译器上
  • k-means算法简介

    k means算法简介 文章目录 k means算法简介 一 什么是k means 二 k means算法的步骤 三 k means性能评估指标 四 k means的使用 4 1 相关API 4 2 具体案例 一 什么是k means 我们