机器学习之非监督学习(四)K-means 聚类算法

机器学习之非监督学习(一)K-means 聚类算法

  • 0. 文章传送
  • 1.非监督学习定义
  • 2.非监督学习分类
    • 2.1 聚类 Clustering
    • 2.2 异常检测 Anomaly Detection
  • 3.K-means聚类算法 K-means clustering
    • 案例引入
    • 算法步骤
    • 算法优化
      • 成本函数
      • 初始化方法
      • K的选择
    • 代码实现
  • 4.案例实战:图像压缩

0. 文章传送

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]
机器学习之监督学习(二)二元逻辑回归
机器学习之监督学习(三)神经网络基础
机器学习之实战篇——预测二手房房价(线性回归)
机器学习之实战篇——肿瘤良性/恶性分类器(二元逻辑回归)
机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
机器学习之监督学习(四)决策树和随机森林

1.非监督学习定义

非监督学习是一种机器学习方法,在这种方法中,模型在没有预先标记的数据的情况下进行训练。相较于监督学习(需要提供输入和对应的输出标签),非监督学习仅依赖输入数据自身的结构来发现数据内部的模式和关系。


2.非监督学习分类

2.1 聚类 Clustering

聚类的目标是将数据集划分成多个组(或簇),使得簇内的数据点彼此相似,而不同簇的数据点差异较大。常见的聚类算法有 K 均值聚类(K-Means)、层次聚类和 DBSCAN 等。

2.2 异常检测 Anomaly Detection

异常检测的目标是识别数据集中与大多数数据点显著不同的异常数据点。异常检测在网络安全、金融欺诈检测等领域有广泛应用。常见的方法有孤立森林(Isolation Forest)和基于密度的检测方法等。


3.K-means聚类算法 K-means clustering

案例引入

在购买衣物时,我们通常根据自己的身高和体重来选择合适尺码的衣服,常见的衣服衣服型号标法为小(S)、中(M)、大(L)。假设某衣服生产商收集了一些用户身高和体重的数据,如果要根据这些数据点划分三个类别,该如何实现最优划分呢?这便是典型的聚类问题,如下图所示,三个圈代表三种型号,将无标签的数据划分为三个类别。下面介绍处理聚类问题的K-means算法。
在这里插入图片描述

算法步骤

K-means聚类算法步骤如下:

  1. randomly generate cluster centroids 随机产生簇心
  2. assign each point to its closest centroid 将点分配到最近的簇中
  3. recompute the centroids 重新计算簇心 (簇内的中心点)
  4. repeat step2 and step3 重复步骤2和步骤3直至簇心不再移动(或点所处簇不再改变)

在这里插入图片描述
从上面的动图可以很直观地理解算法的思想,需要注意的是,起始点选择不同,聚类的结果也不同。

用数学语言表示如下:
m 个数据, n 个特征, m 个数据分别记为 x ( 1 ) 、 x ( 2 ) 、 . . . 、 x ( m ) ,每个数据为 n 维向量 m个数据,n个特征,m个数据分别记为x^{(1)}、x^{(2)}、...、x^{(m)},每个数据为n维向量 m个数据,n个特征,m个数据分别记为x(1)x(2)...x(m),每个数据为n维向量

目标 : 将数据分为 K 部分 , 划分结果保存在 m × 1 列向量 c 中 目标:将数据分为K部分,划分结果保存在m\times1列向量c中 目标:将数据分为K部分,划分结果保存在m×1列向量c

S t e p 1 : 随机初始化 K 个簇心 μ 1 、 μ 2 、 . . . 、 μ K Step1:随机初始化K个簇心\mu_1、\mu_2、...、\mu_K Step1:随机初始化K个簇心μ1μ2...μK

S t e p 2 : 重复 c ( i ) = arg min ⁡ k ∣ ∣ x ( i ) − μ k ∣ ∣ Step2:重复 \quad c^{(i)}=\argmin_{k}||x^{(i)}-\mu{_k}|| Step2:重复c(i)=argmink∣∣x(i)μk∣∣

S t e p 3 : μ k = a v e r a g e ( x ( i ) ) ∣ c ( i ) = k Step3: \mu_k=average(x^{(i)})|c^{(i)}=k Step3:μk=average(x(i))c(i)=k

S t e p 4 : 重复 S t e p 2 和 S t e p 3 Step4:重复Step2和Step3 Step4:重复Step2Step3

注意:在训练过程中,可能出现某一簇(或多)内无点的情况,结果产生K-1(>1)簇。此时可以更改决策方案,或者如果希望目标结果必须产生K个簇,那么可以更改起始簇心位置再次进行聚类。

算法优化

成本函数

既然初始簇心选择不同会导致聚类结果不同,那么如何评估聚类效果并选择最优方案。设计优化函数,首先需要先定义成本函数:
J ( c ( 1 ) , . . . , c ( m ) , μ 1 、 . . . 、 μ K ) = 1 m ∑ i = 1 m ∣ ∣ x ( i ) − μ c ( i ) ∣ ∣ 2 J(c^{(1)},...,c^{(m)},\mu_{1}、...、\mu_{K})=\frac{1}{m}\sum_{i=1}^{m}||x^{(i)}-\mu_{c^{(i)}}||^2 J(c(1),...,c(m),μ1...μK)=m1i=1m∣∣x(i)μc(i)2

由于聚类结果的具体表现是各个簇心的位置以及每个数据被归类情况,因此J包含了上面所示的m+K个参数。这里的成本函数是平均每个数据点到所处簇心距离的平方。再回过头看上面的算法步骤,我们发现算法实际上就是不断减少J的过程:

Step 2 : fix μ \mu μ,assign c c c to minimize J(固定簇心位置,分配每个数据点给最近的簇心,下降J)

Step 3 : fix c,shift μ \mu μ to minimize J(固定每个数据点所属簇,中心化簇心位置,下降J)

In theory : J keep going down and converge(理论上,J不断下降直至收敛)

有了成本函数,我们就可以采用蒙特卡罗思想,进行多次试验,不同初始化得到的最终结果存在差异,挑选cost最小的作为最优方案。

初始化方法

还有一个问题需要解决,如何随机初始化簇心?下面是几种随机初始化方法:

随机选择数据点
方法:从数据集中随机选择 K 个数据点作为初始簇心。
优点:简单易行,快速实现。
缺点:可能会选择到极端点,导致不良结果。

分布式初始化
方法:将数据空间划分为 K 个区域,然后从每个区域中随机选择一个数据点作为簇心。
优点:可以确保簇心的初始位置分散,避免集中在某一部分数据上。

K-means++
方法:在选择每个新的簇心时,使得新簇心与已有簇心的距离尽可能远。具体步骤如下:
随机选择一个数据点作为第一个簇心。
对于每个数据点,计算其与已选择簇心的最小距离。
根据这些距离的平方(即 D(x)^2)进行概率选择,选择下一个簇心。
重复步骤 2 和 3 直到选择到 K 个簇心。
优点:能显著提高聚类效果,通常收敛速度更快,得到的结果更稳定。

注: 关于概率选择,可以使用numpy.random中的choice函数,示例:

next_center = np.random.choice(X, p=probabilities)

K的选择

有时候我们并不能提前根据数据点的分布确定聚类的类别数量K,或者对K的选择没有什么思路,以下是关于K的一些选择策略和解释:

肘部法 elbow method :
方法:通过绘制K-J曲线,选择合适的K(下降变化速率发生突变的临界K值)
弊端:不适用于平滑下降的曲线
在这里插入图片描述

除了上面的技术方法,考虑实际业务需求和可解释性也非常重要。例如:

  • 市场需求:根据市场调研和客户反馈,了解消费者对不同型号的需求。这可以帮助你决定是否需要更多的细分(即更多的聚类)或者更简单的分类(即更少的聚类)。
  • 生产和库存管理:更多的型号意味着更复杂的生产和库存管理。评估你的生产能力和库存管理能力,确定是否能有效管理更多的型号。
  • 可解释性:更多的聚类可能导致更难解释每个型号的特点,特别是对销售和市场团队而言。确保每个聚类(型号)都能被清晰地描述和定位。

代码实现

K-means算法每个步骤函数以及最后整合的完整如下,

import numpy as np
import matplotlib.pyplot as plt# 计算每个数据点所归属的簇
def find_closest_centroids(X, centroids):K = centroids.shape[0]m = X.shape[0]idx = np.zeros(m, dtype=int)for i in range(m):idx[i] = np.argmin(np.sum((X[i] - centroids) ** 2, axis=1))return idx# 根据当前分类情况计算新的簇心
def compute_centroids(X, idx, K):m, n = X.shapecentroids = np.zeros((K, n))for k in range(K):cond = (idx == k)if cond.any():X_k = X[cond]centroids[k] = np.mean(X_k, axis=0)else:  # 如果没有点被分配到这个簇,则随机选择一个点作为新的簇心centroids[k] = X[np.random.choice(X.shape[0])]return centroids# 随机初始化簇心
def kMeans_init_centroids(X, K):randidx = np.random.permutation(X.shape[0])centroids = X[randidx[:K]]return centroids# 成本函数
def KMeans_compute_cost(X, centroids, idx):m = X.shape[0]cost = 0for i in range(m):K_idx = idx[i]X_centroid = centroids[K_idx]cost += np.sum((X_centroid - X[i]) ** 2)return cost / m# 运行 K-means 聚类算法
def run_kMeans(X, K, max_iters=10, test_times=50):m, n = X.shapemin_cost = float('inf')best_idx = np.zeros(m)best_centroids = np.zeros((K, n))for j in range(test_times):print(f'K-Means test {j}/{test_times - 1}:')initial_centroids = kMeans_init_centroids(X, K)centroids = initial_centroidsfor i in range(max_iters):print(f'K-Means iteration {i}/{max_iters - 1}', end=', ')idx = find_closest_centroids(X, centroids)centroids = compute_centroids(X, idx, K)cost = KMeans_compute_cost(X, centroids, idx)if cost < min_cost:min_cost = costbest_idx = idxbest_centroids = centroidsprint(f'cost: {cost}, min_cost: {min_cost}')return best_centroids, best_idx

为了验证代码正确性和性能,随机在平面内三个点附近生成一系列点,构成试验数据集,并运行聚类算法最后可视化

# 生成数据集
def generate_data():np.random.seed(42)cluster1 = np.random.randn(100, 2) + np.array([1, 1])cluster2 = np.random.randn(100, 2) + np.array([5, 5])cluster3 = np.random.randn(100, 2) + np.array([9, 1])return np.vstack((cluster1, cluster2, cluster3))# 可视化数据和聚类结果
def visualize(X, centroids, idx):plt.figure(figsize=(8, 6))K = centroids.shape[0]# 绘制数据点for k in range(K):plt.scatter(X[idx == k, 0], X[idx == k, 1], label=f'Cluster {k + 1}')# 绘制簇心plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='X', label='Centroids')plt.title('K-means Clustering')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()plt.show()# 主函数
if __name__ == "__main__":# 生成数据集X = generate_data()# 设置簇的数量K = 3max_iters = 10test_times = 50# 运行 K-means 聚类best_centroids, best_idx = run_kMeans(X, K, max_iters, test_times)# 可视化结果visualize(X, best_centroids, best_idx)

实验结果:可以看到聚类效果很好,三个簇心几乎与数据集构建的三个起始点重合。
在这里插入图片描述

4.案例实战:图像压缩

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

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

相关文章

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

learn C++ NO.17——继承

什么是继承&#xff1f; 用冒号 : 后跟基类名称来声明一个类是从某个基类继承而来的。继承方式可以是 public、protected 或 private&#xff0c;这决定了基类成员在子类中的访问权限。 下面通过代码简单进行一下演示. 派生类Student即子类&#xff0c;而基类Person是它的父…

Ubuntu22.04安装paddle

查看系统版本信息 使用命令lsb_release -a查看系统版本 rootLAIS01:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy查看系统支持的cuda版本&#xff0c;使用命令nvidia-smi&#…

基于paddleocr的批量图片缩放识别

说明 在进行ocr文字识别的时候&#xff0c;有时候我们需要使用批量测试的功能&#xff0c;但是有些图片会识别失败或者个别根本识别不出来&#xff0c;这时候我们可以通过对原图片进行缩放&#xff0c;提高图像的分辨率&#xff0c;然后再次识别&#xff0c;这样可以大大提高图…

Canal+RabbitMQ数据同步环境配置

Canal 是阿里巴巴开发的开源工具&#xff0c;主要用于解析 MySQL 的 binlog 日志&#xff0c;从而实现数据同步。Canal 会模拟 MySQL 从库的协议&#xff0c;订阅主库的 binlog&#xff0c;从而获取数据库的变更信息。 将 Canal 解析到的 MySQL 数据库变更消息通过 RabbitMQ 分…

青柠视频云——视频丢包(卡顿、花屏、绿屏)排查

一、问题说明 近期有客户反馈&#xff0c;接入平台的设备经常出来卡顿、花屏、录屏的情况&#xff0c;出现这样的场景很是尴尬。 客户是私有化部署在公网环境&#xff0c;于是我们联系客户&#xff0c;对问题进行追踪排查。 二、场景复现 我们现场情况确认的过程中&#xff0c;…

蓝桥杯嵌入式客观题合集

十四届模拟赛二客观题 解析&#xff1a;STM32微控制器的I/O端口寄存器必须按32位字被访问 解析&#xff1a;微分电路能将三角波转换为方波&#xff1b;积分电路能将方波转换为三角波 解析&#xff1a;放大电路的本质是能量的控制与转换 解析&#xff1a;具有n个节点&#xff0c…

修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)

随着Docker技术的广泛应用&#xff0c;它极大地简化了复杂项目的部署与维护流程&#xff0c;仅凭单一镜像即可轻松运行。然而&#xff0c;随着数据量不断增长&#xff0c;Docker的默认数据存储方式可能逐渐成为挑战&#xff0c;尤其是当默认安装于根目录&#xff08;“/”&…

【雪球-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Python酷库之旅-第三方库Pandas(104)

目录 一、用法精讲 451、pandas.DataFrame.pow方法 451-1、语法 451-2、参数 451-3、功能 451-4、返回值 451-5、说明 451-6、用法 451-6-1、数据准备 451-6-2、代码示例 451-6-3、结果输出 452、pandas.DataFrame.dot方法 452-1、语法 452-2、参数 452-3、功能…

【C++】STL简介

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;STL || C 目录 前言什么是STL&#xff1f;STL的历史STL的版本STL六大组件STL的优缺点STL的优点&#xff1a;STL的缺点&#xff1a; 如何学习STL结语 前言 本篇博客主要内容&#xff1a;ST…

灾备技术演进之路 | 虚拟化无代理备份只能挂载验证和容灾吗?只能无代理恢复吗?且看科力锐升级方案

灾备技术演进之路系列 虚拟化备份技术演进 摆脱束缚&#xff0c;加速前行 无代理备份仅能挂载/恢复验证吗&#xff1f; ——科力锐极简验证演练无代理备份来了 无代理备份无法应对平台级故障吗&#xff1f; ——科力锐应急接管无代理备份来了 无代理备份仅能同平台挂载吗&a…

Llama 3.1 Omni:颠覆性的文本与语音双输出模型

你可能听说过不少关于语言模型的进展,但如果告诉你,有一种模型不仅能生成文本,还能同时生成语音,你会不会觉得特别酷?今天咱们就来聊聊一个相当前沿的项目——Llama 3.1 Omni模型。这个模型打破了传统的文字生成边界,直接让文本和语音同时输出,实现了真正的"多模态…

无人机之AI跟踪篇

无人机的AI识别技术依托于计算机视觉和深度学习技术&#xff0c;实现了对目标的快速精准识别&#xff0c;在多个领域展现出了巨大的应用潜力和价值。以下是对无人机AI识别技术的详细解析&#xff1a; 一、无人机AI识别算法的基础原理 无人机AI识别算法主要基于先进的计算机视觉…

轻松解决Jetpack Compose中的一些痛点问题

公众号「稀有猿诉」 原文链接 轻松解决Jetpack Compose中的一些痛点问题 暑去秋来&#xff0c;金桂飘香&#xff0c;不知不觉中我们已经练完了『降Compose十八掌』&#xff0c;相信通过这一系列文章能够对Jetpack Compose有足够的理解&#xff0c;并能在实际项目中进行运…

Linux memcg lru lock提升锁性能

目录 内核关于per memcg lru lock的重要提交&#xff1a; 计算虚拟地址转换基本机制 问题背景 swap换入流程 时奎亮的per memcg lru lock分享视频 内核关于per memcg lru lock的重要提交&#xff1a; f9b1038ebccad354256cf84749cbc321b5347497 6168d0da2b479ce25a4647d…

感知笔记:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…

ssm自助购药小程序 LW PPT源码调试讲解

第二章开发技术介绍 此系统的关键技术和架构&#xff0c;Java技术、B/S结构、Ssm框架和Mysql数据库&#xff0c;是本系统的关键开发技术&#xff0c;对系统的整体、数据库、功能模块、系统页面以及系统程序等设计进行了详细的研究与规划。 2.1 系统开发平台 在线自助购药小程…

PMP--二模--解题--1-10

文章目录 4.整合管理--商业文件--商业论证&#xff08;是否值得所需投资、高管们决策的依据&#xff09;反映了&#xff1a;1、 [单选] 收到新项目的客户请求之后&#xff0c;项目经理首先应该做什么&#xff1f; 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确…

大数据概念与价值

文章目录 引言大数据的概念高德纳咨询公司的定义麦肯锡全球研究所的定义什么是大数据&#xff1f; 大数据的特征Volume&#xff08;体积&#xff09;Variety&#xff08;种类&#xff09;Velocity&#xff08;速度&#xff09;Value&#xff08;价值&#xff09;Veracity&#…