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

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

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/175442.shtml

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

相关文章

理解Android无埋点技术

首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,而是脱离代码,只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码,而是尽可能的少写代码。开发者将SDK集…

零基础学编程轻松学编程,分享一款中文编程工具,编程构件简介

零基础学编程轻松学编程,分享一款中文编程工具,编程构件简介 中文编程开发语言工具编辑区界面截图如上图。 给大家分享一款中文编程工具 零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件&#…

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB (1)概念 …

6、Qt使用Log4Qt日志

一、知识点 1、Log4Qt有三部分 logger:负责捕获日志信息 layout:负责使用不同的样式输出日志 appender:负责输出信息到不同的目的地,比如数据库、文件、控制台等等 2、 日志级别如下,从上往下依次递增 ALL:…

css之svg 制作圆及旋转

1.代码 <template><div class"loading-box"><div class"circle-container"><svg width"75" height"75" class"move-left-to-right"><circle cx"37.5" cy"37.5" r"26&…

高端影像仪:打破微小产品测量局限

在现代工业生产中&#xff0c;影像仪以CCD数位影像为基石&#xff0c;将计算机屏幕测量技术与空间几何运算的能力融为一体&#xff0c;可以用于测量微小产品的各种尺寸和形状&#xff0c;为生产过程中的质量控制提供重要的参考依据。 影像仪产品内置高精度光学电动双倍镜头&am…

什么是动态住宅IP?它有什么用途?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天IPFoxy就给大…

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第1-10章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。需求如下3个&#xff1a; 1&#xff09;点亮灯泡 2&#xff09;将所有的div标签的标签体内容后面加上&#xff1a; very good 3&#xff09;使所有的复选框呈现被选…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

myAGV 2023 Pi 全新升级!

Introduction 在高速发展的自动化和机器人技术领域&#xff0c;我们的公司一直致力于提供高效、灵活且可靠的轻量级机械臂解决方案。然而&#xff0c;我们也深知&#xff0c;传统的机械臂需要固定在一个地方&#xff0c;这在一定程度上限制了其在空间上的应用范围。为了突破这一…

【论文阅读】ActiveNeRF:通过不确定性估计候选新视图

【论文阅读】ActiveNeRF: Learning where to See with Uncertainty Estimation Abstract1 Introduction3 Background4 NeRF with Uncertainty Estimation5 ActiveNeRF5.1 Prior and Posterior Distribution5.2 Acquisition Function5.3 Optimization and Inference 6 Experimen…

ECharts配置项手册了解及使用

1&#xff1a;点击文档然后选择配置项手册或者&#xff1a;Documentation - Apache ECharts 2&#xff1a;

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞)

中间件安全&#xff1a;Weblogic 漏洞.&#xff08;使用工具可以利用多种类型漏洞&#xff09; WebLogic 是美国 Oracle 公司出品的一个 application server&#xff0c;确切的说是一个基于 JAVA EE 架构的中间件&#xff0c;WebLogic 是用于开发、集成、部署和管理大型分布式…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

基于springboot-“有光”摄影分享网站系统(2023年☆全网唯一)【附源码|数据库|表结构|万字文档(LW)|技术文档|说明文档】

主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户账号、密码、姓名、手机号、身份证号、性别、邮箱 用户&#xff1a; ①首页、公告资讯展示、图片素材展示、活动展示、视频素材展示、查看更多 ②论坛、发布帖子、活动、活动标题、活动类型、公告资讯、公告标题、公告…

C#,数值计算——插值和外推,径向基函数插值(RBF_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 径向基函数插值 /// Object for radial basis function interpolation using n points in dim /// dimensions.Call constructor once, then interp as many times as desir…

2023年亚太杯APMCM数学建模大赛B题玻璃温室小气候调控

2023年亚太杯APMCM数学建模大赛 B题 玻璃温室小气候调控 原题再现 温室作物的产量受各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速对植物生长至关重要[2]。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;在温室设计中常…

vue3+ts 指令简写

<template><div class"btns"><button v-has-show"shop:create">创建</button><button v-has-show"shop:edit">编辑</button><button v-has-show"shop:delete">删除</button></div…

集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城一体的后台系统+HBuilderX 前端软件社区

HBuilderX前端软件社区thinkphp后端源码 搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名 电脑需要下载&#xff1a;HBuilderX 下载后 登录账号 没有账号就注册账号 然后上传文件 在选择你上传的文件 即可 打包选择 “发行” 可以打包app h5等等 …

开源语音大语言模型——Qwen-Audio

论文链接&#xff1a;https://arxiv.org/pdf/2311.07919.pdf 开源代码&#xff1a;https://github.com/QwenLM/Qwen-Audio 一、背景 大型语言模型&#xff08;LLMs&#xff09;由于其良好的知识保留能力、复杂的推理和解决问题能力&#xff0c;在通用人工智能&#xff08;AGI…