一、为什么需要 K-Means?

在监督学习中,我们总把数据写成
(x, y),让模型学习 x → y 的映射。
但现实中很多数据根本没有标签 y,例如:

  • 啤酒:热量、钠含量、酒精度、价格

  • 用户:访问时长、点击次数、消费金额

我们只想知道“这些样本天然能分成几类?”
这就是无监督学习——聚类。
K-Means 就是最经典、最易懂、跑得最快的聚类算法之一。

二、K-Means 的思想

随机撒 k 个“种子”当类中心,
把每个样本分给最近的种子,
再把种子移到新类的中心,
重复直到种子不再动。

三、算法流程图解

  1. 选 k:先决定想聚几类。

  2. 初始化:随机或 k-means++ 选 k 个质心。

  3. 分配:每个样本找最近的质心,形成 k 个簇。

  4. 更新:把每个簇的均值当成新质心。

  5. 收敛:质心移动小于阈值或达到最大迭代次数。

四、Python 实战:啤酒聚类

项目目的:

在没有人工标签的情况下,把 20 种啤酒自动分成若干类别,并告诉你到底分几类最合适

1. 数据准备

我们有一份啤酒数据,只有 4 个数值特征:

表格

啤酒热量(cal)钠(mg)酒精(%)价格($)
A150154.52.3
B100103.01.8
2.读取 & 选特征
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as pltdata = pd.read_table("data.txt", sep=r'\s+', engine='python')
x = data[['calories', 'sodium', 'alcohol', 'cost']]
3.选 k:轮廓系数法

轮廓系数 (Silhouette Coefficient)

  • 每个样本计算:

    • a:到同簇其它点的平均距离

    • b:到最近外簇的平均距离

    • s = (b - a) / max(a, b)

  • 取值范围:[-1, 1]

    • ≈ 1:聚得紧凑且远离它簇

    • ≈ 0:边界模糊

    • < 0:可能分错了簇

用平均轮廓系数挑 k

# 1. 准备一个空列表,用来存放不同 k 值对应的轮廓系数
scores = []# 2. 依次尝试 k=2,3,...,9,看看聚成几类效果最好
for k in range(2, 10):# 2-1 用当前 k 值做 K-Means 聚类#     random_state=42 保证结果可重复labels = KMeans(n_clusters=k, random_state=42).fit(x).labels_# 2-2 计算聚类结果的平均轮廓系数(-1~1,越大越紧凑)scores.append(silhouette_score(x, labels))# 3. 把 k 与对应的轮廓系数画成折线图,方便肉眼找“峰值”
plt.plot(range(2, 10), scores, marker='o')# 4. 给图加上坐标轴和标题
plt.xlabel("k")                    # 横轴:聚类个数
plt.ylabel("Silhouette Score")     # 纵轴:平均轮廓系数
plt.title("选择最佳 k")             # 图标题
plt.show()                         # 显示图形

规则:选“峰值”对应的 k。

k=2  → 0.69  ← 最高 
k=3  → 0.67   
k=4  → 0.65

那么 k=2 最合适。

④ 正式聚类 & 结果保存

k-means算法中的重要参数:

参数作用常用值
n_clusters类个数根据业务或轮廓系数
init质心初始化'k-means++'(默认)更快更稳
n_init随机初始化跑几次10(默认)
random_state复现实验任意整数
best_k = 2
km = KMeans(n_clusters=best_k, init='k-means++', n_init=10, random_state=42)
data['cluster'] = km.fit_predict(x)
print(data.head())

现在每一行都了一个标签 cluster = 0 1后续可以做市场细分、推荐策略等。

具体如图所示:

20种啤酒被聚类成 0,1两类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95089.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95089.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95089.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security自动处理/login请求,后端控制层没有 @PostMapping(“/login“) 这样的 Controller 方法

一&#xff1a;前言 &#xff08;1&#xff09;Spring Security概念&#xff1a; Spring Security 是属于 Spring 生态下一个功能强大且高度可定制的认证和授权框架&#xff0c;它不仅限于 Web 应用程序的安全性&#xff0c;也可以用于保护任何类型的应用程序。 &#xff08…

idea开发工具中git如何忽略编译文件build、gradle的文件?

idea开发工具中&#xff1a; git显示下面这个文件有变更&#xff1a; ~/Documents/wwwroot-dev/wlxl-backend/java/hyh-apis/hyh-apis-springboot/build/resources/main/mapping/AccountRealnameMapper.xml 我git的根路径是&#xff1a; ~/Documents/wwwroot-dev/wlxl-backend/…

状态机浅析

状态机是处理状态依赖型行为的高效工具&#xff0c;通过结构化建模状态转换&#xff0c;解决了传统条件判断的冗余和混乱问题。它在设备控制、流程管理、协议解析等场景中表现优异&#xff0c;核心优势在于逻辑清晰、可扩展性强和易于调试。 一、介绍 1. 概念 状态机&#x…

Windows 手动病毒排查指南:不依赖杀毒软件的系统安全防护

Windows 手动病毒排查指南&#xff1a;不依赖杀毒软件的系统安全防护 在数字时代&#xff0c;电脑病毒就像潜伏的"网络幽灵"&#xff0c;从窃取隐私的木马到消耗资源的蠕虫&#xff0c;时刻威胁着系统安全。当杀毒软件失效或遭遇新型威胁时&#xff0c;手动排查病毒便…

GPT-5 is here

GPT-5 is here https://openai.com/index/introducing-gpt-5/ — and it’s #1 across the board! #1 in Text, WebDev, and Vision Arena #1 in Hard Prompts, Coding, Math, Creativity, Long Queries, and more Tested under the codename “summit”, GPT-5 now holds the …

【华为机试】55. 跳跃游戏

文章目录55. 跳跃游戏题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路一、问题本质与建模二、方法总览与选择三、贪心算法的正确性&#xff08;直观解释 循环不变式&#xff09;四、反向贪心&#xff1a;等价但有启发的视角五、与动态规划的对比与误区…

RabbitMQ面试精讲 Day 18:内存与磁盘优化配置

【RabbitMQ面试精讲 Day 18】内存与磁盘优化配置 开篇&#xff1a;内存与磁盘优化的重要性 欢迎来到"RabbitMQ面试精讲"系列的第18天&#xff01;今天我们将深入探讨RabbitMQ的内存与磁盘优化配置&#xff0c;这是面试中经常被问及的高频主题&#xff0c;也是生产环…

【C++】string 的特性和使用

Ciallo&#xff5e; (∠・ω< )⌒★ string&#xff08;1&#xff09;1. 构造函数1.1 string();1.2 string(const char* s);1.3 string(const string& str);1.4 string(size_t n, char c);1.5 string(const string& str, size_t pos, size_t len npos);1.6 string(…

创始人IP的精神修炼:于成长中积蓄力量

IP 经济席卷之下&#xff0c;众多企业家常被 “是否入局 IP”“能否做好 IP” 的焦虑裹挟。这种潜藏的精神内耗&#xff0c;对企业根基的侵蚀往往胜过业绩的起伏。著名文化学者于丹在全球创始人 IP 领袖高峰论坛上的洞见&#xff0c;为创始人 IP 的精神成长照亮了前路&#xff…

gbase8s数据库中对象元数据查询

最近整理了gbase8s数据库中常见的元数据的查询&#xff0c;包括表、视图、序列、包、类型、触发器、plsql等等&#xff0c;仅供参考。set environment sqlmode oracle; drop package DBMS_METADATA; create or replace package DBMS_METADATA is function GET_DDL(objtype varc…

常用hook钩子函数

爬虫Hook技术常用字段和勾子函数 目录 Hook技术概述网络请求相关Hook浏览器环境HookJavaScript引擎Hook加密算法Hook反爬虫检测Hook实际应用示例Hook工具和框架 Hook技术概述 Hook&#xff08;钩子&#xff09;技术是一种在程序运行时拦截和修改函数调用的技术。在爬虫中&a…

【解决方法】华为电脑的亮度调节失灵

华为电脑的亮度调节失灵 参考文章&#xff1a; 华为电脑屏幕亮度怎么调不了&#xff1f;华为电脑调节亮度没反应解决教程 亲测&#xff0c;在控制面板中卸载HWOSD&#xff0c;再重装有用。

【软考中级网络工程师】知识点之 DCC 深度剖析

目录一、DCC 是什么1.1 定义阐述1.2 作用讲解二、DCC 工作原理2.1 拨号触发机制2.1.1 感兴趣流量定义2.1.2 触发拨号过程2.2 链路建立流程2.2.1 物理链路连接2.2.2 数据链路层协议协商三、DCC 配置要点3.1 基础配置步骤3.1.1 接口配置3.1.2 拨号映射配置3.2 高级配置参数3.2.1 …

W5500之Socket寄存器区介绍

W5500之Socket寄存器区介绍1)、Socket n模式寄存器(Socket n Mode Register&#xff0c;简写Sn_MR)偏移地址为0x0000&#xff0c;可读写&#xff0c;复位值为0x00&#xff1b;Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0MULTI/MFENBCASTBND/MC/MMBUCASTB/MIP6BP3P2P1P0MULTI/MFEN占用“S…

酉矩阵(Unitary Matrix)和随机矩阵

先讨论酉矩阵&#xff08;Unitary Matrix&#xff09;的性质。1. 酉矩阵定义酉矩阵&#xff08;Unitary Matrix&#xff09;是复数域上的方阵&#xff0c;满足以下条件&#xff1a;其中&#xff1a;是 的共轭转置&#xff08;即 Hermitian 转置&#xff0c; &#xff09;。是单…

「iOS」————单例与代理

iOS学习单例代理代理模式的原理代理的循环引用设计模式单例 优点&#xff1a; 全局访问&#xff1a;单例模式确保一个类只有一个实例&#xff0c;并提供全局访问点&#xff0c;方便在整个应用中共享数据或功能。节省资源&#xff1a;由于只创建一个实例&#xff0c;可以减少内…

Microsoft Dynamics AX 性能优化解决方案

一、方案背景Microsoft Dynamics AX 是功能强大的企业ERP系统&#xff0c;虽然Microsoft 已推出基于云的现代化 ERP 平台 Dynamics 365 Finance and Operations&#xff0c;提供了更高的性能和持续更新&#xff0c;用来替代Dynamics AX。在考虑升级到Dynamics 365之前&#xff…

ARM保留的标准中断处理程序入口和外设中断处理程序入口介绍

在ARM架构中&#xff0c;中断处理是一个关键机制&#xff0c;它允许CPU在执行主程序时能够响应外部或内部的事件。对于ARM MCU&#xff08;微控制器单元&#xff09;而言&#xff0c;中断处理程序入口通常分为两类&#xff1a;ARM保留的标准中断处理程序入口和外设中断处理程序…

防火墙环境下的全网服务器数据自动化备份平台搭建:基于 rsync 的完整实施指南

一、项目总览 1.内容介绍 本文以 3 台 CentOS 7.9 服务器&#xff08;Web 服务器、NFS 服务器、备份服务器&#xff09;为载体&#xff0c;详解如何在全防火墙开启的前提下&#xff0c;搭建一套自动化数据备份平台&#xff1a;每日自动打包 Web 站点、NFS 共享数据及系统关键…

Spring之【Import】

目录 Import注解 源码分析 使用示例 ImportSelector 源码分析 使用示例 DeferredImportSelector 源码分析 使用示例 ImportBeanDefinitionRegistrar 源码分析 使用示例 Import注解 源码分析 处理组件类上的Import注解 将Import引入类对应的BeanDefinition对象添加…