数学建模社区-数学中国

标题: 数学建模————统计问题之分类/聚类(二) [打印本页]

作者: 杨利霞    时间: 2019-4-1 16:04
标题: 数学建模————统计问题之分类/聚类(二)
数学建模————统计问题之分类/聚类(二)
& K' S! C# Z* S; M) R# ~8 Y  首先要弄明白分类和聚类的区别:6 J4 |" l# Z( H+ H4 N3 \
     分类(判别):数据包含数据特征部分和样本标签部分,分类的目的就是判别新的数据特征到其应有的样本标签(类别)中。; N7 d( N! A! v4 P8 F6 H% ~( P
2 \7 B( b' e& G7 J& P3 F0 D4 M
      比方说,现在告诉大家一个教室里面其中一半人每个人的性别(男女),现在需要大家将另一半人中每个人的性别判断出来,因此大家首先要做的的找到区分性别的特征,然后应用到另一半人身上,将其归类。( t. V3 e, z) s  ?

5 v3 f$ d# ?" ]( f, r     聚类:数据中只有数据特征,需要根据某一标准将其划分到不同的类中。
+ f. W5 T5 d! W* o; |1 \9 x$ B
7 p1 Q6 w) i. c; A% i) Q/ D/ i1 I     同样的,现在一个教室里面所有人都没什么标签,现在需要你将整个教室的人分为两类,那么你可以从性别、体型、兴趣爱好、位置等等角度去分析。
5 a. r" k* X* o/ J4 Z. R8 v
* b. M* C1 y( O- q, R# e  t" S+ C" M6 {6 Y# [
3 c1 @2 y6 Q/ d0 q- g
     可以看到,分类其实跟预测差不多,只不过输出是一维的,并且还是整数,所以可以用预测中的机器学习方法来解决分类问题。而聚类则不同,一般来说,聚类需要定义一种相似度或者距离,从而将相似或者距离近的样本归为一类,常见的有:kmeans算法、分层聚类、谱聚类等。
3 Y2 n3 r, i# r
* m* b) t$ H. ?* A6 F     对于聚类来说,除了相似性的度量之外,还有一个比较重要的是终止条件,即需要聚成多少类,一般来说,基本都是在聚类之前就设定好需要聚成多少类,其中kmeans就是先设定几个类中心,然后将与类中心相近的数据归到那一类,然后不断更新类中心,直至所有数据聚类完毕,而分层聚类则是相反,先将所有数据各自为一类,然后将相似的类合并,直至达到k类为止...; T! d* X! G9 ]
      当然,也可以将终止条件改为当最小的距离大于某一阈值时,不再合并类(适用于分层聚类),除了这些算法,还有机器学习方法,如:自组织竞争网络(SOM),可以自行了解。& h! F3 D. k0 a; O* c
2 @' w+ X( A. }( V
       接下来我们以分层聚类为例进行讲解,这一部分例子来自于《数学建模算法与应用》,用以辅助说明。通常来说,分层聚类有两类,一类是从上到下的分裂(即现将所有个体看做一个类,然后利用规则一步步的分裂成多个类),另一类是从下到上的合并(即先将每个个体看作一个类,然后依据规则一步步合并为一个类)。因此分层聚类最终可以得到一个金字塔结构,每一层都有不同的类别数量,我们可以选取需要的类别数量。
  @7 `' e' v! Q& F# l---------------------
( Y$ y6 D6 c+ a+ l$ S7 D* s8 \     例子:设有5个销售员w1,w2,w3,w4,w5,他们的销售业绩由二维变量(v1,v2)描述:! Y7 `& n4 w8 H8 c  I2 q
* Y/ b! u/ N4 G$ N. Q
5 t1 a7 W& [; u5 W) d  t. x
! W$ J( A$ H! B8 D; n4 ^% a0 F4 m
     将5个人的两种数据看作他们的指标,首先,我们简单定义任意两组数据的距离为:* u, J; d8 @6 U6 ^1 e
! _) ?0 P4 A4 c
% Z8 q, h! F7 T' d) a

/ }: n7 h% }4 J% s$ V9 L$ X% u: F% l7 F" R. p- ?( ~& }

& F+ f5 B6 f8 H( i2 g& S+ c3 S1 m' P" h3 w: l; ]5 [* U6 `
% F; R, V6 ^- O
     与此相对应的,当有样本归为一类后,我们要计算类间距离就又得需要一个计算方式,我们定义任意两类间的距离为两类中每组数据距离的最小值:: d* q) T9 r. S$ K1 R" b2 V

3 E3 D2 g3 n. @/ |% x& N' u7 D* h# E$ f, w1 S# I, R0 Y
6 A% c( b( I$ d$ w0 n  s
0 J$ o  J8 Z8 N

* W4 f/ b0 n, L+ c$ X$ t" }2 e" r, `* V" U1 C, n+ T0 C$ L! `$ R

" J) [! p6 q- |$ D: S0 X     因此,可以得到任意两个销售员的数据距离矩阵:
- }+ W8 [& d4 K" h/ I3 k# L  H' G: \; C8 H$ d

; W7 ]$ {. T$ h0 v$ |/ h! C
- x; u3 q2 e! E) d, `$ y& a2 hStep1 首先,最相近的两组样本是w1和w2,他们的距离为1,所以先将其聚为一类;9 e/ R  v$ k3 U6 s  M
( K5 L: b% F) c( g; C0 B9 w- Q
Step2 然后,剩下的样本为{w1,w2},w3,w4,w5,我们发现除了距离1之外,最相似的是       w3,w4,他们的距离为2,所以将其聚为一类;1 o3 R- a* w6 f6 x& M* W
Step3 然后,剩下的样本为{w1,w2},{w3,w4},w5,我们发现除了距离1,2之外,最相似的   是{w1,w2}和{w3,w4},他们的距离以 w2和w3的距离为准,距离为3,所以将这两类聚为一类;
5 d0 |- M4 |- m3 p% pStep4 最后,剩下的样本为{w1,w2,w3,w4},w5,只剩最后两类了,所以最后一类为   {w1,w2,w3,w4,w5},类间距以w3/w4与w5的距离4为准。
% G6 V) s: j# q2 _7 h* _' Z
' R) b3 s8 |2 ?% G, o   代码如下:%% 编程实现clc;clear;close all
* x5 x7 I. F2 b: I: E3 R. F+ {data = [1,0;1,1;3,2;4,3;2,5];%原始数据
1 I; r$ f* w* y: u( S, f[m, ~] = size(data);
8 X6 e( M, x' o  [7 P( Zd = mandist(data');%求任意两组数据的距离
! v# V2 F, J# z+ Bd = tril(d);%取下三角区域数据' _) R6 ~3 t" C* k. T8 D- u
nd = nonzeros(d);%去除0元素
. i# R: b1 J- P$ E/ [1 h& Nnd = unique(nd);%去除重复元素
4 p3 j1 x% R$ A: v for i = 1 : m-1
( L+ B& x9 J! N: f4 d1 T( r     nd_min = min(nd);: ~8 B) d7 a9 V+ ]4 D: ^; }1 ~
     [row, col] = find(d == nd_min);! L. i" h- r. U" A
     label = union(row,col);%提取相似的类别
4 ^3 A" q+ [4 Z     label = reshape(label, 1, length(label));%将类别标签转化成行向量5 F3 D3 X2 ]) n8 L7 `
     disp(['第',num2str(i),'次找到的相似样本为:',num2str(label)]);$ Y  s6 i2 F, n' D, J
     nd(nd == nd_min) = [];%删除已归类的距离
) L7 [1 K5 [& J' X) w     if isempty(nd)%如果没有可分的类就停止
. u' _$ B* P/ p! z4 a1 ~( b. x: @         break
  D5 O* \# [/ E9 c; P: \     end
( l( m2 \& w9 W% s' y end6 J" r% m% j) l
%% 工具箱实现8 i. g/ ^5 \. N
clc;clear;close all" i; K& |7 g( [4 w6 q, s9 q, H
data = [1,0;1,1;3,2;4,3;2,5];%原始数据
: y8 U1 \& W: u+ |3 L7 T0 \y = pdist(data,'cityblock');%计算任意两样本的绝对值距离) `& t, w. `& X7 X7 q" ~
yc = squareform(y);%将距离转化成对称方阵5 `' b- \" p: X1 {, n" i$ ~# w
z = linkage(y);%生成聚类树
: @8 L. q/ G) z* M  k[h, t] = dendrogram(z);%画出聚类树. ?% c& K2 b/ d3 w
n = 3;%最终需要聚成多少类5 ]0 n& S# T" C! v* }
T = cluster(z, 'maxclust', n);%分析当分n类时,个样本的标签( f! V' \4 E! M% {1 x
for i = 1 : n" @2 H# V( w2 W
    label = find(T == i);, Y; ]9 }$ ?0 i. u; V, m7 E8 a
    label = reshape(label, 1, length(label));
7 U8 y/ i& ?" Q    disp(['第',num2str(i),'类有:',num2str(label)]);( X( [) C. U4 Q+ q- I6 M# k
end
  {7 P+ K6 z9 F+ M8 Y    结果如下:
! e( ?0 e) m# Q* k# m+ N9 W7 q3 Z- W8 c
---------------------
1 [$ k$ E4 V7 H' X
  L) O& m# w: y+ @1 y; x: N% U9 ^5 b+ a# r. x' `$ J

- F# L7 B: {  ^/ J$ b
) k( ]( Y: x8 m: o
2 ^' k' i6 }! M1 G  ~




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5