【理解机器学习算法】之Clustering算法(K-Means)

实现 K-means 聚类从零开始涉及几个关键步骤:初始化质心、将点分配给最近的质心、根据分配更新质心,以及重复这个过程直到收敛。这里是一个基本的 Python 实现:

K-means 算法步骤:

  1. 初始化质心:从数据点中随机选择 `k` 个初始质心。
  2. 将点分配给最近的质心:对于数据集中的每个点,找到最近的质心并将该点分配到那个簇中。
  3. 更新质心:重新计算作为每个簇中所有点的平均值的质心。
  4. 重复:重复步骤 2 和 3,直到质心不再显著变化,表明算法已经收敛。
import numpy as np

def initialize_centroids(points, k):
    """从数据点中随机初始化质心。"""
    indices = np.random.choice(points.shape[0], k, replace=False)
    return points[indices]

def closest_centroid(points, centroids):
    """返回一个数组,包含每个点到最近质心的索引。"""
    distances = np.sqrt(((points - centroids[:, np.newaxis])**2).sum(axis=2))
    return np.argmin(distances, axis=0)

def update_centroids(points, closest, centroids):
    """更新质心为每个簇分配的所有点的平均值。"""
    new_centroids = np.array([points[closest==k].mean(axis=0) for k in range(centroids.shape[0])])
    return new_centroids

def k_means(points, k, max_iters=100):
    """实现 K-means 算法。"""
    centroids = initialize_centroids(points, k)
    for _ in range(max_iters):
        closest = closest_centroid(points, centroids)
        new_centroids = update_centroids(points, closest, centroids)
        
        # 检查收敛
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
        
    return centroids, closest

# 示例用法
if __name__ == "__main__":
    # 生成一些数据(例如,在 2D 空间中的两个簇)
    np.random.seed(42)
    cluster_1 = np.random.normal(0, 1, (100, 2))
    cluster_2 = np.random.normal(5, 1, (100, 2))
    points = np.vstack((cluster_1, cluster_2))
    
    # 应用 K-means
    k = 2
    centroids, assignments = k_means(points, k)
    print("质心:\n", centroids)

K-means 算法的计算成本和时间成本主要依赖于几个因素:数据点的数量、特征的维数、质心的数量(k 值)以及算法迭代次数。算法的时间复杂度通常表示为 O(n*k*i*d),其中 n 是数据点的数量,k 是质心的数量,i 是迭代次数,d 是特征的维数。

计算成本和时间成本:

  • 数据点数量(n):数据点越多,每次计算距离和更新质心的时间就越长。
  • 质心数量(k):质心越多,计算每个数据点到每个质心的距离的成本就越高。
  • 迭代次数(i):算法需要更多的迭代次数来收敛到最终的簇分配,特别是对于初始质心选择不理想或数据分布复杂的情况。
  • 特征的维数(d):维度越高,计算距离就越复杂,因此时间成本更高。

局限性:

  • 初始质心的选择:K-means 的结果可能对初始质心的选择非常敏感,不同的初始质心可能导致不同的最终簇划分。
  • 簇的形状和大小:K-means 假设每个簇在所有方向上的方差都相同,因此它最适合识别球形簇。对于非球形簇或大小差异很大的簇,K-means 可能不会很有效。
  • 确定 k 值:在实际应用中,确定最佳的 k 值(即簇的数量)通常是一个挑战。
  • 局部最小值:K-means 可能会收敛到局部最优解而不是全局最优解,这意味着算法的结果可能不是最优的簇划分。

由于这些限制,虽然 K-means 在许多情况下都是一个有用和高效的聚类方法,但在应用时需要考虑数据的特性,并可能需要尝试不同的初始质心或使用如 K-means++ 这样的方法来改进初始质心的选择。

绘制二维的K-means

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# Generate synthetic two-dimensional data
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# Apply KMeans clustering
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# Plot the data points
plt.scatter(X[:, 0], X[:, 1], s=50, c=y_kmeans, cmap='viridis')

# Plot the centroids
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker推拉时的数据交换详解

前言 docker用了这么久了, 有没有想过, 在执行docker push 和 docker pull命令的时候, 数据是如何传递的呢? 换句话说, 如果要实现一个镜像仓库, 针对推拉的服务, 如何实现接口呢? 根据OCI 分发规范文档 的描述, 已经对整个推拉过程中要调用的接口有描述了. 但是, 纸上学来…

何为布控球?布控球的分类对比

主要的分类有: 根据内部的主控板卡的系统分类,典型的是基于海思芯片的嵌入式LINUX系统的,一般出国标GB28181,另外一种是剑走偏锋的安卓系统的,需要把球机的输出YUV转换为UVC接入安卓主板,作为外接USB摄像头…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,用于自动管理程序中不再使用的内存。在Java中,程序员不需要手动释放内存,因为GC会自动检测并回收不再使用的对象,从而减少内存泄…

param参数

param参数介绍及使用 在 Web 开发中,param 是指路由中的参数,用于捕获 URL 中的动态部分,并将其作为参数传递给路由处理函数。当定义包含参数的路由时,可以使用 param 方法来捕获 URL 中的动态部分,并将其传递给路由处…

用户多部门切换部门,MySQL根据多个部门id递归获取所有上级(祖级)、获取部门的全路径(全结构名称)

背景 之前做过的项目,都是一个用户就一个部门的,现在碰到个一个用户在多个部门的需求,而且需要可以切换不同部门查看不同数据。 就比如说一个大公司下面有多个子公司,每个子公司有好多部门、子部门等等,然后有部分用…

chrome浏览器插件extension开发中content内容脚本和background脚本通讯

有时候我们想监听页面中的数据变化,然后将监听到的数据传递给background脚本处理,比如根据不同的数据,来处理不同的业务逻辑,存储到服务器?或者控制浏览器显示效果?都可以,问题的重点是怎么让co…

口袋条件下的Lead优化几何深度模型-Delete 评测

Delete (Deep lead optimization enveloped in protein pocket) 是一个基于口袋的,3D分子生成的,应用于lead优化过程中侧链修饰、骨架跃迁,linker设计,片段生长的几何深度学习模型。 一、模型介绍 Delete 模型是浙江大学侯廷军老…

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇:概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…

STM32通信协议

STM32通信协议 STM32通信协议 STM32通信协议一、通信相关概念二、通信协议引脚作用三、通信方式四、采样方式五、电平信号六、通信对象 一、通信相关概念 通信接口 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定…

Mapmost Alpha —— 数字孪生创作新引擎,一键开启未来视界!

文章目录 一、关于 Mapmost Alpha1.1 Mapmost Alpha 应用创作工具1.2 Mapmost 数字孪生平台 二、Mapmost Alpha 产品能力与平台优势2.1 Mapmost Alpha 产品能力2.1 Mapmost Alpha 平台优势 三、Mapmost Alpha 成功案例3.1 美食地图3.2 同城活动3.3 智慧商业楼宇管理3.4 智慧交通…

C++之移动语义与智能指针

目录 移动语义 1、几个基本概念的理解 2、复制控制语义的函数 3、移动控制语义的函数 3.1、移动构造函数: 3.2、移动赋值函数 4.区别 5、std::move函数 6.代码演示: 资源管理与智能指针 一、C语言中的问题 二、C的解决办法(RAII技术): 三、四种智能指针…

水果检测15种YOLOV8

水果检测15种YOLOV8,只需要OPENCV,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDROID开发

宝塔面板优惠券在哪里领取?

随着科技的飞速发展,网站搭建和管理变得越来越简单。宝塔面板作为一款优秀的服务器管理面板,深受广大站长用户喜爱。为了帮助站长们更好地使用宝塔面板,本文将为大家详细介绍如何领取宝塔面板优惠券。 一、宝塔面板优惠券领取入口 领取入口&a…

Ubuntu Desktop 安装谷歌拼音输入法

Ubuntu Desktop 安装谷歌拼音输入法 1. Installation1.1. 汉语语言包​1.2. 谷歌拼音输入法1.3. 安装语言包1.4. 键盘输入方式系统1.5. 重启电脑1.6. 输入法配置 2. configuration2.1. Text Entry Settings… 3. ExecutionReferences 1. Installation 1.1. 汉语语言包 strong…

LeetCode刷题日志-34在排序数组中查找元素的第一个和最后一个位置

思路:用两次二分查找,分别查找指定元素的第一个和最后一个位置。 直接看代码 // 两次二分查找,分开查找第一个和最后一个 class Solution {public int[] searchRange(int[] nums, int target) {int[] reslut new int[]{-1, -1};int left 0…

virtualbox导入vdi

新建虚拟机 点击新建 输入新建属性 配置cpu和内存 虚拟硬盘 这里选择已有的vdi文件 摘要 这里点击完成 虚拟机添加成功 点击启动,启动虚拟机 注意 这个时候的ip,还是以前镜像的ip,如果两个镜像一起启动

双系统安装03--在已有麒麟KOS基础上安装Windows10

原文链接:双系统安装03–在已有麒麟KOS基础上安装Windows10 Hello,大家好啊!继我们之前讨论的关于双系统安装的系列文章之后,今天我将带给大家这个系列的第三篇——在已有的麒麟桌面操作系统上安装Windows 10。对于想要在使用麒麟…

提升水库大坝安全与效率:现代技术云平台的应用

在我国,水库大坝的数量居世界之首,它们在推动国民经济发展中扮演着不可或缺的角色。然而,要想让这些水利工程充分发挥其价值,不仅需要精准的调度与高效的管理,更重要的是要确保其安全无虞。一旦发生事故,后…

阿里云倚天服务器是什么?倚天服务器c8y、g8y和r8y详细介绍

阿里云倚天云服务器CPU采用倚天710处理器,租用倚天服务器c8y、g8y和r8y可以享受优惠价格,阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持: 阿里云倚天云服务…

海外媒体发稿:7款爆款标题生成器解析-华媒舍

科普文章是将科学知识普及给大众的一种方式,而一个引人入胜的标题往往是吸引读者的第一步。在科普领域中,标题的吸引力至关重要。以下将介绍7款风靡科普界的爆款标题生成器,帮助你创作出引人入胜的科普文章。 1. 情感引爆 情感是人类行为中的…