K-means聚类 —— matlab

目录

1.简介

2.算法原理

3.实例分析

3.1 读取数据

3.2 原理推导K均值过程

3.3 自带kmeans函数求解过程

完整代码


1.简介

        聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。

        K均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目K,K由用户指定,K均值算法根据某个距离函数反复把数据分入K个聚类中。

2.算法原理

        K-means算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

K-mean算法步骤如下:

(1)随机选取K个样本为中⼼

(2)分别计算所有样本到随机选取的K个中⼼的距离

(3)样本离哪个中⼼近就被分到哪个中⼼

(4)计算各个中⼼样本的均值(最简单的⽅法就是求样本每个维度的平均值)作为新的中心

(5)重复(2)(3)(4)直到新的中⼼和原来的中⼼基本不变化的时候,算法结束

3.实例分析

数据来源于:统计年鉴

从数据中,我们可以看到,实际数据是被分为三类的。

3.1 读取数据

data=xlsread('D:\桌面\kmeans.xlsx')

返回:

在这里我们看到,xlsread读取数据时没有读取变量名,但序号也被加进去了,接下来我们需要将其剔除

data=data(:,2:7)

返回:

3.2 原理推导K均值过程

%% 原理推导K均值
[m,n]=size(data); %读取数据的行数与列数
cluster_num=3; %自定义分类数
cluster=data(randperm(m,cluster_num),:);
epoch_max=1000;%最大次数
therad_lim=0.001;%中心变化阈值
epoch_num=0;
while(epoch_num<epoch_max)epoch_num=epoch_num+1;for i=1:cluster_numdistance=(data-repmat(cluster(i,:),m,1)).^2;distance1(:,i)=sqrt(sum(distance'));end[~,index_cluster]=min(distance1');for j=1:cluster_numcluster_new(j,:)=mean(data(find(index_cluster==j),:));endif (sqrt(sum((cluster_new-cluster).^2))>therad_lim)cluster=cluster_new;elsebreak;end
end
%% 画出聚类效果
figure(2)
subplot(2,1,1)
a=unique(index_cluster); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)C(1,i)={find(index_cluster==a(i))};
end
for j=1:cluster_numdata_get=data(C{1,j},:);scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);hold on
end
plot(cluster(:,1),cluster(:,2),'kd','LineWidth',2);
hold on
sc_t=mean(silhouette(data,index_cluster'));
title_str=['原理推导K均值聚类','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_t)];
title(title_str)

返回:

3.3 自带kmeans函数求解过程

%% MATLAB自带kmeans函数
subplot(2,1,2) %画子图,在这里是一图上可画两张子图
cluster_num=3; %自定义分类数
[index_km,center_km]=kmeans(data,cluster_num) ;%MATLAB自带kmeans函数
a=unique(index_km); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)C(1,i)={find(index_km==a(i))};
end
for j=1:cluster_numdata_get=data(C{1,j},:);scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);hold on
end
plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2);
hold on
sc_k=mean(silhouette(data,index_km));
title_str1=['MATLAB自带kmeans函数','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_k)];
title(title_str1)

返回结果如下:

完整代码

clear;clc;
data=xlsread('D:\桌面\kmeans.xlsx')
data=data(:,2:7)
%% 原理推导K均值
[m,n]=size(data); %读取数据的行数与列数
cluster_num=3; %自定义分类数
cluster=data(randperm(m,cluster_num),:);
epoch_max=1000;%最大次数
therad_lim=0.001;%中心变化阈值
epoch_num=0;
while(epoch_num<epoch_max)epoch_num=epoch_num+1;for i=1:cluster_numdistance=(data-repmat(cluster(i,:),m,1)).^2;distance1(:,i)=sqrt(sum(distance'));end[~,index_cluster]=min(distance1');for j=1:cluster_numcluster_new(j,:)=mean(data(find(index_cluster==j),:));endif (sqrt(sum((cluster_new-cluster).^2))>therad_lim)cluster=cluster_new;elsebreak;end
end
%% 画出聚类效果
figure
subplot(2,1,1) %画子图,在这里是一图上可画两张子图
a=unique(index_cluster); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)C(1,i)={find(index_cluster==a(i))};
end
for j=1:cluster_numdata_get=data(C{1,j},:);scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);hold on
end
plot(cluster(:,1),cluster(:,2),'kd','LineWidth',2);
hold on
sc_t=mean(silhouette(data,index_cluster'));
title_str=['原理推导K均值聚类','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_t)];
title(title_str)%% MATLAB自带kmeans函数
subplot(2,1,2) %画子图,在这里是一图上可画两张子图
cluster_num=3; %自定义分类数
[index_km,center_km]=kmeans(data,cluster_num) ;%MATLAB自带kmeans函数
a=unique(index_km); %找出分类出的个数
C=cell(1,length(a));
for i=1:length(a)C(1,i)={find(index_km==a(i))};
end
for j=1:cluster_numdata_get=data(C{1,j},:);scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);hold on
end
plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2);
hold on
sc_k=mean(silhouette(data,index_km));
title_str1=['MATLAB自带kmeans函数','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_k)];
title(title_str1)

返回:

每次返回结果也不尽相同,原理推导的和自带的函数的求解结果也相差不是很大,但与原始数据的分类相比较,还是有一定差距

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

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

相关文章

Java @SuppressWarnings注解

J2SE提供的最后一个注解是SuppressWarnings。该批注的作用是给编译器一条指令&#xff0c;告诉它对被批注的代码元素内部的某些警告保持静默。 SuppressWarnings注解允许您选择性地取消特定代码段&#xff08;即&#xff0c;类或方法&#xff09;中的警告。其中的想法是当您看…

数据线给电脑联网是什么原理_物联网孵化的产物——条码扫描器

一、什么是物联网&#xff1f;物联网的概念由凯文阿什顿(Kevin Ashton)于1999年被提出&#xff0c;即Internet of Things(IOT)&#xff0c;也称为Web of Things。根据阿什顿的想法&#xff0c;计算机最终能够在没有人工干预的情况下&#xff0c;自主产生及收集数据&#xff0c;…

灰色关联法 —— matlab

目录 1.简介 2.算法详解 2.1 数据标准化 2.2 计算灰色相关系数 2.3 计算灰色关联度系数 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 绘制 x1,x4,x5,x6,x7 的折线图 3.4 计算灰色相关系数 完整代码 1.简介 对于两个系统之间的因素&#xff0c;其随时间或不同对象而…

灰色关联与TOPSIS法 —— matlab

目录 1.简介 2.算法详解 2.1 指标正向化及标准化 2.2 找到最大最小参考向量 2.3 计算与参考向量的相关系数 2.4 求评分 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 得到最大最小参考行 3.4 与最大值的灰色相关系数 3.5 与最小值的灰色相关系数 3.6 计算综合评分 …

Java @SafeVarargs注解

在介绍 SafeVarargs 注解用法之前&#xff0c;先来看看如下代码&#xff1a; public class HelloWorld {public static void main(String[] args) {// 传递可变参数&#xff0c;参数是泛型集合display(10, 20, 30);// 传递可变参数&#xff0c;参数是非泛型集合display("…

mmap函数_Linux内存映射mmap原理分析

一直都对内存映射文件这个概念很模糊&#xff0c;不知道它和虚拟内存有什么区别&#xff0c;而且映射这个词也很让人迷茫&#xff0c;今天终于搞清楚了。。。下面&#xff0c;我先解释一下我对映射这个词的理解&#xff0c;再区分一下几个容易混淆的概念&#xff0c;之后&#…

灰色关联法 —— python

目录 1.简介 2.算法详解 2.1 数据标准化 2.2 计算灰色相关系数 2.3 计算灰色关联度系数 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 绘制 x1,x4,x5,x6,x7 的折线图 3.4 计算灰色相关系数 完整代码 1.简介 对于两个系统之间的因素&#xff0c;其随时间或不同对象而变…

arraylist线程安全吗_Java中的集合和线程安全

通过Java指南我们知道Java集合框架(Collection Framework)如何为并发服务&#xff0c;我们应该如何在单线程和多线程中使用集合(Collection)。话题有点高端&#xff0c;我们不是很好理解。所以&#xff0c;我会尽可能的描述的简单点。通过这篇指南&#xff0c;你将会对Java集合…

Java @FunctionalInterface注解

FunctionalInterface 就是用来指定某个接口必须是函数式接口&#xff0c;所以 FunInterface 只能修饰接口&#xff0c;不能修饰其它程序元素。 函数式接口就是为 Java 8 的 Lambda 表达式准备的&#xff0c;Java 8 允许使用 Lambda 表达式创建函数式接口的实例&#xff0c;因此…

灰色关联与TOPSIS法 —— python

目录 1.简介 2.算法详解 2.1 指标正向化及标准化 2.2 找到最大最小参考向量 2.3 计算与参考向量的相关系数 2.4 求评分 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 得到最大最小参考行 3.4 与最大值的灰色相关系数 3.5 与最小值的灰色相关系数 3.6 计算综合评分…

spark 数据框 删除列_pandas 常用的数据处理函数

在数据分析过程中&#xff0c;首先就是对数据进行清洗和处理&#xff0c;而使用 python 进行处理的朋友们&#xff0c;对 pandas 包肯定是熟悉不过的了。pandas 的功能很强大&#xff0c;基本的数据处理操作都可以找到对应函数去使用&#xff0c;想全面了解的朋友可以查看相关文…

Java元注解作用及使用

元注解是负责对其它注解进行说明的注解&#xff0c;自定义注解时可以使用元注解。Java 5 定义了 4 个注解&#xff0c;分别是 Documented、Target、Retention 和 Inherited。Java 8 又增加了 Repeatable 和 Native 两个注解。这些注解都可以在 java.lang.annotation 包中找到。…

灰色预测法 —— matlab

目录 1.简介 2.算法详解 2.1 生成累加数据 2.2 累加后的数据表达式 2.3 求解2.2的未知参数 3.实例分析 3.1 导入数据 3.2 进行累加数据 3.3 求解系数 3.4 预测数据及对比 完整代码 1.简介 灰色系统理论认为对既含有已知信息又含有未知或非确定信息的系统进行预测&a…

jpa 自定义sql if_SpringBoot整合JPA实现多数据源及读写分离

SpringBoot整合JPA实现多数据源及读写分离项目地址&#xff1a;https://github.com/baojingyu/spring-boot-jpa-dynamic-datasource本项目使用 SpringBoot 和 SpringData JPA 实现多数据源&#xff0c;动态数据源的切换。前段时间写 MySQL 主从复制的技术分享&#xff0c;我就在…

时间序列分析简介

目录 1.引言 2.时间序列的定义 3.时间序列分析方法 &#xff08;1&#xff09;描述性时间序列分析 &#xff08;2&#xff09;统计时序分析 时序分析方法 时域分析方法 1.引言 最早的时间序列分析可以追溯到7000年前&#xff0c;古埃及把尼罗河涨落的情况逐天记录下来&a…

jupyter notebook和python有什么区别_Jupyter Notebook 有哪些奇技淫巧?

Towards Data Science专栏的作者Parul Pandey总结了七大Jupyter的进阶用法&#xff1a; 一、执行shell命令 Shell是一种与计算机进行文本交互的方式。 一般来讲&#xff0c;当你正在使用Python编译器&#xff0c;需要用到命令行工具的时候&#xff0c;要在shell和IDLE之间进行切…

时间序列的预处理

目录 一、特征统计量 1.概率分布 2.特征统计量 二、平稳时间序列的定义 严平稳与宽平稳的关系 三、平稳时间序列的统计性 四、平稳性的重大意义 五、平稳性检验 时序图检验 自相关图检验 R绘图 一、特征统计量 平稳性是某些时间序列具有的一种统计特征要描述清楚这个…

Java系统流

每个 Java 程序运行时都带有一个系统流&#xff0c;系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流&#xff0c;分别通过 in、out 和 err 变量来引用。这 3 个系统流如下所示&#xff1a; System.in&#xff1a;标准输入流&#xff0c;默认设…

R中‘ts‘ object must have one or more observations

错误如下&#xff1a; 为什么会出现&#xff0c;如下错误是因为我读取数据是&#xff0c;没有对数据进行分割&#xff0c;而是直接读取&#xff0c;然后使用的 最初读取方式为&#xff1a; 改变后的读取方式&#xff1a; 此时&#xff0c;再调用上面提示错误的那行代码试试&am…

python编码和解码_uu --- 对 uuencode 文件进行编码与解码 — Python 3.7.9 文档

uu --- 对 uuencode 文件进行编码与解码 此模块使用 uuencode 格式来编码和解码文件&#xff0c;以便任意二进制数据可通过仅限 ASCII 码的连接进行传输。 在任何要求文件参数的地方&#xff0c;这些方法都接受文件类对象。 为了保持向下兼容&#xff0c;也接受包含路径名称的字…