赞
踩
目录
聚类(Clustering)是数据挖掘和统计学中的一个重要概念,它是一种无监督学习的方法,用于将数据集中的样本或观测值分组为若干个类或簇(Cluster),使得同一簇内的样本之间相似度较高,而不同簇的样本之间相似度较低。与监督学习(如分类)不同,聚类不需要事先知道每个样本的类别标签,它完全基于数据本身的特征来进行分组。
聚类在多个领域都有广泛的应用,包括但不限于:
尽管聚类具有广泛的应用,但它也存在一些局限性:
总之,聚类是一种强大的数据分析工具,它可以帮助我们发现数据中的隐藏模式和群组结构,为后续的决策分析提供有力支持。然而,在实际应用中,我们也需要充分考虑其局限性和挑战,以选择合适的聚类方法和策略。
常用的聚类方法多种多样,每种方法都有其独特的优势和适用场景。以下是一些常用的聚类方法及其详细介绍:
概述:
K-means聚类算法是一种基于划分的聚类方法,由James MacQueen在1967年提出。该算法将数据分为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));
概述:
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。该算法将簇定义为密度相连的点的最大集合,能够发现任意形状的簇,并处理噪声点。
核心概念:
步骤:
优点:
缺点:
- function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts) % DBSCAN聚类函数
-
- C=0; % 统计簇类个数,初始化为0
-
- n=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,且距离大于epsilon
- C=C+1; % 该点又是新的簇类中心点,簇类个数+1
- ExpandCluster(i,Neighbors,C); % 如果是新的簇类中心,执行下面的函数
- end
-
- end
-
- end % 循环完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 % 将该点包含着同一个簇类当中
- end
- end % 退出循环
- if IDX(j)==0 % 如果还没形成任何簇类
- IDX(j)=C; % 将第j个簇类记录到IDX(j)中
- end % 退出循坏
-
- k = k + 1; % k+1,继续遍历下一个直接密度可达的点
- if k > numel(Neighbors) % 如果已经遍历完所有直接密度可达的点,则退出循环
- break;
- end
- end
- end % 退出循环
-
- function Neighbors=RegionQuery(i) % 该函数用来查询周围点中距离小于等于epsilon的个数
- Neighbors=find(D(i,:)<=epsilon);
- end
概述:
层次聚类算法通过计算数据点之间的相似度或距离,将数据点组织成树状的层次结构。根据构建层次结构的方向,层次聚类可以分为凝聚的层次聚类(如AGNES)和分裂的层次聚类(如DIANA)。
AGNES(AGglomerative NESting):
DIANA(Divisive ANAlysis):
优点:
缺点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。