03、K-means聚类实现步骤与基于K-means聚类的图像压缩(1)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(1)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(1)
03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣,作为入门的素材非常合适。

K-means聚类实现步骤

1、K-means基础

K-means算法是一种常用的聚类算法,它的实现步骤如下:

STEP1:从数据集中随机选择k个样本作为初始聚类中心。
STEP2:计算每个样本到各聚类中心的距离,并将样本归入最近的聚类中心。
STEP3:重新计算每个聚类的中心,该中心为该类所有样本的平均值。
STEP4:重复步骤2和3,直到满足以下条件之一:

聚类中心不再变化。
达到预设的最大迭代次数。
最小平方误差SSE(误差的平方和)达到预设的阈值。

2、K-means的底层代码实现

STEP0:调用numpy和绘图库:

import numpy as np
from matplotlib import pyplot as plt

STEP1:从数据集中随机选择k个样本作为初始聚类中心:

# 随机初始化聚类初始优化点
def kMeans_init_centroids(X, K):# 随机重新排序样本的索引randidx = np.random.permutation(X.shape[0])# 取前K个样本作为聚类中心centroids = X[randidx[:K]]return centroids

STEP2:计算每个样本到各聚类中心的距离,并将样本归入最近的聚类中心:

def find_closest_centroids(X, centroids):# 获取聚类中心的数量,也即K值K = centroids.shape[0]# 初始化一个数组用于存储每个样本所属的聚类中心的索引  idx = np.zeros(X.shape[0], dtype=int)# 遍历数据集中的每个样本for i in range(X.shape[0]):# 初始化一个列表用于存储当前样本到每个聚类中心的距离distance = []# 计算当前样本到每个聚类中心的距离for j in range(centroids.shape[0]):# 使用欧几里得距离公式计算样本i与聚类中心j之间的距离norm_ij = np.linalg.norm(X[i] - centroids[j])distance.append(norm_ij)# 找出距离列表中的最小值,该最小值对应的索引就是当前样本所属的聚类中心idx[i] = np.argmin(distance)# 返回每个样本所属的聚类中心的索引数组return idx

STEP3:重新计算每个聚类的中心,该中心为该类所有样本的平均值:

def compute_centroids(X, idx, K):# 获取数据集X的行数m和列数n  # m表示样本数量,n表示每个样本的特征数量  m, n = X.shape# 初始化一个K x n的零矩阵,用于存储K个聚类中心  # K表示聚类数量,n表示特征数量  centroids = np.zeros((K, n))# 遍历每个聚类中心  for k in range(K):# 从数据集X中选择属于当前聚类k的所有样本  # idx是一个长度为m的数组,存储了每个样本所属的聚类中心的索引  points = X[idx == k]# 计算属于当前聚类k的所有样本的平均值,得到聚类中心  # axis=0表示按列计算平均值  centroids[k] = np.mean(points, axis=0)# 返回计算得到的K个聚类中心  return centroids

STEP4:重复步骤2和3,直到满足以下条件之一:
聚类中心不再变化。
达到预设的最大迭代次数。
最小平方误差SSE(误差的平方和)达到预设的阈值。

此处直接以达到预设的最大迭代次数作为停止条件

def run_kMeans(X, initial_centroids, max_iters=10):# 获取数据集X的行数m和列数n# m表示样本数量,n表示每个样本的特征数量m, n = X.shape# 获取初始聚类中心的数量KK = initial_centroids.shape[0]# 将初始聚类中心赋值给centroids变量centroids = initial_centroids# 将初始聚类中心复制给previous_centroids变量,用于后续比较聚类中心是否发生变化previous_centroids = centroids# 初始化一个长度为m的零数组,用于存储每个样本所属的聚类中心的索引idx = np.zeros(m)# 开始运行K-means算法,最多迭代max_iters次for i in range(max_iters):# 输出当前迭代进度print("K-Means iteration %d/%d" % (i, max_iters - 1))# 调用find_closest_centroids函数,为数据集X中的每个样本找到最近的聚类中心,并返回索引数组idx = find_closest_centroids(X, centroids)# 调用compute_centroids函数,根据每个样本所属的聚类中心和索引数组,计算新的聚类中心centroids = compute_centroids(X, idx, K)# 返回最终的聚类中心和每个样本所属的聚类中心的索引return centroids, idx

3、K-means的底层代码案例

此处直接使用吴恩达的案例,非常简洁直观嘞:

import numpy as np
import matplotlib.pyplot as pltdef load_data():X = np.load("K_means_data/ex7_X.npy")return Xdef draw_line(p1, p2, style="-k", linewidth=1):plt.plot([p1[0], p2[0]], [p1[1], p2[1]], style, linewidth=linewidth)def plot_data_points(X, idx):# plots data points in X, coloring them so that those with the same# index assignments in idx have the same colorplt.scatter(X[:, 0], X[:, 1], c=idx)def plot_progress_kMeans(X, centroids, previous_centroids, idx, K, i):# Plot the examplesplot_data_points(X, idx)# Plot the centroids as black 'x'splt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='k', linewidths=3)# Plot history of the centroids with linesfor j in range(centroids.shape[0]):draw_line(centroids[j, :], previous_centroids[j, :])plt.title("Iteration number %d" % i)def find_closest_centroids(X, centroids):"""Computes the centroid memberships for every exampleArgs:X (ndarray): (m, n) Input valuescentroids (ndarray): k centroidsReturns:idx (array_like): (m,) closest centroids"""# Set KK = centroids.shape[0]# You need to return the following variables correctlyidx = np.zeros(X.shape[0], dtype=int)for i in range(X.shape[0]):# Array to hold distance between X[i] and each centroids[j]distance = []for j in range(centroids.shape[0]):norm_ij = np.linalg.norm(X[i] - centroids[j])distance.append(norm_ij)idx[i] = np.argmin(distance)return idx# GRADED FUNCTION: compute_centpods
def compute_centroids(X, idx, K):"""Returns the new centroids by computing the means of thedata points assigned to each centroid.Args:X (ndarray):   (m, n) Data pointsidx (ndarray): (m,) Array containing index of closest centroid for eachexample in X. Concretely, idx[i] contains the index ofthe centroid closest to example iK (int):       number of centroidsReturns:centroids (ndarray): (K, n) New centroids computed"""# Useful variablesm, n = X.shape# You need to return the following variables correctlycentroids = np.zeros((K, n))for k in range(K):points = X[idx == k]centroids[k] = centroids[k] = np.mean(points, axis=0)return centroids# You do not need to implement anything for this part
def run_kMeans(X, initial_centroids, max_iters=10, plot_progress=False):"""Runs the K-Means algorithm on data matrix X, where each row of Xis a single example"""# Initialize valuesm, n = X.shapeK = initial_centroids.shape[0]centroids = initial_centroidsprevious_centroids = centroidsidx = np.zeros(m)# Run K-Meansfor i in range(max_iters):# Output progressprint("K-Means iteration %d/%d" % (i, max_iters - 1))# For each example in X, assign it to the closest centroididx = find_closest_centroids(X, centroids)# Optionally plot progressif plot_progress:plot_progress_kMeans(X, centroids, previous_centroids, idx, K, i)previous_centroids = centroids# Given the memberships, compute new centroidscentroids = compute_centroids(X, idx, K)plt.show()return centroids, idx# Load an example dataset
X = load_data()
# Set initial centroids
initial_centroids = np.array([[3,3],[6,2],[8,5]])
K = 3
# Number of iterations
max_iters = 10
centroids, idx = run_kMeans(X, initial_centroids, max_iters, plot_progress=True)

运行结果:
在这里插入图片描述

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

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

相关文章

解决:ModuleNotFoundError: No module named ‘PyQt5‘

解决:ModuleNotFoundError: No module named ‘PyQt5’ 文章目录 解决:ModuleNotFoundError: No module named PyQt5背景报错问题报错翻译报错位置代码报错原因解决方法安装PyQt5在PyCharm中配置PyQt5对于新项目对于已有项目 今天的分享就到此结束了 背景…

【序列推荐】MAN:跨领域顺序推荐的混合注意网络

#论文题目:MAN:Mixed Attention Network for Cross-domain Sequential Recommendation(跨领域顺序推荐的混合注意网络) #论文地址:https://dl.acm.org/doi/10.1145/3543507.3583278 #论文源码开源地址:http…

Docker可视化工具Portainer(轻量)或者Docker容器监控之 CAdvisor+InfluxDB+Granfana(重量)

Docker轻量级可视化工具Portainer 是什么 Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 安装 官网 https://www.portainer.io/ https://docs.portainer.io/v/ce-2.9/start/instal…

CANdelaStudio 中 Bese Variant 和 Variant区别

关于 Bese Variant ,其在 CDDT 和 CDD 文件中都存在,有且只有一个 主要包含三部分,重点只关注 DIDs 和 Supported Diagnostic Classes 而在 CDD 文件中,除了 Bese Variant 外,还有一个 Variant “Variant” 这个概…

minio分布式存储系统

目录 拉取docker镜像 minio所需要的依赖 文件存放的位置 手动上传文件到minio中 工具类上传 yml配置 config类 service类 启动类 测试类 图片 视频 删除minio服务器的文件 下载minio服务器的文件 拉取docker镜像 拉取稳定版本:docker pull minio/minio:RELEASE.20…

解析和存储优化的批量爬虫采集策略

如果你正在进行批量爬虫采集工作,并且想要优化解析和存储过程,提高采集效率和稳定性,那么本文将为你介绍一些实用的策略和技巧。解析和存储是批量爬虫采集中不可忽视的重要环节,其效率和质量对整个采集系统的性能至关重要。在下面…

前端 --- HTML

目录 一、网络的三大基石 ​二、什么是HTML 一、HTML 指的是超文本标记语言 二、HTML的作用 三、HTML的标准结构 四、IDE_HBuilder的使用 一、编码工具: 二、集成开发环境 三、HBuilder使用步骤: 五、HTML的标签的使用 一、html_head_body 二、head…

视频字幕处理+AI绘画,Runway 全功能超详细使用教程(4)

runway的视频字幕处理、AI绘图功能介绍,感觉完全就是为了做电影而布局,一整套功能都上线了!想系统学习的必收藏! 在深度研究Runway各个功能后,无论是AI视频生成及后期处理技术,还是AI图像生成技术&#xff…

浮点数在内存中的存储

浮点数的存储 根据国际标准IEEE,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式: V (−1) ^S∗ M ∗ 2^E • (−1)^ S 表⽰符号位,当S0,V为正数;当S1,V为负数 • M 表⽰有效数字,M是⼤于…

原生DOM事件、react16、17和Vue合成事件

目录 原生DOM事件 注册/绑定事件 DOM事件级别 DOM0:onclick传统注册: 唯一(同元素的(不)同事件会覆盖) 没有捕获和冒泡的,只有简单的事件绑定 DOM2:addEventListener监听注册:可添加多个…

使用mock.js模拟数据

一、安装mock.js npm i mockjs 二、配置JSON文件 我们创建一个mock文件夹,用于存放mock相关的模拟数据和代码实现。 我们将数据全部放在xxx.json文件夹下,里面配置我们需要的JSON格式的数据。 注意:json文件中不要留有空格,否则…

GDOUCTF2023-Reverse WP

文章目录 [GDOUCTF 2023]Check_Your_Luck[GDOUCTF 2023]Tea[GDOUCTF 2023]easy_pyc[GDOUCTF 2023]doublegame[GDOUCTF 2023]L!s![GDOUCTF 2023]润!附 [GDOUCTF 2023]Check_Your_Luck 根据 if 使用z3约束求解器。 EXP: from z3 i…

万字解析设计模式之迭代器模式、备忘录模式

一、迭代器模式 1.1概述 迭代器模式是一种行为型设计模式,它允许在没有暴露其底层表现形式的情况下遍历集合对象。迭代器模式提供一种通用的遍历机制,可以遍历任何类型的集合,包括数组、列表、树等。通过这种模式,可以实现一种通…

宝塔面板的使用

记录一下: 后台是SpringBoot项目,前台是Vue项目,前后端分离,要用宝塔布署上腾讯云服务器。 后台:配置文件的数据写云端的。有关localhost的要改成云服务器的公网IP。执行package命令,双击。将打包出来的j…

C 语言-循环嵌套-函数

C 语言 - 循环嵌套、函数 1. 循环嵌套 1.1 作用 循环 套 循环。 1.2 使用 需求1&#xff1a; 打印以下图形&#xff1a; * * * * * * * * * * * * * * * *代码&#xff1a; 1、使用循环打印 #include <stdio.h> int main(int argc, char const *argv[]) {for (int i…

云原生CI/CD流水线发布

文章目录 前言k8s组件与操作流程k8s组件创建pod k8s代码&&打包k8s yamldeploymentservicek8s volumesdemo CIgitlabCI runner CD配置git repository安装argo创建argo cd的配置yamlargocd和helm结合argocd hookargocd 发布 RBACoperatorhelmprometheus && grafn…

曝光!WPS用户信息或被盗用,紧急行动,迅软DSE数据加密应时而动!

WPS摊上大事了&#xff01;有用户发现&#xff0c;在WPS更新的一版用户隐私政策中&#xff0c;明确提到&#xff1a;“我们将对您主动上传的文档材料&#xff0c;在处理后作为AI训练的基础材料使用。”换句话说&#xff0c;WPS有可能“白嫖”用户的文档信息&#xff0c;用于投喂…

CVE-2020-11651(SaltStack认证绕过)漏洞复现

简介 SaltStack是使用Python开发的一个服务器基础架构集中化管理平台,底层采用动态的连接总线,使其可以用于编配,远程执行, 配置管理等等。 Salt非常容易设置和维护,而不用考虑项目的大小。从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的…

顺序表总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️arraylist的简…

JAVA多线程总结

一、概念&#xff1a; 1、什么是多任务 多任务就是在同一时间做多件事情&#xff0c;如边吃饭边玩手机等。看起来是多个任务都在做&#xff0c;本质上我们的大脑在同一时间依旧只做了一件件事情 2、什么是程序 程序是指令和数据的有序集合&#xff0c;其本身没有任…