k-means聚类模型的原理和应用

        k-means聚类算法是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,然后随机选取K个对象作为初始的聚类中心;计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心;聚类中心以及分配给它们的对象就代表一个聚类;每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

        k-means聚类算法在市场分析、图像处理、模式识别、数据挖掘等多个领域中都有广泛应用。通过对数据进行聚类,可以发现数据集中的隐藏结构和规律,进而为决策提供有力支持。以下是一个简单的C++实现,展示了如何使用k-means算法对二维数据进行聚类。请注意,为了简单起见,此实现省略了一些优化和错误处理,但足以说明k-means算法的基本思想。代码如下。

#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <limits>
#include <algorithm>struct Point {double x, y;
};double euclideanDistance(const Point& a, const Point& b) {return std::sqrt(std::pow(a.x - b.x, 2) + std::pow(a.y - b.y, 2));
}Point calculateCentroid(const std::vector<Point>& cluster) {double sumX = 0, sumY = 0;for (const auto& point : cluster) {sumX += point.x;sumY += point.y;}return {sumX / cluster.size(), sumY / cluster.size()};
}std::vector<Point> initializeCentroids(const std::vector<Point>& data, int k) {std::vector<Point> centroids(k);std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, data.size() - 1);for (int i = 0; i < k; ++i) {centroids[i] = data[dis(gen)];}return centroids;
}std::vector<std::vector<Point>> kMeans(const std::vector<Point>& data, int k, int maxIterations) {std::vector<Point> centroids = initializeCentroids(data, k);std::vector<std::vector<Point>> clusters(k);for (int iter = 0; iter < maxIterations; ++iter) {// Assign points to clustersstd::fill(clusters.begin(), clusters.end(), std::vector<Point>());for (const auto& point : data) {int minIndex = -1;double minDist = std::numeric_limits<double>::max();for (int i = 0; i < k; ++i) {double dist = euclideanDistance(point, centroids[i]);if (dist < minDist) {minDist = dist;minIndex = i;}}clusters[minIndex].push_back(point);}// Calculate new centroidsbool hasConverged = true;for (int i = 0; i < k; ++i) {Point oldCentroid = centroids[i];centroids[i] = calculateCentroid(clusters[i]);if (euclideanDistance(oldCentroid, centroids[i]) > std::numeric_limits<double>::epsilon()) {hasConverged = false;}}if (hasConverged) {break;}}return clusters;
}int main() {// Sample data pointsstd::vector<Point> data = {{1, 2}, {5, 8}, {1.5, 1.8}, {8, 8}, {1, 0.6}, {9, 11}};// Number of clusters and maximum iterationsint k = 2;int maxIterations = 100;// Perform k-means clusteringstd::vector<std::vector<Point>> clusters = kMeans(data, k, maxIterations);// Print resultsstd::cout << "Clusters:" << std::endl;for (int i = 0; i < clusters.size(); ++i) {std::cout << "Cluster " << i + 1 << ":" << std::endl;for (const auto& point : clusters[i]) {std::cout << "(" << point.x << ", " << point.y << ")" << std::endl;}std::cout << std::endl;}// Optionally, print centroidsstd::cout << "Centroids:" << std::endl;for (const auto& centroid : kMeans(data, k, maxIterations)[0]) {std::cout << "(" << centroid.x << ", " << centroid.y << ")" << std::endl;}return 0;
}

        以上代码首先定义了一个`Point`结构体用于表示二维空间中的点,然后定义了几个辅助函数,包括计算欧几里得距离、计算聚类中心、初始化聚类中心等。`kMeans`函数实现了k-means算法的主要逻辑,包括分配点到聚类中以及重新计算聚类中心。`main`函数中创建了一些样本数据点,然后调用`kMeans`函数进行聚类,并打印出每个聚类中的点以及聚类中心。

        注意:在实际应用中,k-means算法可能需要更多的优化,例如使用更高效的初始化方法(如k-means++),处理空聚类,以及利用并行计算加速算法等。此外,对于大规模数据集或高维数据,可能需要使用更高级的聚类算法。此示例仅用于展示k-means算法的基本实现。

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

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

相关文章

用FFMPEG对YUV序列进行编辑的笔记

还是单独开一个吧 每次找挺烦的 播放YUV序列 ffmpeg -f rawvideo -pix_fmt yuv420p -s 3840x2160 -i "Wood.yuv" -vf "scale1280x720" -c:v rawvideo -pix_fmt yuv420p -f sdl "Wood"4K序列转720P ffmpeg -f rawvideo -pix_fmt yuv420p -s 38…

Photoshop 2024无故卡死

来源 还没怎么用呢&#xff0c;就直接卡死不能动了 虽然是学习版 但是想必不会是软件的问题&#xff0c;毕竟Adobe出品的软件应该是还是有点质量的。 解决 安装国际软件的必备技能&#xff0c;目录必须是全英文√保证磁盘空间还有相当部分的剩余√保证电脑性能完全没问题√保…

政安晨【零基础玩转各类开源AI项目】:解析开源项目:Champ 利用三维参数指导制作可控且一致的人体图像动画

目录 论文题目 Champ: 利用三维参数指导制作可控且一致的人体图像动画 安装 创建 conda 环境&#xff1a; 使用 pip 安装软件包 推理 1. 下载预训练模型 2. 准备准备引导动作数据 运行推理 训练模型 准备数据集 运行训练脚本 数据集 政安晨的个人主页&#xff1a;…

工业无线通信解决方案,企业在进行智能化升级改造

某大型制造企业在进行智能化升级改造,需要将分布在各个车间的数控机床、自动化生产线、AGV小车等设备连接到云端,实现设备的远程监控、数据采集分析等功能。之前工厂内部是用工业以太网连接,存在布线难、成本高、灵活性差等问题。 在了解客户需求后,我司星创易联的工程师建议客…

淘宝扭蛋机小程序,扭蛋市场创新模式

扭蛋机作为潮玩市场的娱乐消费方式&#xff0c;成为了当下消费者的新宠。扭蛋机凭借自身性价比高、商品多样、惊喜性等特点&#xff0c;吸引了各个年龄层的消费者&#xff0c;不仅年轻人喜欢&#xff0c;不少小学生和老年人也非常喜欢&#xff0c;扭蛋机市场迎来了快速发展期。…

简单聊下办公白环境

在当今信息化时代&#xff0c;办公环境对于工作效率和员工满意度有着至关重要的影响。而白名单作为一种网络安全策略&#xff0c;其是否适合办公环境&#xff0c;成为了许多企业和组织需要思考的问题。本文将从白名单的定义、特点及其在办公环境中的应用等方面&#xff0c;探讨…

DSP问题:TMS320F280049 GPIO输入上拉电压只有2.1V

1、问题现象 使用TMS320F280049编写GPIO输入检测程序时&#xff0c;配置GPIO为输入上拉&#xff0c;使用万用表测量GPIO口只有2.1V左右&#xff0c;程序此时检测到的是低电平&#xff0c;导致无法检测到按钮按下&#xff08;按钮按下接地&#xff09;。 2、问题原因 TMS320F…

NRP-Z81探头NRP-Z85功率传感器NRP-Z86罗德与施瓦茨

精确和简单的功率测量重要的特点是高测量精度和速度。紧凑、坚固的R&SNRX基本单元&#xff0c;带彩色触摸显示屏&#xff0c;支持多达四个R&SNRP功率传感器和所有传感器相关测量功能。测量值以数字或图形方式显示&#xff0c;具体取决于测量功能。高分辨率图形用户界面…

【必会面试题】JVM内存分区?垃圾回收(GC)算法?如何处理OOM?

目录 JVM分区模型GC&#xff08;垃圾回收&#xff09;算法&#xff1a;处理OOM&#xff08;Out Of Memory&#xff09;&#xff1a; JVM分区模型 JVM&#xff08;Java虚拟机&#xff09;内存划分为多个区域&#xff0c;以支持其运行时环境和对象的生命周期管理。以下是主要的内…

变压器绕线完成之后要做的事

1 调整感量&#xff1a;测主绕组电感量&#xff0c;通过磨气隙或垫气隙&#xff0c;测得感量没错以后&#xff0c;用胶带封装磁芯 2 测验同名端是否正确&#xff1a;两绕组首尾相连&#xff0c;测试连接后的总感量&#xff0c;是否比感量大的那个绕组还大。如果是&#xff0c;…

从零手写实现 nginx-09-compress http 文件压缩

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

计算欧几里得距离

任务描述 本关实现一个函数来计算欧几里得距离。 相关知识 K-means 算法的核心思想是&#xff0c;将数据集中的样本聚类为多个簇集&#xff0c;簇内样本距离较近&#xff0c;簇间样本距离较远。由此可见&#xff0c;其最基本的运算是判断样本&#xff08;如书籍、电影、用户…

澳大利亚和德国媒体投放-国外新闻发稿-海外软文推广

德国媒体 Firmenpresse德国新闻 Firmenpresse德国新闻是一家备受欢迎的新闻发布平台&#xff0c;其好友搜索引擎在收录网站方面表现出色。如果您希望更好地将您的新闻传播给德国受众&#xff0c;Firmenpresse德国新闻将是一个理想的选择。 Frankfurt Stadtanzeiger法兰克福城…

电气灭火产品调查:全氟己酮自自动灭火贴多少钱一个?

根据国家消防救援局于透露&#xff0c;今年年初&#xff0c;河南南阳、江西新余、江苏南京接连发生重大火灾事故&#xff0c;截至日前&#xff0c;全国共接报火灾45万起&#xff0c;住宅、宾馆餐饮店、电动车火灾数量相比去年同期均有所上升。从引 发火灾的原因来看&#xff0c…

k8s-mysql主从部署

一.环境信息 mysql版本 :8.0 k8s 版本1.22 使用nfs作为共享存储 二.配置mysql主节点yaml apiVersion: v1 kind: ConfigMap metadata:name: mysql-master-confignamespace: mysqllabels:app: mysql-master-config data:my.cnf: |[client]default-character-setutf8[mysql]d…

MySQL Doublewrite Buffer 有了解过吗?

引言&#xff1a;在数据库管理中&#xff0c;确保数据的完整性和一致性是至关重要的。然而&#xff0c;在持久化数据到磁盘的过程中&#xff0c;可能会遇到各种意外情况&#xff0c;如断电或系统崩溃&#xff0c;从而导致部分数据写入&#xff0c;而另一部分数据未能成功写入&a…

揭秘!如何从精益生产转向智能制造

企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向&#xff0c;不知该如何下手&#xff0c;盲目跟风。 君不见&#xff0c;很多企业在“工业4.0、智能制造、互联网”等概念满天飞的环境下迷失了方向&#xff0c;不知该如何下手&#xff0c;盲目跟风&#xf…

D365 使用 X++ 设置采购行的财务维度组合

文章目录 前言一、代码 前言 使用 X 设置采购行的财务维度组合 一、代码 PurchLine purchLine;DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;DimensionAttributeValue dimensionAttributeValue;DimensionAt…

2024下《系统集成项目管理工程师》50个高频考点汇总!值得收藏

宝子们&#xff01;5月软考考完了&#xff0c;终于可以考系统集成了&#xff01; 整理了50个高频考点&#xff0c;涵盖全书90%考点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个 1、信息安全的基本要素有&#xff1a; &#xff08;1&#xff09…

迈入智能新纪元:智慧机房运维系统引领行业变革

在数字化飞速发展的今天&#xff0c;机房作为信息时代的“心脏”&#xff0c;其稳定运行对于企业的业务连续性至关重要。然而&#xff0c;传统的机房运维模式面临着诸多挑战&#xff0c;如响应速度慢、故障定位难、资源浪费大等问题。智慧机房运维系统&#xff0c;它将以智能化…