备战数学建模44-聚类模型(攻坚站8)

2023-11-03

“物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。聚类和上一讲分类的区别:分类是已知类别的,聚类未知。常用的聚类有基于距离的:包括K-means和系统聚类等,基于密度的DASCAN算法等。

目录

一、Keans和K-means++算法

1.1、K-means算法

1.2、K-means++算法

 二、系统(层次)聚类

2.1、系统聚类基本原理

2.2、系统聚类SPSS实现

 三、DBSCAN算法

3.1、DBSCAN算法基本原理

 3.2、DBSCAN算法MATLAB实现


一、Keans和K-means++算法

1.1、K-means算法

我们可以看一下K-means聚类的基本步骤:一、指定需要划分的簇[cù]的个数K值(类的个数);
二、随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点); 三、计算其余的各个数据对象到这K个初始聚类中心的距离,把数据对象划归到距离它最近的那个中心所
处在的簇类中;四、调整新类并且重新计算出新类的中心;五、循环步骤三和四,看中心是否收敛(不变),如果收敛或达到迭代次数则停止循环;六、结束。

K-means算法由如下优缺点,对于缺点2和缺点3,一般常采用K-means++算法进行改进。

优点:
(1)算法简单、快速。
(2)对处理大数据集,该算法是相对高效率的。
缺点:
(1)要求用户必须事先给出要生成的簇的数目K。
(2)对初值敏感。
(3)对于孤立点数据敏感。 

1.2、K-means++算法

k-means++算法选择初始聚类中心的基本原则是:初始的聚类中心之间的相互距离要尽可能的远
算法描述如下:只对K-means算法“初始化K个聚类中心” 这一步进行了优化)
步骤一:随机选取一个样本作为第一个聚类中心;
步骤二:计算每个样本与当前已有聚类中心的最短距离(即与最近一个聚类中心的距离),这个值越大,表示被选取作为聚类中心的概率较大;最后,用轮盘法(依据概率大小来进行抽选)选出下一个聚类中心;
步骤三:重复步骤二,直到选出K个聚类中心。选出初始点后,就继续使用标准的K-means算法了。

下面演示使用SPSS完成聚类操作,SPSS默认使用的是K-means++算法实现的,这里面我选择的K是3,即聚类成3个,可以描述成发达城市,中部城市和不发达城市。

使用SPSS进行K-means++聚类,虽然可以很好地选择聚类中心,但是对于聚类中心的个数K的问题,还是需要主观堆的经验判断,所以还是有缺点的。如果出现数据量纲不同,应该先进行数据规范化处理,再进行聚类,SPSS勾选将标准值另存为变量,即可实现数据的标准化处理。

 二、系统(层次)聚类

2.1、系统聚类基本原理

系统聚类的过程不需要提前设置聚类个数和初始聚类点,系统聚类的流程如下:

系统(层次)聚类的算法流程:
一、将每个对象看作一类,计算两两之间的最小距离;
二、将距离最小的两个类合并成一个新类;
三、重新计算新类与所有类之间的距离;
四、重复二三两步,直到所有类最后合并成一类;
五、画聚类图决定分类个数和类别。

 对于需要计算的距离,对于样本与样本之间的距离,常用的距离公式如下:

 对于指标和指标之间的距离,常用的距离计算公式如下:

另外,类与类之间的距离常用的计算方式有如下几种:

1)最短距离法

 2)最长距离法

3)组间/组内平均连接法

 4)重心法

2.2、系统聚类SPSS实现

在Spss中选择系统聚类,导入变量,如果量纲不同,可以消除, 可以设置绘制谱系图等。

谱系图如下所示,图中的红线是我画上去的,通过红线可以确定分类的个数,主要根据可解释性划分类别,该图中横轴表示各类之间的距离。

 另外除了在图中画竖线确定K的个数,另外有一种常见的方法用来确定聚类数K的值,就是肘部法,具体如下:

 我们通过SPSS进行系统聚类,会生成聚合系数,我们将聚合系数由大到小降序排列后绘图,找到类似肘部的点,即为聚类类别数K。

我们可以看到绘制的图形中可以去K=3或者K=5,是最好的类别,至于具体取哪个,结合具体的解释性,哪个解释性强,取哪个。

确定聚类个数K后,可以保存聚类结果并绘图,具体如下,当然只能绘制2维或者3维图,即只有当有2个或者三个变量进行聚类才能绘制出图形。

最后绘制的二维和三维图形如下所示:

 

 三、DBSCAN算法

3.1、DBSCAN算法基本原理

DBSCAN算法是具有噪声的基于密度的聚类方法,根据挨的近按一定的数量进行聚类。

 DBSCAN算法的数据分类如下:主要分成三类,即核心点,边界点,噪声点。

DBSCAN算法的优缺点如下:其实除非指标绘制的散点图有明显的特殊形状,可以考虑使用DBSCAN算法,一般还是用系统聚类比较好。

 3.2、DBSCAN算法MATLAB实现

主函数如下,脚本主程序如下:

clc;
clear;
close all;

%% Load Data

load smile;
X = smile;

%% Run DBSCAN Clustering Algorithm

epsilon=0.5;
MinPts=10;
IDX=DBSCAN(X,epsilon,MinPts);


%% Plot Results
 %如果只要两个指标的话就可以画图啦
PlotClusterinResult(X, IDX);
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);

DBSCAN算法实现的函数如下:
 

function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)

    C=0;
    
    n=size(X,1);
    IDX=zeros(n,1);  % 初始化全部为0,即全部为噪音点
    
    D=pdist2(X,X);
    
    visited=false(n,1);
    isnoise=false(n,1);
    
    for i=1:n
        if ~visited(i)
            visited(i)=true;
            
            Neighbors=RegionQuery(i);
            if numel(Neighbors)<MinPts
                % X(i,:) is NOISE
                isnoise(i)=true;
            else
                C=C+1;
                ExpandCluster(i,Neighbors,C);
            end
            
        end
    
    end
    
    function ExpandCluster(i,Neighbors,C)
        IDX(i)=C;
        
        k = 1;
        while true
            j = Neighbors(k);
            
            if ~visited(j)
                visited(j)=true;
                Neighbors2=RegionQuery(j);
                if numel(Neighbors2)>=MinPts
                    Neighbors=[Neighbors Neighbors2];   %#ok
                end
            end
            if IDX(j)==0
                IDX(j)=C;
            end
            
            k = k + 1;
            if k > numel(Neighbors)
                break;
            end
        end
    end
    
    function Neighbors=RegionQuery(i)
        Neighbors=find(D(i,:)<=epsilon);
    end

end

绘图的matlab代码如下:

function PlotClusterinResult(X, IDX)

    k=max(IDX);

    Colors=hsv(k);

    Legends = {};
    for i=0:k
        Xi=X(IDX==i,:);
        if i~=0
            Style = 'x';
            MarkerSize = 8;
            Color = Colors(i,:);
            Legends{end+1} = ['Cluster #' num2str(i)];
        else
            Style = 'o';
            MarkerSize = 6;
            Color = [0 0 0];
            if ~isempty(Xi)
                Legends{end+1} = 'Noise';
            end
        end
        if ~isempty(Xi)
            plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);
        end
        hold on;
    end
    hold off;
    axis equal;
    grid on;
    legend(Legends);
    legend('Location', 'NorthEastOutside');

end

我们可以看到使用的smile数据集,最后聚类成3个部分,刚好是一个 微笑的表情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

备战数学建模44-聚类模型(攻坚站8) 的相关文章

随机推荐

  • 生命在于学习——SQL注入绕过

    一 SQL注入绕过介绍 SQL注入绕过技术已经是一个老生常淡的内容了 防注入可以使用某些云waf加速乐等安全产品 这些产品会自带waf属性拦截和抵御SQL注入 也有一些产品会在服务器里安装软件 例如iis安全狗 d盾 还有就是在程序理论对输
  • C语言奇奇怪怪表达式‘abcd‘,及操作符详解

    前言 回顾操作符和一些表达式方面的知识 表达式及操作符 前言 算术操作符 位操作符 gt gt lt lt gt gt 算数右移 逻辑右移 lt lt 小结 有0则为0 两个1才为1 有1则为1 两个0才为0 按位取反 符号位要参与吗 要参
  • OpenStack--部署块存储cinder

    通过 cinder 使用 lvm 卷提供后端存储 官方部署文档 https docs openstack org ocata zh CN install guide rdo cinder html 1 数据库准备 1 创建数据库并授权 ro
  • 四 通用目标之make modules的执行过程分析

    搜索顶层makefile发现会有两个modules目标 它们的定义分别如图3 13和3 14 查看代码发现它们分别位于ifeq KBUILD EXTMOD 和else的条件中 KBUILD EXTMOD的定义可以参考图2 5 即若编译的为外
  • 小学六年级计算机知识点总结,【小学六年级数学总复习知识点归纳】

    一 复习内容 1 分数乘除法 分数乘 除法属于分数的基本知识和技能 而且两者关系密切 教材将这两部分内容集中安排 教材首先通过一组题目 强调分数乘除法的关系 即分数除法是分数乘法的逆运算 同时对分数乘除法的计算方法进行了复习 比的相关概念
  • C++第七次实验——作业

    项目1 include
  • Qt多线程http下载器之二:仿迅雷新建下载任务

    一 效果 下图是迅雷9的新建任务界面 目前最新的版本是迅雷11 迅雷9已无法准确检测出文件大小 但任然能正常下载 个人觉得迅雷9的新建任务界面更美观 故仿之 下图是我用Qt实现的效果 功能和迅雷9类似 复制下载url到输入框 迅雷能够自动解
  • JavaWeb基础6——Request,Response,JSP&MVC

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 一 Request Response概述 二 R
  • MsSqlServer配置管理器TCP/IP属性

    TCP IP 属性 IP 地址 选项卡 使用 TCP IP 属性 IP 地址 选项卡 对话框 可以配置特定 IP 地址的 TCP IP 协议选项 只有选中 IP All 才能一次配置所有地址的 TCP 动态端口 和 TCP 端口 更改在重启
  • OpenCV使用imread读取图片失败解决方案

    使用一下代码读取图像 出现 WARN 0 1 635 global D a opencv python opencv python opencv modules imgcodecs src loadsave cpp 239 cv findD
  • pymongo.errors.ConfigurationError: All nameservers failed to answer the query _mongodb

    pycharm一直报错 安装了最新版的python也没用 我现在用的是python3 6版本进行代码运行 代码如下 运行就报错 反反复复找了很久终于解决 需要在导入pymongo之前导入此代码 import dns resolver dns
  • 51个常用免费工具列表

    2023 年可用于查找 分析和研究加密货币的 51 个免费网站和指标 一 发现新代币和项目 https coinmarketcap com ico calendar 查市值 即将推出的 ICO 和 IDO 的信息 https coinbra
  • linux整理-GUN讲解, GPL LGPL BSD等各种开源协议许可证的区分

    什么是GUN GNU 1983年 Richard Stallman 理查德 马修 斯托曼 创立GNU计划 一套完全自由的操作系统 其内容软件完全以GPL方式发布 这个操作系统是GNU计划的主要目标 发展出一套完整的开放源代码操作系统来取代U
  • Linux 内核ethtool框架新增刷网卡firmware功能

    原文地址 http blog csdn net macrocrazier article details 6340452 现在的网卡 尤其是智能网卡 高速网卡 硬件性能越来越强大 承载的功能也越来越多 开发者对网卡内部功能的增加或修改 对已
  • openwrt开发使用-增加启动脚本

    前言 在使用openwrt时候我们会遇到增加自定义的开机启动任务活脚本 今天给大家分享一下openwrt中设置一个开机启动脚本的操作 作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me o
  • AI 智能对话 - 基于 ChatGLM2-6B 训练对话知识库

    前情提要 怎么将 AI 应用到工作中呢 比如让 AI 帮忙写代码 自己通过工程上的思维将代码整合排版 我挺烦什么代码逻辑严谨性的问题 但是我又不得不承认这样的好处 我们要开始将角色转换出来 不应该是一个工具人 而成为决策者 这是从 AI 爆
  • flutter使用:barcode_scan出现注册清单问题

    问题 使用出现activity是否有注册到清单文件问题 如 android content ActivityNotFoundException Unable to find explicit activity class com met m
  • Unity中触摸和鼠标操作的几个问题

    关键点1 在unity中touch事件同时也会触发GetMouseButton事件 有时候可能会给你带来方便 但是如果没有意识到这个问题的话 也很可能给你带来很大的麻烦 关键点2 触摸操作也可以使用Input GetAxis Mouse X
  • IGH_Master主站配置驱动伺服电机和变频器总结

    IGH Master主站配置驱动伺服电机和变频器总结 Ethercat是倍福公司提出的一种工业现场总线协议 具有很好的实时性 IGH是一种开源的Ethercat主站实现协议 本文总结了一下使用IGH Master驱动伺服电机和变频器的经验
  • 备战数学建模44-聚类模型(攻坚站8)

    物以类聚 人以群分 所谓的聚类 就是将样本划分为由类似的对象组成的多个类的过程 聚类后 我们可以更加准确的在每个类中单独使用统计模型进行估计 分析或预测 也可以探究不同类之间的相关性和主要差异 聚类和上一讲分类的区别 分类是已知类别的 聚类