机器学习之深入理解K-means、与KNN算法区别及其代码实现

article/2025/9/7 7:58:47

K-means方法是一种非监督学习的算法,它解决的是聚类问题。

1、算法简介:K-means方法是聚类中的经典算法,数据挖掘十大经典算法之一;算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足聚类中的对象相似度较高,而不同聚类中的对象相似度较小。

2、算法思想:以空间中k个点为中心进行聚类,对最靠近他们的对象归类,通过迭代的方法,逐次更新各聚类中心的值,直到得到最好的聚类结果。

3、算法描述:

(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的那个中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的C个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束;否则继续迭代。

4、算法举例:

我们假设药物A、B、C、D有两个特征值,分别是药物重量以及PH值。

药物名称药物重量药物PH值
A11
B21
C43
D54

现在我们要对这四个药物进行聚类,已知我们要分成两类,那么我们该怎么做呢?

首先我们把上面的数据画到二位坐标系当中 A(1,1),B(2,1),C(4,3),D(5,4)

这里写图片描述

初始时,我们先假设药物A为聚类1的中心点,B为聚类2的中心点,那么初始时的中心坐标分别为 c1=(1,1),c2=(2,1) ,矩阵D的第一行代表各个点到中心点 c1 的距离,第二行代表各个点到中心点 c2 的距离;那么初始矩阵 D0 表示成如下:

D0=[01103.612.8354.24]

矩阵 G 代表样本应该归属于哪个聚类,第一行代表各个点是否属于中心c1所在的类(0代表不在,1代表在),第二行代表各个点是否属于中心 c2 所在的类(0代表不在,1代表在);那么此时 G0 表示成如下:

G0=[10010101]

由矩阵 G0 可知A药物属于一个类,B、C、D属于一类;

然后,利用均值等方法更新该类的中心值。

c1=1,1

c2=2+4+53,1+3+43=(133,83)

这里写图片描述

上图是更新后的坐标图,对应的中心点也发生了变化。

因为中心点跟上次不一样了,所以我们又可以对样本点进行重新划分。划分的方法还是跟以前一模一样,我们先计算出矩阵 D1 表示成如下:

D1=[03.1412.363.610.4751.89]

此时 G1 表示成如下:

G1=[10100101]

由矩阵 G1 可知A、B药物属于一个类,C、D属于一类;

然后,利用均值等方法再次更新该类的中心值。

c1=1+22,1+12=(1.5,1)

c2=4+52,3+42=(4.5,3.5)

这里写图片描述

上图是更新后的坐标图,对应的中心点也发生了变化。

因为中心点跟上次不一样了,所以我们又可以对样本点进行重新划分。划分的方法还是跟以前一模一样,我们先计算出矩阵 D2 表示成如下:

D2=[0.54.300.53.543.200.714.610.71]

此时 G2 表示成如下:

G2=[10100101]

由矩阵 G2 可知A、B药物属于一个类,C、D属于一类;

然后,利用均值等方法再次更新该类的中心值。

c1=1+22,1+12=(1.5,1)

c2=4+52,3+42=(4.5,3.5)

因为对应的中心点并没有发生变化,所以迭代停止,计算完毕。

本算法的时间复杂度:O(tkmn),其中,t为迭代次数,k为簇的数目,m为记录数,n为维数;

空间复杂度:O((m+k)n),其中,k为簇的数目,m为记录数,n为维数。

适用范围:

K-menas算法试图找到使平凡误差准则函数最小的簇。当潜在的簇形状是凸面的,簇与簇之间区别较明显,且簇大小相近时,其聚类结果较理想。前面提到,该算法时间复杂度为O(tkmn),与样本数量线性相关,所以,对于处理大数据集合,该算法非常高效,且伸缩性较好。但该算法除了要事先确定簇数K和对初始聚类中心敏感外,经常以局部最优结束,同时对“噪声”和孤立点敏感,并且该方法不适于发现非凸面形状的簇或大小差别很大的簇。

缺点:

1、聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;
2、Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。(可以使用K-means++算法来解决)

算法代码实现:
main.m

clear all;
close all;
clc;%第一类数据
mu1=[0 0 0];  %均值
S1=[0.3 0 0;0 0.35 0;0 0 0.3];  %协方差
data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据%%第二类数据
mu2=[1.25 1.25 1.25];
S2=[0.3 0 0;0 0.35 0;0 0 0.3];
data2=mvnrnd(mu2,S2,100);%第三个类数据
mu3=[-1.25 1.25 -1.25];
S3=[0.3 0 0;0 0.35 0;0 0 0.3];
data3=mvnrnd(mu3,S3,100);%显示数据
plot3(data1(:,1),data1(:,2),data1(:,3),'+');
hold on;
plot3(data2(:,1),data2(:,2),data2(:,3),'r+');
plot3(data3(:,1),data3(:,2),data3(:,3),'g+');
grid on;%三类数据合成一个不带标号的数据类
data=[data1;data2;data3];   %这里的data是不带标号的%k-means聚类
[u re]=KMeans(data,3);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
[m n]=size(re);%最后显示聚类后的数据
figure;
hold on;
for i=1:m if re(i,4)==1   plot3(re(i,1),re(i,2),re(i,3),'ro'); elseif re(i,4)==2plot3(re(i,1),re(i,2),re(i,3),'go'); else plot3(re(i,1),re(i,2),re(i,3),'bo'); end
end
grid on;

K-Means.m

%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据
function [u re]=KMeans(data,N)   [m n]=size(data);   %m是数据个数,n是数据维数ma=zeros(n);        %每一维最大的数mi=zeros(n);        %每一维最小的数u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置for i=1:nma(i)=max(data(:,i));    %每一维最大的数mi(i)=min(data(:,i));    %每一维最小的数for j=1:Nu(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些end      endwhile 1pre_u=u;            %上一次求得的中心位置for i=1:Ntmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备for j=1:mtmp{i}=[tmp{i};data(j,:)-u(i,:)];endendquan=zeros(m,N);for i=1:m        %公式一的实现c=[];for j=1:Nc=[c norm(tmp{j}(i,:))];end[junk index]=min(c);quan(i,index)=norm(tmp{index}(i,:));           endfor i=1:N            %公式二的实现for j=1:nu(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));end           endif norm(pre_u-u)<0.1  %不断迭代直到位置不再变化break;endendre=[];for i=1:mtmp=[];for j=1:Ntmp=[tmp norm(data(i,:)-u(j,:))];end[junk index]=min(tmp);re=[re;data(i,:) index];endend

K-means、和KNN算法比较

KNN(K-Nearest Neighbor)介绍

算法思路:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
看下面这幅图:

这里写图片描述

KNN的算法过程是是这样的:
  从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是我们待分类的数据。
  如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形
  如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形
  我们可以看到,KNN本质是基于一种数据统计的方法!其实很多机器学习算法也是基于数据统计的。
  KNN是一种memory-based learning,也叫instance-based learning,属于lazy learning。即它没有明显的前期训练过程,而是程序开始运行时,把数据集加载到内存后,不需要进行训练,就可以开始分类了。
  具体是每次来一个未知的样本点,就在附近找K个最近的点进行投票。

KNN和K-Means的区别

这里写图片描述

参考:

1、 Kmeans、Kmeans++和KNN算法比较

2、matlab练习程序(k-means聚类)


相关博客:

1、机器学习系列之机器学习之决策树(Decision Tree)及其Python代码实现

2、机器学习系列之机器学习之Validation(验证,模型选择)

3、机器学习系列之机器学习之Logistic回归(逻辑蒂斯回归)

4、机器学习系列之机器学习之拉格朗日乘数法

5、机器学习系列之机器学习之深入理解SVM

具体更多资源可前往机器学习专题


http://chatgpt.dhexx.cn/article/iUwMT15O.shtml

相关文章

KNN算法代码实现

原理&#xff1a; KNN 算法也叫K近邻算法。假设给定一个训练数据集&#xff0c;其中的实例类别已定。它是通过找到一个数据集中与目标数据最近的K个邻居&#xff0c;然后通过多数表决等方式来预测目标数据的分类结果进行预测。 三要素&#xff1a; 距离度量、K值、分类决策规…

KNN中的优化算法KD-tree

我们知道KNN是基于距离的一个简单分类算法&#xff0c;熟悉KNN的都知道&#xff0c;我们要不断计算两个样本点之间的距离&#xff0c;但是&#xff0c;试想一下&#xff0c;如果数据量特别大的时候&#xff0c;我们要每个都计算一下&#xff0c;那样计算量是非常大的&#xff0…

KNN算法代码

一、K近邻算法 KNN是一种监督学习类别的算法&#xff0c;全称&#xff08;K-NearestNeighbor&#xff09;直译为K个最近的邻居&#xff0c;是一种聚类算法。该算法认为我们在判断一个物体的类别可以根据与他非常相似的K个物体的类别&#xff08;这K个物体的类别是已知的&#x…

KNN数据缺失值填充(附源码和数据)不调用包

KNN估计 数据缺失值填充—KNN估计一、基本思想二、步骤1.导入数据2.查看空缺值3.取出要分析的数据4.计算平均值5.计算标准差6.规范化7.计算欧几里得距离8.最优解9.画图 总结 数据缺失值填充—KNN估计 运行环境 python3.6 jupyter notebook 一、基本思想 先将数据标准化&…

数据挖掘——KNN算法的实现

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;练习时长两年半的java博主 &#x1f4d6;个人主页&#xff1a;君临๑ &#x1f381; ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

KNN算法调优

1.所用方法: 交叉验证与网格搜索 交叉验证(为了让被评估的模型更加精确可信): 所有训练集数据分成N等分&#xff0c;几等分就是几折交叉验证 网格搜索:调参数 K-近邻:超参数K 2.API: sklearn.model_selection.GridSearchCV&#xff1a; CV即cross validation…

计算机编程—必备基础知识点

目录&#xff1a; 1. 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别 2. 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1. 编程语言 1.1 编程 编程&#xff1a;就是让计算机为解决某个问题而使用某种程序设计语言编…

计算机概论--计算机基础知识快速入门

0.前言1.计算机&#xff1a;辅助人脑的好工具 1.1计算机硬件的五大单元1.2CPU的种类1.3接口设备1.4运作流程 2.个人计算机架构与接口设备 2.1CPU2.2内存2.3显卡2.4硬盘与存储设备2.5主板 3.软件程序执行 3.1机器程序与编译程序3.2操作系统 3.2.1操作系统内核3.2.2系统调用 3.3小…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中&#xff0c;只有两样东西&#xff0c;文件和文件夹。 文件夹&#xff1a;本身不存储数据内容。文件夹是用来组织和管理文件的。 文件&#xff1a; 所有的txt文本文档&#xff0c;音乐&#xff0c;视频&#xff0c;图…

【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解

这是一个新坑&#xff0c;希望大家喜欢 电脑的基础知识大全&#xff0c;你确定都知道? 一、软件系统 软件系统包括&#xff1a;操作系统、应用软件等。应用软件中电脑行业的管理软件&#xff0c;IT电脑行业的发展必备利器&#xff0c;电脑行业的erp软件。 二、硬件系统 硬件系…

计算机知识01:计算机基础知识入门

1. 计算机运行流程 如果不是很了解电脑运行流程的话&#xff0c;我们可以类比一下&#xff0c;假设电脑是一个人体&#xff0c;那么每个元件对应到哪个地方呢&#xff1f;可以这样思考&#xff1a; CPU脑袋&#xff1a;每个人会做的事情都不一样&#xff08;微指令集的差异&a…

IP地址(IP Address)

IP Address在网络中&#xff0c;通信节点都需要一个IP地址 以点分十进制表示&#xff0c;有32位二进制构成&#xff08;大约43亿&#xff09; 分为两个部分&#xff1a;网络位和主机位 网络位&#xff1a;代表IP地址所属的网段 主机位&#xff1a;代表网点上的某个节点 由子…

IP地址构成 ,以及如何求“网络地址“以及“广播地址“

IP地址&#xff08;英语&#xff1a;IP Address, 全称&#xff1a;Internet Protocol Address&#xff09;又称互联网协议地址。当设备连接网络&#xff0c;设备将被分配一个IP地址&#xff0c;用作标识。通过IP地址&#xff0c;设备间可以互相通讯&#xff0c;如果没有IP地址&…

电话号码对应的英语单词

问题&#xff1a; 电话的号码盘一般可以用于输入字母&#xff0c;如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872&#xff0c;可以依次输出其代表的所有字母组合。如&#xff1a;jtmwtpa,jtmwtpb......... 1、您能否可以根据这样的对应关系设计一个程序&#xff…

地址的概念

前言&#xff1a;地址的概念 1. 地址概念及各个单位换算1.1 地址的概念1.2 单位换算1.3 举例说明&#xff0c;加深理解1.4 关于地址的宽度 1. 地址概念及各个单位换算 1.1 地址的概念 计算机内的数据是存储在地址里面的&#xff0c;地址又是以字节&#xff08;Byte&#xff09…

地址的地址?

在visual studio 2019中 #include <stdio.h> #include <stdlib.h> typedef struct student { int value; struct student* next_stu; }Student; Student * creatlist(); void insertlist(Student * list,int value); int main() { Student *my_list…

GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)

转载▼ 标签&#xff1a; 杂谈 国内的有道词典和金山词典由于使用方便、宣传到位得到了许多同学的喜爱。在开源软件的领域&#xff0c;也有一款非常好用的词典GoldenDict&#xff0c;它的强项在于可以直接使用众多词典厂商的词库。那些正规的词典厂商通常购买了词典的版权…

【GO】map转json

咔咔博客之map转json 跟结构体转json一样都使用的是json.Marshal()方法 最后需要就是把字节转为字符串使用string即可 案例 func main() {// 定义了interface 后边就可以跟任意类型了mMap : make(map[string]interface{})mMap["博客地址"] "blog.fangkang.to…

Json4s的一些用法 JSon转对象实体 Json转Map Map转Json

Json4s 全称就是Json For Scala&#xff0c;为Scala而生 首先上Maven依赖配置&#xff0c;其实Spark中自带了Json4s如果是编写Spark代码,并不需要单独引用Json4s的依赖了 <dependency><groupId>org.json4s</groupId><artifactId>json4s-jackson_2.11&…

map转json字符串字段排序

需求&#xff1a;map转成json字符串&#xff0c;要求字段按字母升序排列 package com.data.test;import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFe…