- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564682 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174627
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数学建模————统计问题之分类/聚类(二)" W8 H( u% G9 T+ M$ a
首先要弄明白分类和聚类的区别:9 ?; u6 i5 B: F- f
分类(判别):数据包含数据特征部分和样本标签部分,分类的目的就是判别新的数据特征到其应有的样本标签(类别)中。
- p# N. P; ], @& J3 Q2 A" T# a4 |. Q3 \9 C" {+ O8 K
比方说,现在告诉大家一个教室里面其中一半人每个人的性别(男女),现在需要大家将另一半人中每个人的性别判断出来,因此大家首先要做的的找到区分性别的特征,然后应用到另一半人身上,将其归类。7 y2 N* o2 y/ }& Y7 y- k) O
# x* Q4 Y) T) D q+ M7 P
聚类:数据中只有数据特征,需要根据某一标准将其划分到不同的类中。' R8 Y+ \( H; f+ k% k
+ N% `. U/ x8 `; t2 P& @ 同样的,现在一个教室里面所有人都没什么标签,现在需要你将整个教室的人分为两类,那么你可以从性别、体型、兴趣爱好、位置等等角度去分析。/ y `4 n0 ^5 [
8 `' b$ w1 ` A' R6 M, _
4 m" q \* J6 A% m
* {/ i3 s! k/ j- o& Q$ i 可以看到,分类其实跟预测差不多,只不过输出是一维的,并且还是整数,所以可以用预测中的机器学习方法来解决分类问题。而聚类则不同,一般来说,聚类需要定义一种相似度或者距离,从而将相似或者距离近的样本归为一类,常见的有:kmeans算法、分层聚类、谱聚类等。$ C, x4 E9 y1 u6 T$ j& s
' P+ A9 [' Z3 G o* u2 D- Y+ C 对于聚类来说,除了相似性的度量之外,还有一个比较重要的是终止条件,即需要聚成多少类,一般来说,基本都是在聚类之前就设定好需要聚成多少类,其中kmeans就是先设定几个类中心,然后将与类中心相近的数据归到那一类,然后不断更新类中心,直至所有数据聚类完毕,而分层聚类则是相反,先将所有数据各自为一类,然后将相似的类合并,直至达到k类为止...
1 u4 d9 _4 {0 Z$ z0 z8 j 当然,也可以将终止条件改为当最小的距离大于某一阈值时,不再合并类(适用于分层聚类),除了这些算法,还有机器学习方法,如:自组织竞争网络(SOM),可以自行了解。
% n9 _- l- t' e; C! |1 Y
9 ^ R0 ^$ B I+ @# b 接下来我们以分层聚类为例进行讲解,这一部分例子来自于《数学建模算法与应用》,用以辅助说明。通常来说,分层聚类有两类,一类是从上到下的分裂(即现将所有个体看做一个类,然后利用规则一步步的分裂成多个类),另一类是从下到上的合并(即先将每个个体看作一个类,然后依据规则一步步合并为一个类)。因此分层聚类最终可以得到一个金字塔结构,每一层都有不同的类别数量,我们可以选取需要的类别数量。& x: d. r: F5 G+ ~$ C, Z; ` h% r
--------------------- / e' I5 |7 c1 ^. ]
例子:设有5个销售员w1,w2,w3,w4,w5,他们的销售业绩由二维变量(v1,v2)描述:) P2 F6 m8 |, x% o1 R' ^
* z) |3 ~ \2 L; Q* V9 [ K( F
' Y1 ~: B" t4 P* @7 X" D7 N( a
2 |* s% ^- s( M1 X( [5 q 将5个人的两种数据看作他们的指标,首先,我们简单定义任意两组数据的距离为:; T) O9 O K9 I) X4 E3 M- V. V
2 ?% F7 n4 @% K! w* F f o6 g6 S9 A/ n+ n! ?9 o
- k( Y- }8 U. N
: h+ Y! y" Y" ^& |$ w1 N" b# d+ a R) A8 ?8 G
: D% A* q: Z% Q A$ n6 G
3 n3 W+ h" O5 N3 I/ G' y; @; w8 g 与此相对应的,当有样本归为一类后,我们要计算类间距离就又得需要一个计算方式,我们定义任意两类间的距离为两类中每组数据距离的最小值:3 p- K1 v, R# Y* ]" ~5 D, k
. h* g, E7 t; F$ e/ B5 V
7 s8 n% g6 W `+ |- U: Z/ m9 u1 W* }; d% I( E" W" a+ y. @- w
8 c$ V: u* ~ E) _& M. ?1 o
' T& C! g5 S+ R$ R7 o
0 |* d& c8 y) l: q6 H' |2 p
& g( Z' h! f L: k2 o0 z* m/ D
因此,可以得到任意两个销售员的数据距离矩阵:' n1 A) V1 @' q" `; n
' h6 s1 X7 A/ Z# {' ^: h' e' {0 G& A
; X% C3 z3 r6 j+ J C
& ?! g, C D" |1 Y# [4 _2 _ i
Step1 首先,最相近的两组样本是w1和w2,他们的距离为1,所以先将其聚为一类; b1 s; Y& E" H/ t% B5 w
. X' B4 A" b) u: U. RStep2 然后,剩下的样本为{w1,w2},w3,w4,w5,我们发现除了距离1之外,最相似的是 w3,w4,他们的距离为2,所以将其聚为一类;% ~6 x5 i$ ?; U3 ~
Step3 然后,剩下的样本为{w1,w2},{w3,w4},w5,我们发现除了距离1,2之外,最相似的 是{w1,w2}和{w3,w4},他们的距离以 w2和w3的距离为准,距离为3,所以将这两类聚为一类;
- b" P3 Q( H4 Q' BStep4 最后,剩下的样本为{w1,w2,w3,w4},w5,只剩最后两类了,所以最后一类为 {w1,w2,w3,w4,w5},类间距以w3/w4与w5的距离4为准。
. Y3 G) p. W/ V% r8 ?: z; f" T2 v* Q0 [) B( [
代码如下:%% 编程实现clc;clear;close all$ s0 X+ a P& P( G
data = [1,0;1,1;3,2;4,3;2,5];%原始数据
+ N, j; }; d% |[m, ~] = size(data);' Q, ]) B9 S5 \9 [' l# T
d = mandist(data');%求任意两组数据的距离9 R$ n0 b- P$ t% @4 R3 M3 l
d = tril(d);%取下三角区域数据
) _1 R6 G% J( Q0 U; Rnd = nonzeros(d);%去除0元素" S" A" P9 Q, W- { \
nd = unique(nd);%去除重复元素
1 x- N1 c+ n( h& _2 P+ q$ l8 D for i = 1 : m-1
; Q X' |! o. Y2 f nd_min = min(nd);5 W2 P0 m+ S) m7 ^, s/ M
[row, col] = find(d == nd_min);
% k. c% F" ?7 m8 t4 E( V label = union(row,col);%提取相似的类别
0 I$ g8 }' U0 b* @2 ` label = reshape(label, 1, length(label));%将类别标签转化成行向量! z7 a1 P; H/ N" B# i" f
disp(['第',num2str(i),'次找到的相似样本为:',num2str(label)]);6 Z1 X! j x) X x* I
nd(nd == nd_min) = [];%删除已归类的距离
, b; f9 V. J, i, t2 Z; n6 w H# y if isempty(nd)%如果没有可分的类就停止- w/ F- ~, W8 _2 L) i% I% @8 z4 A C
break2 M* s$ ]5 ?, z% c. \
end: R1 n4 p" V8 @9 c0 \: X$ {! f+ w* e: h
end
4 K* ^ z" g3 w l/ {; r7 ^+ K" q! u8 A ^- Q%% 工具箱实现5 u ]" T, j9 s3 e
clc;clear;close all# Q, N* I3 M0 M& b8 x/ J
data = [1,0;1,1;3,2;4,3;2,5];%原始数据( D7 f$ b9 B* a( B
y = pdist(data,'cityblock');%计算任意两样本的绝对值距离
+ [' v0 W+ H$ |5 d! b X7 wyc = squareform(y);%将距离转化成对称方阵 x7 u& H$ M2 B! G
z = linkage(y);%生成聚类树3 a/ x4 Q _5 X% I7 \' P
[h, t] = dendrogram(z);%画出聚类树/ L4 m7 @8 {% B5 c* t! O- K
n = 3;%最终需要聚成多少类; ], G: d1 |) @! B7 ?
T = cluster(z, 'maxclust', n);%分析当分n类时,个样本的标签' s2 H; t! V3 [, ^7 w5 A1 P
for i = 1 : n, h. @. M" X, [! [+ f/ s
label = find(T == i);- G( z( c/ k" Y+ }
label = reshape(label, 1, length(label));
; ], B' R$ {; v2 d3 G disp(['第',num2str(i),'类有:',num2str(label)]);
9 B, @+ g- P0 k5 }$ ?9 k M7 Y& H8 Wend) u) p6 S! y( }, n7 w3 F% O
结果如下:1 x, i- H- i& }- S& `
![]()
: d) d1 L' M1 i$ r7 |--------------------- , K' @/ E! a( s9 ?; I
# W6 h, z5 b" x
6 U/ S' d/ r0 n9 `1 ~; z# D8 r
% A8 W+ B4 p& c5 P& L2 r: ]) m0 ]/ S( J- r* J9 I/ v
* _, T3 L6 k( v& L `- P# M |
zan
|