聚类算法(3)---K-means 算法

       本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记

      AI学习笔记(9)---《聚类算法(3)---K-means 算法》

聚类算法(3)---K-means 算法

目录

1. 前言

2.相关知识

2.1模式特征

2.2相似性测度

2.3类间距离测度方法

3.K-means 算法原理

4.编程实现

4.1欧式距离计算MATLAB代码

4.2 K-means 聚类法MATLAB代码

4.3 测试输入


1. 前言

        理解并掌握动态聚类算法所涉及的一些基础概念,并通过 Matlab 编程实现。

        理解并掌握感 K-means 算法原理以及物理含义,编写一个简单的基于欧式距离的 K-means 算法进行聚类的例子。


2.相关知识

2.1模式特征

        在模式识别的任务中,模式通常是指我们观测的样本,而描述模式则通常是通过特征向量这样一种方式来进行的。

2.2相似性测度

        相似性测度是用来衡量模式(或称样本)之间相似性的“依据”。这里的模式可以理解为“特征向量”,因为在做聚类分析时,我们通常会将待分类的对象抽象成若干的“特征值”,这些“特征值”组成的向量便是待聚类的模式。

        通过相似性测度,我们可以量化不同模式之间的相似性,从而作为分类的依据。这里简要介绍两种距离测度:欧式距离、马氏距离。

        可见,相比于欧氏距离,马氏距离在计算时用到了样本集合的协方差矩阵。可以证明,马氏距离对一切非奇异线性变换都是不变的,这说明它不受特征量纲选择的影响。举例来说,特征向量xi​不同分量很可能是实际的物理量,随着量纲的不同,数值会发生变化,如 1 千克变为 100 克。量纲改变导致的数值变化可能会影响不同样本之间的相似性测度。

2.3类间距离测度方法

        这里主要介绍重心距离法,这是一种用一个点来表示一个类的空间位置方法。通过重心距离法,不仅能够量化类别与类别之间的距离,也能够很好的量化模式与类别之间的距离。在后面介绍的 K-means 聚类算法中,使用重心距离法会简化计算过程。


3.K-means 算法原理

        K-means 算法是一种动态聚类算法。动态聚类算法的基本思想是定义一个能表征聚类过程或结果优劣的准则函数,然后不断优化准则函数,最终取得一个理想的聚类效果。动态聚类算法的基本步骤是:

  1. 选取初始聚类中心及有关参数,进行初始聚类;
  2. 计算样本和聚类的距离,调整样本的类别;
  3. 计算各聚类的参数,删除、合并或分类一些聚类;
  4. 从初始聚类开始,通过迭代算法动态的改变类别和聚类中心,使准则函数取得极值或设定的参数达到设计要求时停止。

K-means 算法算法步骤:


4.编程实现

4.1欧式距离计算MATLAB代码

function [distance] = step1_mission(v1, v2)
    %%%%%%%%%% Begin %%%%%%%%%%
    m = size(v1, 1); % 获取矩阵 v1 的行数,即向量 v1 的数量
    n = size(v2, 1); % 获取矩阵 v2 的行数,即向量 v2 的数量
    dist_matrix = zeros(m, n); % 初始化 m 行 n 列的零矩阵,用于存储距离值
    for i = 1:m % 遍历 v1 的每一行
        for j = 1:n % 遍历 v2 的每一行
            dist_matrix(i, j) = sqrt(sum((v1(i, :) - v2(j, :)).^2)); % 计算 v1 的第 i 个向量与 v2 的第 j 个向量之间的欧氏距离
        end
    end
    distance = dist_matrix; % 将距离矩阵赋值给输出变量 distance
    %disp(dist_matrix); % 可选:输出距离矩阵
    %%%%%%%%%% End %%%%%%%%%%
end

4.2 K-means 聚类法MATLAB代码

function [output_c] = step2_mission( vs, init_c )
    % 读取样本个数,特征维度,初始化类心
    [sample_num,~] = size(vs);    % sample_num读取样本个数
    [center_num, center_d] = size(init_c);  % center_num类心个数,center_d 特征维度大小
    old_c = init_c;
    new_c = init_c;
    
    % K-means 算法迭代部分
    while 1
        % 计算样本到类心欧式距离,并根据欧式距离进行分类
        %%%%%%%%%% Begin %%%%%%%%%%
        for i=1:sample_num
            infer=99999;
            for j=1:center_num
                dist=euclidean_dist(vs(i,:),init_c(j,:));
                if dist<infer
                    infer=dist;
                    classify(i)=j;
                end
            end
        end
        %%%%%%%%%% End %%%%%%%%%%

        % 初始化新类心
        new_c = zeros(center_num, center_d);
        new_c_count = zeros(1,center_num);
        
        % 使用重心法计算计算新类心
        for idx = 1:sample_num
            new_c(classify(idx),:) = new_c(classify(idx),:) + vs(idx,:);
            new_c_count(classify(idx)) = new_c_count(classify(idx)) + 1;
        end
        new_c = new_c./((new_c_count')*ones(1, center_d));

        % 判断是否收敛,阈值为0.01,是则结束迭代,否则更新类心继续迭代
        %%%%%%%%%% Begin %%%%%%%%%%
        flag=1;
        for i=1:center_num
            for j=1:center_d
                if old_c(i,j)-new_c(i,j)>0.01
                    flag=0;
                end
            end
        end
        if flag
            break;
        else
            old_c=new_c;
        end
        %%%%%%%%%% End %%%%%%%%%%
    end
    
    % 返回聚类类心作为结果
    output_c = new_c;
    
end


function [distance] = step1_mission(v1, v2)
    %%%%%%%%%% Begin %%%%%%%%%%
    m = size(v1, 1); % 获取矩阵 v1 的行数,即向量 v1 的数量
    n = size(v2, 1); % 获取矩阵 v2 的行数,即向量 v2 的数量
    dist_matrix = zeros(m, n); % 初始化 m 行 n 列的零矩阵,用于存储距离值
    for i = 1:m % 遍历 v1 的每一行
        for j = 1:n % 遍历 v2 的每一行
            dist_matrix(i, j) = sqrt(sum((v1(i, :) - v2(j, :)).^2)); % 计算 v1 的第 i 个向量与 v2 的第 j 个向量之间的欧氏距离
        end
    end
    distance = dist_matrix; % 将距离矩阵赋值给输出变量 distance
    %disp(dist_matrix); % 可选:输出距离矩阵
    %%%%%%%%%% End %%%%%%%%%%
end

4.3 测试输入

MATLAB终端输入下面指令

测试step1_mission(v1, v2)

a1 = [0 0 0];
b1 = [2 2 2];

a2 = [1 5 9; 5 5 5; 9 9 9];
b2 = [0 0 0];

a3 = [1 1 1; 2 2 2];
b3 = [3 3 3; 0 0 0; 5 5 5];

a4 = [1 2 3 4 5 6 7 8 9];
b4 = [1 1 2 3 4 5 6 8 9; 5 5 5 5 5 6 8 7 0];

result1 = step1_mission(a1,b1)

result2 = step1_mission(a2,b2)

result3 = step1_mission(a3,b3)

result4 = step1_mission(a4,b4)

 测试step2_mission(samples, c1)

samples = [-7.82 -4.58 -3.97; -6.68 3.16 2.71; 4.36 -2.91 2.09; 6.72 0.88 2.80; -8.64 3.06 3.50; -6.87 0.57 -5.45; 4.47 -2.62 5.76; 6.73 -2.01 4.18; -7.71 2.34 -6.33; -6.91 -0.49 -5.68; 6.18 2.81 5.82; 6.72 -0.93 -4.04; -6.25 -0.26 0.56; -6.94 -1.22 1.13; 8.09 0.20 2.25; 6.81 0.17 -4.15; -5.19 4.24 4.04; -6.38 -1.74 1.43; 4.08 1.30 5.33; 6.27 0.93 -2.78];
c1 = [1.0 1.0 1.0; -1.0 1.0 -1.0];
c2 = [0.0 0.0 0.0; -1.0 1.0 -1.0];
c3 = [0.0 0.0 0.0; 1.0 1.0 1.0; -1.0 0.0 2.0];
c4 = [-0.1 0.0 0.1; 0.0 -0.1 0.1; -0.1 -0.1 0.1];
disp('task1:');
output_c1 = step2_mission(samples, c1)

disp('task2');
output_c2 = step2_mission(samples, c2)

disp('task3');
output_c3 = step2_mission(samples, c3)

disp('task4');
output_c4 = step2_mission(samples, c4)

     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。

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

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

相关文章

软件测试的目的和原则介绍,软件测试外包公司推荐

在当今信息技术迅速发展的时代&#xff0c;软件产品的质量和安全性对用户至关重要。而软件测试作为保障软件产品质量的关键一环&#xff0c;具有不可或缺的作用。 软件测试的目的是为了发现和解决软件产品中的缺陷和问题&#xff0c;确保软件的稳定和可靠性。软件测试帮助找出…

表格截图怎么转换成表格?6个软件帮助你快速进行表格转换

表格截图怎么转换成表格&#xff1f;6个软件帮助你快速进行表格转换 将表格截图转换为可编辑的表格文件是处理数据时常见的需求&#xff0c;特别是在需要分析或编辑图像中包含的信息时。以下是几款帮助你快速进行表格转换的软件和工具&#xff0c;它们提供了不同的功能和适用场…

揭秘!这款电路设计工具让学校师生都爱不释手——SmartEDA的魔力何在?

随着科技的飞速发展&#xff0c;电子设计已成为学校师生们不可或缺的技能之一。而在众多的电路设计工具中&#xff0c;有一款名为SmartEDA的工具&#xff0c;凭借其强大的功能和友好的用户体验&#xff0c;迅速赢得了广大师生的青睐。今天&#xff0c;就让我们一起探索SmartEDA…

游泳耳机入耳式好还是骨传导好?游泳教练力荐实力卓绝的四大热款

作为一名长期致力于游泳爱好者健康与运动体验提升的专业教练&#xff0c;我深知在水中听音乐的魅力&#xff0c;同时也深知选择正确的耳机对于水上运动的重要性。近年来&#xff0c;市场上的游泳耳机类型日益丰富&#xff0c;其中入耳式和骨传导两大主流各有千秋。今天&#xf…

系统运维面试题总结(网络基础类)

系统运维面试题总结&#xff08;网络基础类&#xff09; 网络基础类第七层&#xff1a;应用层第六层&#xff1a;表示层第五层&#xff1a;会话层第四层&#xff1a;传输层第三层&#xff1a;网络层第二层&#xff1a;数据链路层第一层&#xff1a;物理层 类似面试题1、TCP/IP四…

停更公告

由于csdn越来越流氓了&#xff0c;我永久停更&#xff0c;专注于网站建设&#xff08;亚运奥运素材网&#xff09;qdhca.asiahttp://qdhca.asia/

Linux之prometheus安装和使用简介(一)

一、prometheus简介 普罗米修斯Prometheus是一个开源系统监控和警报工具包&#xff0c;最初构建于SoundCloud。自2012年成立以来&#xff0c;许多公司和组织都采用了普罗米修斯&#xff0c;该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目&#xff0c;独立…

如何使用WxPusher向个人微信推送发送实时消息,比如定时任务等

wxpusher-sdk-java这个框架开源了&#xff1a;GitHub - wxpusher/wxpusher-sdk-java: 微信消息实时推送服务[WxPusher]的Java版本sdk&#xff0c;可以通过API实时给个人微信推送消息。wechat pusher. 文档地址&#xff1a;WxPusher微信推送服务 WxPusher (微信推送服务)是一个…

【启明智显分享】典型的HMI应用实现方案:帮你更好地主控选型!

HMI是操作者与机器/系统间资讯传递和交换的主要桥梁。HMI系统通常能提供丰富的资讯&#xff0c;例如温度、压力、制造流程步骤以及材料的计量数据。还能显示设备中物料的确切位置或储存槽内的液位数据等讯息。无论是在工业自动化还是医疗、商业等重要行业领域&#xff0c;HMI都…

使用Retrofit2+OkHttp监听上传或者下载进度会执行两次的问题

使用Retrofit2OkHttp监听上传或者下载进度RequestBody#writeTo/ResponseBody#source 会执行两次的问题 example&#xff1a; 问题原因&#xff1a; 使用了HttpLoggingInterceptor拦截器&#xff0c;并且日志等级为HttpLoggingInterceptor.Level.BODY 问题解决&#xff1a;

【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)

文章目录 Linux 软件包管理器 yumLinux开发工具Linux编辑器-vim使用vim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总批量化注释和批量化去注释vim简单的配置解决一个小问题 Linux编译器-gcc/g作用gcc/g 语法预处理编译汇编链接什么是函数库 Linux调…

【第一周】认识小程序

目录 认识小程序发展历史发展前景发展优势个人企业/创业 账号申请开发工具下载流程使用说明 协作项目交流收益渠道 认识小程序 发展历史 微信小程序自2016年首次提出以来&#xff0c;经历了快速的发展和完善过程&#xff0c;以下是其主要发展历史节点&#xff1a; 2016年1月…

vue3 中的根据某些特定的文字来筛选数组数据

现在有一批这样的数据 这样的数据 我想根据 hallName 来筛选数据 比如关键字有 我不需要 带有下面字符换的数组数据 const importantData ref(["VIP", "CINITY", "杜比", "IMAX", "4DX", vip, Vip]) 使用some 方法 arr…

手机端调试工具 vconsole、eruda 使用方法

在手机端能正常查看log及网络请求。。 1.eruda: 在 index.html 中引入&#xff1a; /** 科学上网地址 */ <script src"https://cdn.jsdelivr.net/npm/eruda"></script> /** 国内访问地址 */ <script src"https://fastly.jsdelivr.net/npm/eru…

ARP欺骗

一、什么是ARP ARP欺骗是一种针对以太网地址解析协议&#xff08;ARP&#xff09;的攻击技术&#xff0c;通过伪造ARP数据包来篡改目标计算机的ARP缓存&#xff0c;实现中间人攻击或拒绝服务攻击。 ARP协议的基本功能是通过目标设备的IP地址查询其MAC地址&#xff0c;以保证网…

VMware虚拟机三种网络模式设置 - Host-Only(仅主机模式)

一、前言 在之前的《Bridged&#xff08;桥接模式&#xff09;》、《NAT&#xff08;网络地址转换模式&#xff09;》中&#xff0c;我详细介绍了虚拟机网络模式设置中的桥接模式与网络地址转换模式。今天详细讲解一下Host-Only&#xff08;仅主机模式&#xff09;。 在VMware虚…

为什么说展厅数字人是展览未来的趋势?

展厅数字人是利用数字化、智能化和网络化等信息技术手段提升展厅展览服务和游览体验的全新载体。随着人工智能和虚拟现实技术的应用发展&#xff0c;展厅数字人已成为展厅展览转型升级的重要趋势。 展厅数字人凭借其创新性、强可塑性&#xff0c;成为展厅新名片&#xff0c;为各…

【pytorch08】拼接与拆分

1.拼接与拆分 CatStackSplitChunk 2.Cat 有两张成绩单 [class1-4,students,scores] [class5-9,students,scores]’ 要把这两个成绩单合并在一起 如何理解该行为 注意&#xff1a;班级情况中 A的tensor是[4,32,8],B的tensor是[5,32,8]如果我们是在0维上进行拼接&#xff0c;要…

使用 GitHub Actions 编译和发布 Android APK

使用 GitHub Actions 编译和发布 Android APK 在现代软件开发中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已成为不可或缺的一部分。对于 Android 开发者来说&#xff0c;自动化编译和发布 APK 不仅节省时间&#xff0c;还能确保每次发布的一致性。本文将介…

力扣每日一题 6/24 模拟 数组 单调栈

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 503.下一个更大元素II 【中等】 题目&#xff1a; 给定一个循环数组 nums…