聚类方法K-means和DBSCAN,附matlab代码

目录

引言

聚类的主要特点

聚类算法的主要步骤

聚类的应用场景

聚类算法的局限性

聚类方法

1. K-means聚类算法

2. DBSCAN聚类算法

3. 层次聚类算法


引言

聚类(Clustering)是数据挖掘和统计学中的一个重要概念,它是一种无监督学习的方法,用于将数据集中的样本或观测值分组为若干个类或簇(Cluster),使得同一簇内的样本之间相似度较高,而不同簇的样本之间相似度较低。与监督学习(如分类)不同,聚类不需要事先知道每个样本的类别标签,它完全基于数据本身的特征来进行分组。

聚类的主要特点

  1. 无监督学习:聚类算法不需要训练数据集中的标签信息,它们仅根据数据本身的特征来发现数据的内在结构。
  2. 发现隐藏模式:聚类可以帮助我们发现数据中的隐藏模式或群组,这些群组可能对应着数据的不同类别或子群体。
  3. 多样性和灵活性:存在多种聚类算法,每种算法都有其独特的优势和适用场景,如基于距离的聚类(如K-means)、基于密度的聚类(如DBSCAN)、基于层次的聚类(如AGNES和DIANA)等。

聚类算法的主要步骤

  1. 特征选择:选择用于聚类的数据特征。
  2. 相似性度量:定义如何计算样本之间的相似性或距离。
  3. 聚类算法选择:根据数据的特性和需求选择合适的聚类算法。
  4. 执行聚类:应用选定的聚类算法对数据进行分组。
  5. 评估聚类结果:评估聚类结果的质量,可能需要根据实际需求进行多次迭代调整。
  6. 结果解释和应用:解释聚类结果,并将其应用于实际问题解决中。

聚类的应用场景

聚类在多个领域都有广泛的应用,包括但不限于:

  • 市场细分:将消费者根据购买行为、偏好等特征进行分组,以制定更精准的营销策略。
  • 生物信息学:对基因表达数据进行聚类,以发现具有相似表达模式的基因群组。
  • 图像处理:对图像中的像素或特征进行聚类,以实现图像分割、目标检测等任务。
  • 社交网络分析:对用户或群组进行聚类,以发现社交网络中的社区结构或用户行为模式。
  • 文本挖掘:对文档或文本数据进行聚类,以发现主题或信息类别。

聚类算法的局限性

尽管聚类具有广泛的应用,但它也存在一些局限性:

  • 聚类结果的不确定性:由于聚类是无监督学习,聚类结果可能受到算法选择、参数设置等多种因素的影响,导致结果具有一定的不确定性。
  • 对数据质量的依赖:聚类效果很大程度上依赖于输入数据的质量,如数据的完整性、准确性等。
  • 难以解释性:在某些情况下,聚类结果可能难以直观解释或理解,特别是对于高维数据或复杂数据集。

总之,聚类是一种强大的数据分析工具,它可以帮助我们发现数据中的隐藏模式和群组结构,为后续的决策分析提供有力支持。然而,在实际应用中,我们也需要充分考虑其局限性和挑战,以选择合适的聚类方法和策略。

聚类方法

常用的聚类方法多种多样,每种方法都有其独特的优势和适用场景。以下是一些常用的聚类方法及其详细介绍:

1. K-means聚类算法

概述
K-means聚类算法是一种基于划分的聚类方法,由James MacQueen在1967年提出。该算法将数据分为K个簇,通过迭代的方式优化簇内数据点的平均距离,使得同一簇内的数据点尽可能相似,而不同簇间的数据点尽可能不同。

步骤

  1. 随机选择K个数据点作为初始的聚类中心。
  2. 计算每个数据点与各个聚类中心之间的距离,将数据点分配到最近的聚类中心所在的簇中。
  3. 重新计算每个簇的聚类中心(通常是簇内数据点的均值)。
  4. 重复步骤2和3,直到聚类中心不再发生变化或达到其他终止条件(如迭代次数限制、误差平方和局部最小等)。

优点

  • 实现简单,收敛速度快。
  • 聚类效果通常较好,特别是当簇的形状接近球形时。

缺点

  • 需要事先指定聚类数目K。
  • 对初始聚类中心的选择敏感,可能导致不同的聚类结果。
  • 对噪声和异常值敏感。
clc;  
clear;  % 假设data已经被加载,并且是一个二维数组(N x M),其中N是样本数,M是特征数  % 聚类中心的数量  
k = 3;  % 显示原始数据的一部分(可选)  
figure;  
subplot(1,2,1);  
plot(data(:,1), data(:,2), 'o'); % 假设我们有两个特征来可视化  
xlabel('Feature 1');  
ylabel('Feature 2');  
title('Original Data Points');  
grid on;  % 初始化聚类中心(随机选择)  
indices = randperm(size(data, 1), k);  
CC = data(indices, :);  % 初始化距离矩阵和聚类分配矩阵  
D = zeros(size(data, 1), k);  
C = cell(1, k);  
for i = 1:k  C{i} = [];  
end  % 迭代过程  
while true  % 计算每个点到每个聚类中心的距离  for i = 1:size(data, 1)  for j = 1:k  D(i, j) = sqrt(sum((data(i, :) - CC(j, :)) .^ 2, 2)); % 计算欧氏距离  end  [~, minIndex] = min(D(i, :)); % 找到最近的聚类中心索引  % 更新聚类分配  if ~isempty(C{minIndex})  C{minIndex} = [C{minIndex}, i];  else  C{minIndex} = i;  end  end  % 重新计算聚类中心  newCC = zeros(k, size(data, 2));  for j = 1:k  if ~isempty(C{j})  newCC(j, :) = mean(data(C{j}, :), 1); % 计算新的聚类中心  end  end  % 检查聚类中心是否收敛  if all(newCC == CC, 'all')  break;  end  CC = newCC; % 更新聚类中心  
end  % 绘制聚类结果  
figure;  
subplot(1,2,2);  
colors = ['r', 'g', 'b'];  
for j = 1:k  if ~isempty(C{j})  plot(data(C{j}, 1), data(C{j}, 2), '.', 'Color', colors(j));  hold on;  plot(newCC(j, 1), newCC(j, 2), 'kx', 'MarkerSize', 15, 'LineWidth', 3, 'Color', colors(j));  end  
end  
xlabel('Feature 1');  
ylabel('Feature 2');  
title('K-means Clustering Results');  
grid on;  
legend(arrayfun(@(j) sprintf('Cluster %d', j), 1:k, 'UniformOutput', false));

2. DBSCAN聚类算法

概述
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。该算法将簇定义为密度相连的点的最大集合,能够发现任意形状的簇,并处理噪声点。

核心概念

  • ε邻域:给定对象半径为ε内的区域称为该对象的ε邻域。
  • 核心对象:如果给定对象ε邻域内的样本点数大于等于MinPts(最小点数),则称该对象为核心对象。
  • 密度可达密度相连:基于核心对象和ε邻域的概念,定义了密度可达和密度相连的关系,用于描述簇内数据点之间的连接性。

步骤

  1. 从数据集中随机选择一个未处理的数据点p。
  2. 如果p是核心对象,则找出所有从p密度可达的数据点,形成一个簇。
  3. 递归地对簇内的每个未处理的数据点执行步骤2,直到簇内的所有点都被处理。
  4. 重复步骤1-3,直到数据集中的所有点都被处理完毕。

优点

  • 不需要事先指定聚类数目。
  • 能够发现任意形状的簇。
  • 对噪声和异常值具有鲁棒性。

缺点

  • 对参数ε和MinPts的选择敏感。
  • 当数据集的密度差异很大时,可能难以选择合适的参数。
function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)    % DBSCAN聚类函数C=0;                       % 统计簇类个数,初始化为0n=size(X,1);               % 把矩阵X的行数数赋值给n,即一共有n个点IDX=zeros(n,1);            % 定义一个n行1列的矩阵D=pdist2(X,X);             % 计算(X,X)的行的距离visited=false(n,1);        % 创建一维的标记数组,全部初始化为false,代表还未被访问isnoise=false(n,1);        % 创建一维的异常点数组,全部初始化为false,代表该点不是异常点for i=1:n                  % 遍历1~n个所有的点if ~visited(i)         % 未被访问,则执行下列代码visited(i)=true;   % 标记为true,已经访问Neighbors=RegionQuery(i);     % 查询周围点中距离小于等于epsilon的个数if numel(Neighbors)<MinPts    % 如果小于MinPts% X(i,:) is NOISE        isnoise(i)=true;          % 该点是异常点else              % 如果大于MinPts,且距离大于epsilonC=C+1;        % 该点又是新的簇类中心点,簇类个数+1ExpandCluster(i,Neighbors,C);    % 如果是新的簇类中心,执行下面的函数endendend                    % 循环完n个点,跳出循环function ExpandCluster(i,Neighbors,C)    % 判断该点周围的点是否直接密度可达IDX(i)=C;                            % 将第i个C簇类记录到IDX(i)中k = 1;                             while true                           % 一直循环j = Neighbors(k);                % 找到距离小于epsilon的第一个直接密度可达点if ~visited(j)                   % 如果没有被访问visited(j)=true;             % 标记为已访问Neighbors2=RegionQuery(j);   % 查询周围点中距离小于epsilon的个数if numel(Neighbors2)>=MinPts % 如果周围点的个数大于等于Minpts,代表该点直接密度可达Neighbors=[Neighbors Neighbors2];   %#ok  % 将该点包含着同一个簇类当中endend                              % 退出循环if IDX(j)==0                     % 如果还没形成任何簇类IDX(j)=C;                    % 将第j个簇类记录到IDX(j)中end                              % 退出循坏k = k + 1;                       % k+1,继续遍历下一个直接密度可达的点if k > numel(Neighbors)          % 如果已经遍历完所有直接密度可达的点,则退出循环break;endendend                                      % 退出循环function Neighbors=RegionQuery(i)        % 该函数用来查询周围点中距离小于等于epsilon的个数Neighbors=find(D(i,:)<=epsilon);end

3. 层次聚类算法

概述
层次聚类算法通过计算数据点之间的相似度或距离,将数据点组织成树状的层次结构。根据构建层次结构的方向,层次聚类可以分为凝聚的层次聚类(如AGNES)和分裂的层次聚类(如DIANA)。

AGNES(AGglomerative NESting)

  • 概述:AGNES是一种凝聚的层次聚类方法,它最初将每个数据点视为一个单独的簇,然后逐步合并最相似的簇,直到达到指定的簇数目或满足其他终止条件。
  • 步骤:包括初始化、合并簇、重复合并直到满足终止条件等。

DIANA(Divisive ANAlysis)

  • 概述:DIANA是一种分裂的层次聚类方法,它首先将所有数据点视为一个簇,然后逐步分裂成更小的簇,直到每个簇只包含一个数据点或达到指定的簇数目。
  • 步骤:包括初始化、选择分裂点、分裂簇、重复分裂直到满足终止条件等。

优点

  • 不需要事先指定聚类数目。
  • 能够生成聚类的层次结构,便于分析不同层次的聚类结果。

缺点

  • 计算复杂度较高,特别是对于大数据集。
  • 合并或分裂点的选择可能影响聚类结果的质量。

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

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

相关文章

AI自动生成PPT哪个软件好?揭秘5款自动生成PPT的工具

在职场的竞技场上&#xff0c;演示文稿如同战士的利剑&#xff0c;其锋芒直接影响着演讲者的说服力。 然而&#xff0c;制作一份高质量的PPT往往需要耗费大量时间与精力。随着科技的进步&#xff0c;AI自动生成PPT成为了提升效率的新选择。面对市场上琳琅满目的软件&#xff0…

C++报警:warning: zero as null pointer constantstddef.h

源码和警告内容 解决办法&#xff1a; select(0,nullptr,nullptr,nullptr,&delay); 关于NULL和nullptr的区别&#xff1a; 在C中&#xff0c;nullptr和null&#xff08;通常指的是NULL宏&#xff0c;因为C标准中并没有直接定义null关键字&#xff09;都用于表示空指针&am…

揭秘控制流的秘密:Java中的if, for, while,你真的会用吗?

在编程的浩瀚宇宙中&#xff0c;控制流语句如同星辰&#xff0c;引领着代码的航向。今天&#xff0c;我们将深入探讨Java中至关重要的控制流语句——if, for, while&#xff0c;以及它们的变体。无论你是一名初学者&#xff0c;还是有着丰富经验的开发者&#xff0c;这篇文章都…

C++:入门基础

目录 C版本 C参考文档 C输入输出 C对比C 命名空间 相较C语言它存在的意义 命名空间的使用 缺省参数 全缺省 半缺省 函数重载 引用 注意事项 引用和指针的关系&#xff08;区别&#xff09; inline 为什么要有inline&#xff1f; 注意事项 nullptr C版本 时间…

今天小编强烈推荐几款国产APP!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 今天小编强烈推荐几款国产APP,算得上是国产之光。如果能帮助到大家&#xff0c;别忘了给小编点点赞加关注哟&#xff01;更多精彩还在后面。 一、…

新国立祭出视频生成“无限宝石“:2300帧仅需5分钟,提速100倍

天下武功唯快不破—— 火云邪神 前一段时间&#xff0c;想必大家都有被各种文生视频给刷屏&#xff0c;但当看完之后&#xff0c;不知道大家是否都有一种意犹未尽的感觉&#xff1a;“这也太短了吧&#xff0c;我还没看够呢”。受限于机器资源与生成效率&#xff0c;目前大部分…

WebRTC批量发送消息API接口的特性有哪些?

WebRTC批量发送消息api接口怎么样&#xff1f;接口性能怎么用&#xff1f; WebRTC技术允许浏览器和移动应用进行实时通信。通过WebRTC&#xff0c;开发者可以构建视频、语音、数据共享等应用。AokSend将重点探讨WebRTC批量发送消息API接口的特性。 WebRTC批量发送消息API接口…

关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划

之前&#xff1a;antdv 现在&#xff1a;g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容&#xff1a;快速入门 图表示例&#xff1a; 选择使用比较广泛的示例类型&#xff0c;录课顺序如下&#xff1a; 1、折线图2、面积图3、柱形图4、条形图5、饼…

W外链短网址平台怎么样?抖音/小红书/快手/微信卡片生成

在当今数字化时代&#xff0c;网址的便捷性和易记性对于用户体验和网站推广至关重要。短网址技术应运而生&#xff0c;以其简洁、易记、方便分享的特性&#xff0c;逐渐成为网站优化和推广的重要手段之一。其中&#xff0c;W外链作为一个功能全面的短网址服务平台&#xff0c;以…

一文彻底搞懂性能测试

性能测试概念 我们经常看到的性能测试概念&#xff0c;有人或称之为性能策略&#xff0c;或称之为性能方法&#xff0c;或称之为性能场景分类&#xff0c;大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念&#xff0c;我不知道你看到的…

react 组件通信 —— 父子传值 【 函数式/类式 】

1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…

刷代码随想录有感(131):动态规划——回文子串

题干&#xff1a; 代码&#xff1a; class Solution { public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(), vector<bool>(s.size(), false));int res 0;for(int i s.size() - 1; i > 0; i--){for(int j i; j < s.size(); j)…

[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size();vector<long> preSumArr(n 1);for (int i 0; i < n; i) {preSumArr[i 1] preSumArr[i] nums[i];}int res n…

获取商铺信息,以及商铺信息的增删改查

本文章主要讲述如何对商铺信息进行基本的增删改查操作&#xff0c;及数据库对比。 1、获取首页仪表盘统计数据接口 待收费金额&#xff1a; SELECT count(1) as count,IFNULL(sum(total),0)as sum FROM payment_bill WHERE enabled_mark 1 AND pay_state0 欠费数据&#xf…

2970. 统计移除递增子数组的数目 I

解题思路 本题中的子数组&#xff0c;称为递增子数组。 子数组指的是一个数组中一段连续的数组序列。 假设nums的长度为n&#xff0c;则nums的子数组的个数为 n ( n 1 ) 2 \frac{n\times(n1)}{2} 2n(n1)​。 因此只需要找出不满足的递增子数组即可。 python class Solutio…

C++基础编程100题-021 OpenJudge-1.4-01 判断数正负

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/01/ 描述 给定一个整数N&#xff0c;判断其正负。 输入 一个整数N(-109 < N < 109) 输出 如果N > 0, 输出positive; 如果N 0, 输出zero; 如果N < 0, 输出negative 样例输入 1样例输出…

MySQL 程序简介

以下是常用的 MySQL 程序 程序名作用 mysqldMySQL 的守护进程&#xff0c;即 MySQL 服务器&#xff0c;若要使用 mysql 服务&#xff0c;那么 mysqld 必须处在运行状态 mysqlMySQL 客户端程序&#xff0c;用户交互式输入 SQL 语句或以批处理模式从文件执行 SQL 的命令行…

【Neo4j】实战 (数据库技术丛书)学习笔记

Neo4j实战 (数据库技术丛书) 第1章演示了应用Neo4j作为图形数据库对改进性能和扩展性的可能性, 也讨论了对图形建模的数据如何正好适应于Neo4j数据模型,现在到了该动 手实践的时间了。第一章 概述 Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存 储)。用户被定…

原生android的内存性能提升方面的测试和优化方案大致设计

一 测试目标&#xff1a; 以满足用户设备的内存性能和不杀后台为目标。 1&#xff1a;满足用户设备的内存性能是指不出现因为内存原因导致的安卓设备死机&#xff0c;卡顿等问题。 2&#xff1a;满足不杀后台是指整个设备使用时&#xff0c;不出现后台app被杀。 通常是估算如果…

Pytorch版本、安装和检验

基于conda包的环境创建、激活、管理与删除 CUDA版本 CUDA 是 NVIDIA 专为图形处理单元 (GPU) 上的通用计算开发的并行计算平台和编程模型&#xff0c;CUDA版本需满足对应的Pytorch要求 进入NVIDIA控制面板 进入左下角“系统信息”&#xff0c;找到组件 “NVIDIA CUDA 12.3.10…