机器学习-聚类算法Kmeans【手撕】

聚类算法

在训练时,使用没有标签的数据集进行训练,希望在没有标签的数据里面可以发现潜在的一些结构。
其中使用范围较广的是,聚类算法。聚类算法的目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。比如在商业中,如果我们手头有大量 的当前和潜在客户的信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动,最有名的客户价值判断模型RFM,就常常和聚类分析共同使用。再比如,聚类可以用于降维和矢量量化(vector quantization),可以将高维特征压缩到一列当中,常常用于图像,声音,视频等非结构化数据,可以大幅度压缩数据量。

Kmeans

作为聚类算法的典型代表,KMeans可以说是最简单的聚类算法没有之一。
在聚类算法中,有两个概念非常重要:簇和质心
聚类算法将一组 N N N个样本的特征矩阵 X X X划分为 K K K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。簇中所有数据的均值通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。
Kmeans算法中,步骤可以分为四步:
(1)数据预处理。主要是标准化,异常点过滤
(2)随机选取K个中心,计为 μ 1 ( 0 ) \mu^{(0)}_1 μ1(0), μ 2 ( 0 ) \mu^{(0)}_2 μ2(0),…, μ k ( 0 ) \mu^{(0)}_k μk(0)
(3)定义损失: J ( c , μ ) = m i n ∑ i = 1 M ∣ ∣ x i − μ c i ∣ ∣ 2 J(c,\mu) = min \sum^M_{i=1}||x_i - \mu_{c_i}||^2 J(c,μ)=mini=1M∣∣xiμci2
(4)令 t = 0 , 1 , 2 , . . . , k t=0,1,2,...,k t=0,1,2,...,k为迭代步数,重复如下过程直至 J J J收敛:
(4.1)对于每一个样本 x i x_i xi,将其分配到距离最近的中心: c i t < − a r g m i n ∣ ∣ x i − μ k t ∣ ∣ 2 c^t_i < - argmin||x_i - \mu^t_k||^2 cit<argmin∣∣xiμkt2
(4.2)对于每个类中心点 k k k,重新计算该类的中心: μ k ( t + 1 ) < − a r g m i n ∑ i : c i t = k k ∣ ∣ x i − μ ∣ ∣ 2 \mu_k^{(t+1)}<-argmin\sum^k_{i:c_i^t = k}||x_i - \mu||^2 μk(t+1)<argmini:cit=kk∣∣xiμ2

KMeans最核心的部分就是先固定中心点,调整每个样本所属的类别来减少 J J J;再固定每个样本的类别,调整中心点继续减小 J J J 。两个过程交替循环, J J J单调递减直到最(极)小值,中心点和样本划分的类别同时收敛。

聚类算法如何评价

聚类算法聚出的类有什么含义呢?这些类有什么样的性质?我们认为,被分在同一个簇中的数据是有相似性的,而不同簇中的数据是不同的,当聚类完毕之后,我们就要分别去研究每个簇中的样本都有什么样的性质,从而根据业务需求制定不同的商业或者科技策略。这个听上去和我们在上周的评分卡案例中讲解的“分箱”概念有些类似,即我们分箱的目的是希望,一个箱内的人有着相似的信用风险,而不同箱的人的信用风险差异巨大,以此来区别不同信用度的人,因此我们追求“组内差异小,组间差异大”。聚类算法也是同样的目的,我们追求“簇内差异小,簇外差异大”。而这个“差异“,由样本点到其所在簇的质心的距离来衡量。

对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小。而距离的衡量方法有多种,令 x x x表示簇中的一个样本点, μ \mu μ表示该簇中的质心, n n n表示每个样本点中的特征数目, i i i表示组 x x x成点的每个特征,则该样本点到质心的距离可以由以下距离来度量:

欧式距离:
d ( x , μ ) = ∑ i = 1 n ( x i − μ ) 2 d(x,\mu) = \sqrt{\sum^n_{i=1}(x_i - \mu)^2} d(x,μ)=i=1n(xiμ)2
曼哈顿距离:
d ( x , μ ) = ∑ i = 1 n ( ∣ x i − μ ∣ ) d(x,\mu) = \sum^n_{i=1}(|x_i - \mu|) d(x,μ)=i=1n(xiμ)
余弦距离:
c o s θ = ∑ 1 n ( x i ∗ μ ) ∑ i = 1 n ( x i ) 2 ∗ ∑ i = 1 n ( μ ) 2 cos\theta = \frac{\sum^n_1(x_i * \mu)}{ \sqrt{\sum^n_{i=1}(x_i)^2} * \sqrt{\sum^n_{i=1}(\mu)^2}} cosθ=i=1n(xi)2 i=1n(μ)2 1n(xiμ)

如我们采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:
C l u s t e r S u m o f S q u a r e ( C S S ) = ∑ j = 0 m ∑ i = 1 n ( x i − μ i ) 2 T o t a l C l u s t e r S u m o f S q u a r e = ∑ l = 1 k C S S l Cluster Sum of Square(CSS) = \sum^m_{j=0} \sum^n_{i=1}(x_i - \mu_i)^2 \\ Total Cluster Sum of Square = \sum^k_{l=1} CSS_l ClusterSumofSquare(CSS)=j=0mi=1n(xiμi)2TotalClusterSumofSquare=l=1kCSSl
其中, m m m为一个簇中样本的个数, j j j是每个样本的编号。这个公式被称为簇内平方和(cluster Sum of Square),又叫做Inertia。而将一个数据集中的所有簇的簇内平方和相加,就得到了整体平方和(Total Cluster Sum of Square),又叫做total inertia。Total Inertia越小,代表着每个簇内样本越相似,聚类的效果就越好。因此KMeans追求的是,求解能够让Inertia最小化的质心。实际上,在质心不断变化不断迭代的过程中,总体平方和是越来越小的。我们可以使用数学来证明,当整体平方和最小的时候,质心就不再发生变化了。如此,K-Means的求解过程,就变成了一个最优化问题。

代码

import numpy as np
import matplotlib.pyplot as plt# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 2)# 定义K值和迭代次数
K = 3
max_iterations = 100# 随机初始化簇中心点
centers = X[np.random.choice(X.shape[0], K, replace=False)]# 迭代更新簇中心点
for _ in range(max_iterations):# 计算每个数据点到每个簇中心点的欧氏距离distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2)# 分配每个数据点到最近的簇labels = np.argmin(distances, axis=1)# 更新簇中心点为每个簇的平均值new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])# 如果簇中心点不再改变,结束迭代if np.all(centers == new_centers):breakcenters = new_centers

参考

【手撕】K-measn算法及python代码实现及改进_k-means手撕代码-CSDN博客
菜菜的scikit-learn课堂

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

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

相关文章

自动保存知乎上点赞的内容至本地

背景&#xff1a;知乎上常有非常精彩的回答/文章&#xff0c;必须要点赞收藏&#xff0c;日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到&#xff0c;即使之前保存了链接网络不好也打不开了&#xff08;。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

社交买量:归因统计的核心要素与工具

在当今的社交App推广领域&#xff0c;广告买量已成为企业获取用户的重要手段。然而&#xff0c;如何准确衡量这些买量活动的成效&#xff0c;即用户从广告访问到安装后行为的完整转化路径&#xff0c;一直是运营人员关注的焦点。归因统计是一种评估营销效果的关键技术方案&…

python爬虫-多线程-数据库——WB用户

数据库database的包&#xff1a; Python操作Mysql数据库-CSDN博客 效果&#xff1a; 控制台输出&#xff1a; 数据库记录&#xff1a; 全部代码&#xff1a; import json import os import threading import tracebackimport requests import urllib.request from utils im…

论文阅读-一个用于云计算中自我优化的通用工作负载预测框架,

论文标题&#xff1a;A Self-Optimized Generic Workload Prediction Framework for Cloud Computing 概述 准确地预测未来的工作负载&#xff0c;如作业到达率和用户请求率&#xff0c;对于云计算中的资源管理和弹性非常关键。然而&#xff0c;设计一个通用的工作负载预测器…

docker-compose安装配置jenkins

archery 安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod 755 /usr/local/bin/docker-composedocker-compose version 安装docker yum install epel-rel…

【每日一题】6.LeetCode——轮转数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

【nginx实战】通过nginx实现http 长连接(即keep alive)

文章目录 一. http的长连接历史1. HTTP短连接模型2. HTTP长连接模型 二. nginx作为代理时实现HTTP长连接1. nginx与client的长连接1.1. keepalive_timeout指令1.2. keepalive_requests指令* 场景分析 2. 保持和server的长连接2.1. location设置* 场景分析 2.2. upstream设置* 场…

typescript 的基本用法说明

声明数组的两种方式 let x1: number[]; x1 [1, 2, 3]; // 方式1 let x2: Array<number> [1, 2, 3]; // 泛型 元组的含义 let x3: [string, number]; // 确定数量和类型 x3 [12, 10]; 枚举 enum Color { // 默认从0开始编码 &#xff0c;或者从第一个数字开始递增…

PVE报错处理:kvm [2205]: vcpu0 ignored RDMSR: 0x1b8

PVE使用过程中如果遇到&#xff1a;kvm [2205]: vcpu0 ignored RDMSR: 0x1b8 报错信息处理方法 vim /etc/modprobe.d/kvm.conf "options kvm ignore_msrsY"&#xff0c;这里在msrsY后面加一个空格&#xff0c;然后粘贴report_ignored_msrsN&#xff0c;使其变成 op…

【pytorch进阶】| 各类张量形状变化函数总结对比分析,view,reshape,pernute,transpose,squeeze,unsqueeze

文章目录 1 view&#xff08;&#xff09;函数1.1 基本用法 2 view_as&#xff08;&#xff09;函数3 reshape&#xff08;&#xff09;函数4 permute&#xff08;&#xff09;函数5 transpose&#xff08;&#xff09; 函数6 squeeze&#xff08;&#xff09;函数 和 unsqueez…

为什么建议不要买入耳式的耳机?有没有不伤听力的蓝牙耳机

为什么建议不要买入耳式的耳机&#xff1f;因为长时间佩戴入耳式耳机可能会导致耳朵不适甚至疼痛&#xff0c;且存在听力损伤、耳膜损伤的风险&#xff0c;还可能诱发耳道发炎。那么有没有不伤听力的蓝牙耳机呢&#xff1f;当然是有的&#xff0c;我建议尝试一下骨传导蓝牙耳机…

简单实践 java spring cloud 负载均衡

1 概要 1.1 实现一个最简单的微服务。远程调用负载均衡&#xff0c;基本上完成了最核心的微服务框架。 远程调用&#xff1a;RestTemplate 注册中心&#xff1a;eureka 负载均衡&#xff1a;Ribbon 1.2 要点 1.2.1 依赖 1.2.1.1 主框架依赖 spring boot 依赖 <depe…

HarmonyOS鸿蒙 虚拟像素 图片显示

Android中&#xff0c;有的sp&#xff0c;dp&#xff0c;dpi&#xff0c;px等概念。 dpi&#xff0c;dots per inch&#xff0c;代表屏幕像素密度。是指屏幕上每英寸&#xff08;1英寸 2.54 厘米&#xff09;距离中有多少个像素点。 dp&#xff0c;device independent pixels&…

Camille-接口测试

* 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道 * 接口测试&#xff1a;检查数据的交换、传递和控制管理过程 网络模型&#xff1a; OSI七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP/IP四层模型 应用层 传输层 网络…

GPT-4 Vision根据应用程序截图生成博客和Readme 升级Streamlit八

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

虚拟机(VMware)ubuntu16.04 直接连接网口设备 USRP 吊舱

编辑虚拟网络编辑器 点击之后 选择网卡之后&#xff0c;点击确定。 电脑配置 使用了&#xff1a;192.168.2.56 虚拟机内部配置 和PC的配置一致

leetcode刷题(剑指offer) 101.对称二叉树

101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

Elasticsearch性能调优

背景 项目上是用 ES 做数据库&#xff0c;存储的告警数据&#xff0c;量级在千万级别左右。测试在压测之后&#xff0c;系统频繁出现告警记录查询报错&#xff0c;系统不可用。基于此排查分析项目上 Elasticsearch 的使用是否合理。 版本及硬件 环境&#xff1a;10.xx.xxx.x…

vue前端html导出pdf

package.json中添加依赖 调用方&#xff1a; import htmlToPdf from ../../../utils/file/htmlToPdf.js// 下载方法&#xff0c;pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf(标题1, jsfgyzcpgxmShow, this.pdfDownloadDpi)}htmlToPdf.js // 页面导出为pdf格式 imp…

漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向

目录遍历漏洞/敏感信息泄露/URL重定向 文章目录 目录遍历敏感信息泄露URL重定向 目录遍历 敏感信息泄露 于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; ---通过访问url下的目录&#xff0c;可以直接列出目录下…