- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563345 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174226
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数学建模————统计问题之分类/聚类(二)
5 q: W6 o& |! H$ _# r& R: J 首先要弄明白分类和聚类的区别:
. R5 D# ~# B) ~* }/ h! x 分类(判别):数据包含数据特征部分和样本标签部分,分类的目的就是判别新的数据特征到其应有的样本标签(类别)中。" G9 Y$ b. o S! L! A7 S
' z% B: g/ M. B9 R; W9 `# {, _
比方说,现在告诉大家一个教室里面其中一半人每个人的性别(男女),现在需要大家将另一半人中每个人的性别判断出来,因此大家首先要做的的找到区分性别的特征,然后应用到另一半人身上,将其归类。
4 ?) z! j1 U' o3 S8 M, q2 a% I/ L. z- q5 O
聚类:数据中只有数据特征,需要根据某一标准将其划分到不同的类中。9 @$ I2 \2 W f; d( l
; D5 r& p# t U( y1 L
同样的,现在一个教室里面所有人都没什么标签,现在需要你将整个教室的人分为两类,那么你可以从性别、体型、兴趣爱好、位置等等角度去分析。3 P3 D1 f# ?" N5 t# g; O- u
& r( }5 |. f4 M% K1 H8 v
$ Z$ a! \9 S$ B6 p7 M$ z/ n0 I% G I& }' }; ] N) v) z2 B% |
可以看到,分类其实跟预测差不多,只不过输出是一维的,并且还是整数,所以可以用预测中的机器学习方法来解决分类问题。而聚类则不同,一般来说,聚类需要定义一种相似度或者距离,从而将相似或者距离近的样本归为一类,常见的有:kmeans算法、分层聚类、谱聚类等。: g/ A7 R6 a. ?0 ^ ^: \. e
9 [$ p# o% V/ b( n/ K& s
对于聚类来说,除了相似性的度量之外,还有一个比较重要的是终止条件,即需要聚成多少类,一般来说,基本都是在聚类之前就设定好需要聚成多少类,其中kmeans就是先设定几个类中心,然后将与类中心相近的数据归到那一类,然后不断更新类中心,直至所有数据聚类完毕,而分层聚类则是相反,先将所有数据各自为一类,然后将相似的类合并,直至达到k类为止...7 S: F) q7 X1 n# B# N% A
当然,也可以将终止条件改为当最小的距离大于某一阈值时,不再合并类(适用于分层聚类),除了这些算法,还有机器学习方法,如:自组织竞争网络(SOM),可以自行了解。
0 _( g- d h& g9 X6 }5 X6 _$ h. u
接下来我们以分层聚类为例进行讲解,这一部分例子来自于《数学建模算法与应用》,用以辅助说明。通常来说,分层聚类有两类,一类是从上到下的分裂(即现将所有个体看做一个类,然后利用规则一步步的分裂成多个类),另一类是从下到上的合并(即先将每个个体看作一个类,然后依据规则一步步合并为一个类)。因此分层聚类最终可以得到一个金字塔结构,每一层都有不同的类别数量,我们可以选取需要的类别数量。
- z8 O) m/ |) U8 {, Y& \7 j. N% D--------------------- 4 t, G c$ m; @4 {. V3 {
例子:设有5个销售员w1,w2,w3,w4,w5,他们的销售业绩由二维变量(v1,v2)描述:
$ `- u* S1 [9 y% R- q- _+ b4 a3 u. P2 ^9 S5 G3 g% J
# B$ I0 y1 L" C, O
' G: M# I" z* ^4 J" ^! p
将5个人的两种数据看作他们的指标,首先,我们简单定义任意两组数据的距离为:" m/ K Q$ B* `# r
! r5 ]0 v! D6 G9 t/ z' v- }2 S
) O7 X6 ]. l4 s4 j& R
1 [; v, h1 f4 \9 |
; _+ f& j. x2 z! G! V
; {; j- F' P, n" [
6 I2 {8 K) Y5 m- H3 A) v5 s* ]+ F. M( s+ A& b1 J0 X8 r4 }
与此相对应的,当有样本归为一类后,我们要计算类间距离就又得需要一个计算方式,我们定义任意两类间的距离为两类中每组数据距离的最小值:; S& ?+ T. J y2 L
! J8 m: R3 q0 k. h& e8 M7 J7 T
8 z* {* P S) l* s0 o
+ p' N1 w: A. L4 j2 |+ s% Y: z% Y0 h( d
- t0 P: c0 M+ S: r
l$ F$ t; U/ V2 N) Y% |! s& U" R0 E6 P, f
因此,可以得到任意两个销售员的数据距离矩阵:% ^$ V x# v Z# K# V6 ^* F( i
) b6 Q$ T9 I9 Y. O0 v0 n1 J: G# |7 i" y7 Q; K- K" Y
; a5 p, [) _' k0 u q7 j9 C7 J
Step1 首先,最相近的两组样本是w1和w2,他们的距离为1,所以先将其聚为一类;5 _) W/ A: l9 F9 O9 ]# `& J9 u0 H- C
. y/ B- k, p; i9 S$ d
Step2 然后,剩下的样本为{w1,w2},w3,w4,w5,我们发现除了距离1之外,最相似的是 w3,w4,他们的距离为2,所以将其聚为一类;
0 f0 m+ R5 q* J7 y6 i8 [Step3 然后,剩下的样本为{w1,w2},{w3,w4},w5,我们发现除了距离1,2之外,最相似的 是{w1,w2}和{w3,w4},他们的距离以 w2和w3的距离为准,距离为3,所以将这两类聚为一类; " p1 Y9 y9 x( R* {, c: X5 ?
Step4 最后,剩下的样本为{w1,w2,w3,w4},w5,只剩最后两类了,所以最后一类为 {w1,w2,w3,w4,w5},类间距以w3/w4与w5的距离4为准。$ p9 f/ J$ d) L; n3 F
1 ~2 r' t/ w4 K( [9 `$ r
代码如下:%% 编程实现clc;clear;close all
" Q% b) G! y9 _" Adata = [1,0;1,1;3,2;4,3;2,5];%原始数据% \! p" Q0 W1 _ e6 p
[m, ~] = size(data);
8 w; S' t# n" L& @d = mandist(data');%求任意两组数据的距离
+ J$ c% l" N1 t Z* vd = tril(d);%取下三角区域数据
6 ?2 O; X+ E2 {6 l+ b* Wnd = nonzeros(d);%去除0元素
" D) ~$ D& |8 K& X V2 X6 gnd = unique(nd);%去除重复元素
3 Q# K+ v$ J* J3 K5 S, }$ g. X for i = 1 : m-1
5 @7 r8 F* X# T) a5 _. @ nd_min = min(nd);+ }; A4 k5 f3 g: H, u; N
[row, col] = find(d == nd_min);, h5 X, k* a2 m' d/ J* B p
label = union(row,col);%提取相似的类别
# e y/ y+ Q5 q: o1 U3 f' ~$ _ label = reshape(label, 1, length(label));%将类别标签转化成行向量
d1 ?9 X K# K7 _" L disp(['第',num2str(i),'次找到的相似样本为:',num2str(label)]);) I2 v) _; ~# ~
nd(nd == nd_min) = [];%删除已归类的距离
0 D! A2 D6 L2 j if isempty(nd)%如果没有可分的类就停止6 |8 d8 x+ e8 y9 f4 A& Q2 C3 B
break3 a! X! ]) B, U ^3 R
end
' Y, Y; V) N- z; p3 L end& a& F2 R- Y. Y: G2 S
%% 工具箱实现
' Q' W | w/ m( d# _clc;clear;close all! z' A+ v( z0 m1 \
data = [1,0;1,1;3,2;4,3;2,5];%原始数据" f, F) L( L: r2 O! Y; ?( k
y = pdist(data,'cityblock');%计算任意两样本的绝对值距离. U, ^7 e. |) f3 `2 u( T( u
yc = squareform(y);%将距离转化成对称方阵
* U: F) W/ L9 t5 P; p F1 v5 xz = linkage(y);%生成聚类树7 R5 K* w8 m. O; b( k: l
[h, t] = dendrogram(z);%画出聚类树
2 Z0 o& \9 V' c. ^0 [; ?n = 3;%最终需要聚成多少类
; B( G; D- h8 v/ W* s4 oT = cluster(z, 'maxclust', n);%分析当分n类时,个样本的标签
; \7 M: F! p; J( J" Bfor i = 1 : n; G6 D+ W& l7 M! t. V7 G, P3 I9 a
label = find(T == i);
2 P8 C1 `; C9 O label = reshape(label, 1, length(label));5 ^% ^: n) C0 M
disp(['第',num2str(i),'类有:',num2str(label)]);
/ x3 U) o, b! H/ Y, rend _) s+ m! }; e6 D( ?, w. U3 X N
结果如下:
9 @7 Y/ I( R t6 @9 O9 ] 4 Z/ M" T) F9 ^0 ~
--------------------- 4 B% g9 a2 L, } f- z2 Z
3 z! Q; w7 i" ~
5 ]1 K4 f4 o4 s. f* h2 V& o8 K' I
/ K$ t& _! _! n! h1 S! l4 i( i3 | Y2 e+ V
" e6 f$ y( N8 E4 J* u. X
|
zan
|