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

news2024/11/23 21:44:58

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

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

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

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

相关文章

firewalld(1)基本原理

简介 Firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,数据包过滤机制(Netfilter)有两个软件:firewalld与iptables。也就是说firewalld…

高德地图获取key值步骤

1、创建新应用 进入控制台&#xff08;https://lbs.amap.com/dev/&#xff09;&#xff0c;创建一个新应用。 如果您之前已经创建过应用&#xff0c;可直接跳过这个步骤。 2、添加新Key 在创建的应用上分别填写key名称、选择服务平台、SHA1、以及PackageName SHA1:是在安卓…

java实现双线性映射

1.目录结构 2.导包 将jpbc-api-2.0.0.jar和jpbc-plaf-2.0.0.jar导入到java项目中 网盘链接&#xff1a;链接: https://pan.baidu.com/s/1lFLXQj8v_EhL9KZYaaRv1w?pwde8db 提取码: e8db 3.编写代码 a.properties type a q 878071079966331252243778198475404981580688319941…

MSA 助力实验室测量更稳定、更准确

在汽车制造、石油化工、电子制造等行业,产品的质量和性能需要通过准确的测量来保证。但是由于测量设备的误差、操作人员的主观影响以及环境条件的干扰等因素会导致测量系统出现各种问题,且这些问题会导致测量结果不准确,从而影响产品质量。 随着工业信息化的迅速发展, 各行业对…

串口通信中字符和16进制显示的区别分析,串口发送数据

分析的原因 在对串口传送数值时&#xff0c;不想再进行一步字符转化&#xff0c;想要直接传送数值。但查看时就需要以16进制的数值形式查看数据&#xff0c;否则将不能看到正确的数据显示 下图是对串口寄存器发送一个16bit位的数据 void uart0Senduint16(UINT16 dat){SBUFdat…

使用Python Selenium,动态网页不再是难题!

目录 1、直接执行JS代码 🌐 1.1 execute_script基础用法 1.2 带参数执行JS函数 1.3 获取执行结果 2、使用execute_async_script异步执行 🔄 2.1 适用场景分析 2.2 实现异步操作示例 2.3 错误处理与调试技巧 3、JS与页面元素交互 👤 3.1 修改DOM属性 3.2 触发事…

KVM性能优化之磁盘IO优化

方法一&#xff1a;通过直接在XML里定义&#xff1a; 1.磁盘类型选择 <target devsda busscsi/> PS:virti0模式读写低于sata和SCSI模式&#xff0c;SCSI模式最高&#xff0c;大数据集建议使用SCSI 2.缓存模式选择 <driver nameqemu typeqcow2 cachenone/> 加上…

webpack+webpack server入门

​ 1.webpack介绍 webpack是一个模块加载器兼打包工具。它是以 commonJS 的形式来书写脚本的&#xff0c;但对 AMD/CMD 的支持也很全面&#xff0c;方便旧项目进行代码迁移。支持对react热插拔。 2.安装&#xff08;使用淘宝镜像&#xff09; 全局安装 cnpm install webpa…

同三维T700转换器 USB转HDMI转换器

让USB摄像头变成HDMI输出&#xff0c;支持4K60输出 一、产品简介&#xff1a; 此转换器可以把USB信号转成HDMI信号&#xff0c;支持4K60 HDMI输出&#xff0c;有效解决了USB摄像头连接电视、显示器、导播台的问题&#xff0c;带USB控制口&#xff0c;可升级/接蓝牙接收器&#…

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

停更公告

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

一招教你搞定Windows系统指定IP不变[固定IP地址方法]

1.打开控制面板&#xff0c;找到“网络和Internet” 点击进入&#xff1a; 2.点击打开“网络和共享中心”后&#xff0c;选择“更改适配器选项”。 3.点击 “查看此连接的状态”&#xff0c; 接着点击“详细信息” 查看信息。记录当前的IP地址是 10.88.x.xx&#xff0c;后面我们…

第一视角:获取VC账号,是成为亚马逊供应商的全面准备与必要条件

在当今全球化、数字化的商业环境中&#xff0c;亚马逊作为全球最大的电子商务平台&#xff0c;为众多企业提供了无限的商业机会。然而&#xff0c;想要成功在亚马逊上立足&#xff0c;成为其优质供应商&#xff0c;并非易事。其中&#xff0c;VC(Vendor Central)账号&#xff0…

提高接口响应

1. 简介 接口响应慢会直接影响用户体验和降低业务效率。为了有效应对这一问题&#xff0c;合理使用多线程技术成为了一种高效的解决方案。通过将独立的任务分配给不同的线程进行并行处理&#xff0c;我们可以充分利用系统资源&#xff0c;避免单一任务阻塞整个系统&#xff0c…

【十】【QT开发应用】QT中文乱码解决方案

QT中文乱码解决方案 粘贴代码导致的乱码 粘贴别人的代码时,在记事本里面"过一遍",然后再粘贴到QTCreator 使用u8 配置QT 不使用QT使用VS QT自选编码格式 结尾 最后&#xff0c;感谢您阅读我的文章&#xff0c;希望这些内容能够对您有所启发和帮助。如果您有任何问…

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会

6月22日&#xff0c;2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕&#xff0c;泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司&#xff08;NASDAQ:LIDR&#xff09;及光电器件规模化量产巨头Accelight Technologies&#xff…

ASM插桩——动态添加字段并生成get set 方法

1 首先创建一个实体类Student. 代码如下 package com.org.xcyz.asm;public class Student {private int id;private String name;private boolean sex;public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public…

触摸屏与罗克韦尔AB PLC之间 ModbusTCP/IP无线以太网通讯实例

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;通过触摸屏人机界面集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。本方案以组态…

阿里云oss存储

文章目录 准备阿里云的OSS控制台创建bucket获取AccessKey java使用oss导入依赖官网demo修改参数运行demo代码 封装工具类Oss下载如何保证指定时间段内可以访问私有权限的图片文件&#xff1f; 准备阿里云的OSS 控制台 访问阿里云官网&#xff0c;登录以后&#xff0c;右上角有…