在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564664 点 威望 12 点 阅读权限 255 积分 174622 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
数学建模————统计问题之分类/聚类(二) : u# L, P `$ W8 D
首先要弄明白分类和聚类的区别:
1 U% B9 w8 S% h% V 分类(判别):数据包含数据特征部分和样本标签部分,分类的目的就是判别新的数据特征到其应有的样本标签(类别)中。- P; Y+ V! v) M! S7 q+ F
; h0 ^' }; T7 C/ k1 L- d/ d 比方说,现在告诉大家一个教室里面其中一半人每个人的性别(男女),现在需要大家将另一半人中每个人的性别判断出来,因此大家首先要做的的找到区分性别的特征,然后应用到另一半人身上,将其归类。
" ?* c" J# c0 p- V: | 4 G/ x# B/ X" T2 m f* S2 u& }
聚类:数据中只有数据特征,需要根据某一标准将其划分到不同的类中。$ Q+ Y' R& F( a8 V- N& i+ {* u
1 h( ] E6 ^, {8 |: \- { @ 同样的,现在一个教室里面所有人都没什么标签,现在需要你将整个教室的人分为两类,那么你可以从性别、体型、兴趣爱好、位置等等角度去分析。. _: ]" i: n! E5 k
& @% `: G+ x" x0 X # D+ t" c; m- j/ F7 q5 A
- M! B6 u- d+ p2 I/ D& h
可以看到,分类其实跟预测差不多,只不过输出是一维的,并且还是整数,所以可以用预测中的机器学习方法来解决分类问题。而聚类则不同,一般来说,聚类需要定义一种相似度或者距离,从而将相似或者距离近的样本归为一类,常见的有:kmeans算法、分层聚类、谱聚类等。
. r) e: a5 @, L! k9 Y
: P% c/ J. @% C. X: H9 r 对于聚类来说,除了相似性的度量之外,还有一个比较重要的是终止条件,即需要聚成多少类,一般来说,基本都是在聚类之前就设定好需要聚成多少类,其中kmeans就是先设定几个类中心,然后将与类中心相近的数据归到那一类,然后不断更新类中心,直至所有数据聚类完毕,而分层聚类则是相反,先将所有数据各自为一类,然后将相似的类合并,直至达到k类为止...
8 H6 f4 c1 F h) M* \ 当然,也可以将终止条件改为当最小的距离大于某一阈值时,不再合并类(适用于分层聚类),除了这些算法,还有机器学习方法,如:自组织竞争网络(SOM),可以自行了解。
3 B8 Y6 E8 ?* F0 q7 B" t2 E ) A+ _9 t+ [' b' Q. N
接下来我们以分层聚类为例进行讲解,这一部分例子来自于《数学建模算法与应用》,用以辅助说明。通常来说,分层聚类有两类,一类是从上到下的分裂(即现将所有个体看做一个类,然后利用规则一步步的分裂成多个类),另一类是从下到上的合并(即先将每个个体看作一个类,然后依据规则一步步合并为一个类)。因此分层聚类最终可以得到一个金字塔结构,每一层都有不同的类别数量,我们可以选取需要的类别数量。, s3 z( M3 f# t4 x+ N0 {8 L! f
--------------------- 2 [' K1 J1 _( @8 T& {
例子:设有5个销售员w1,w2,w3,w4,w5,他们的销售业绩由二维变量(v1,v2)描述:9 w; I& N3 D# g" y+ T) C, |
( x: ?/ d1 k8 M) S& m! ` 3 l4 L$ e+ q+ F* Y4 p$ W7 }7 ?
[, H- a% {9 g) P8 G1 m 将5个人的两种数据看作他们的指标,首先,我们简单定义任意两组数据的距离为:0 ]4 N+ `: U$ A7 `7 b: n1 s
" Z7 @6 i# a( t
! i) Y' n8 K' k U2 u( \1 c4 f, \
; v2 X( d: R: W& ? 4 ~% Y2 M' F' _) F
8 K& I4 c. p/ V. E
/ Y; x P/ y5 k# {: M. x& d! I# M
) N; g3 z# S7 I( q( |7 I 与此相对应的,当有样本归为一类后,我们要计算类间距离就又得需要一个计算方式,我们定义任意两类间的距离为两类中每组数据距离的最小值:( o2 T( [! P4 y6 u# [8 R$ S w
% G* O. ~# J9 K
0 N! ?$ L5 d3 i( t& y3 @1 g
! }- Y0 e' I5 S4 [. C+ P. U$ L
- {& O6 G3 l- B3 A2 ~6 R$ ] S( {
$ K' l) U9 y& I- P3 `; R 6 ~9 D; T% n7 O. j
' V# k$ p/ O; L' A V0 D" ~0 {3 A 因此,可以得到任意两个销售员的数据距离矩阵:
$ C9 n# @- H; m( v% k7 L , f" M6 v/ K/ {" I4 A) q
z! l5 D w# J
3 a" B" Y. c7 l% J
Step1 首先,最相近的两组样本是w1和w2,他们的距离为1,所以先将其聚为一类;. c" Z. V. d: ~
- h+ _6 |: L- x' I, h$ h# m+ ~
Step2 然后,剩下的样本为{w1,w2},w3,w4,w5,我们发现除了距离1之外,最相似的是 w3,w4,他们的距离为2,所以将其聚为一类;
9 q# o7 i" }7 U Step3 然后,剩下的样本为{w1,w2},{w3,w4},w5,我们发现除了距离1,2之外,最相似的 是{w1,w2}和{w3,w4},他们的距离以 w2和w3的距离为准,距离为3,所以将这两类聚为一类; 9 I) c) Y5 I6 {+ q6 |: V* t
Step4 最后,剩下的样本为{w1,w2,w3,w4},w5,只剩最后两类了,所以最后一类为 {w1,w2,w3,w4,w5},类间距以w3/w4与w5的距离4为准。
" x Y5 J6 k& f1 c) h ' Y) g6 \7 h# L; q h' d) ~
代码如下:%% 编程实现clc;clear;close all6 `' }6 Q7 ] r: q0 U
data = [1,0;1,1;3,2;4,3;2,5];%原始数据) c' n8 H- V8 U( I
[m, ~] = size(data);
# X _) ?1 A+ \' u d = mandist(data');%求任意两组数据的距离1 X F. a: c0 l8 Z( p7 |
d = tril(d);%取下三角区域数据
2 c9 D: ]) S- L1 G" q nd = nonzeros(d);%去除0元素. Q: \/ x% e, x4 O8 q- x
nd = unique(nd);%去除重复元素" T& h" `& q$ C2 T; V0 F+ W
for i = 1 : m-1
* P' H5 `4 h1 V' k nd_min = min(nd);( L& Z* D; \8 c
[row, col] = find(d == nd_min);6 j M: x+ n( Q0 C2 w
label = union(row,col);%提取相似的类别9 k( u$ G6 w5 t. k6 _
label = reshape(label, 1, length(label));%将类别标签转化成行向量( b$ |" f- T4 U7 p+ L9 o1 W
disp(['第',num2str(i),'次找到的相似样本为:',num2str(label)]);
% O5 i, c4 g0 p' c' _# O7 q nd(nd == nd_min) = [];%删除已归类的距离) H) U' [% I9 [2 o& Q
if isempty(nd)%如果没有可分的类就停止. F0 v+ U$ q* M5 E
break8 L3 Q4 [+ a/ t: |9 X% }+ a% H
end/ ^4 `/ b. \9 Y% H! B6 X3 E/ E
end! c2 M7 V8 f7 Y9 s
%% 工具箱实现
4 B4 @2 Z* r, P2 a& h clc;clear;close all
2 _5 f0 V, i1 i" w1 x data = [1,0;1,1;3,2;4,3;2,5];%原始数据1 b* u4 k) H" W+ l
y = pdist(data,'cityblock');%计算任意两样本的绝对值距离
3 ]1 a$ }3 I! g' S yc = squareform(y);%将距离转化成对称方阵
, B, g+ Q& y# C: L! u. v z = linkage(y);%生成聚类树
) f0 \2 Z, B" i! _: j% @; m [h, t] = dendrogram(z);%画出聚类树
9 Q: D# ?4 N5 Z, N& W n = 3;%最终需要聚成多少类, \8 n* N. S' d
T = cluster(z, 'maxclust', n);%分析当分n类时,个样本的标签0 t: Y) c- W5 H: `
for i = 1 : n
2 A+ L; c" N( H7 J# \' U label = find(T == i);8 a2 B# l: W/ E ], w
label = reshape(label, 1, length(label));
5 k: r1 i- G# T& A disp(['第',num2str(i),'类有:',num2str(label)]);
# O9 P2 ~4 Z* y% C6 U& v end
. Q% ]4 C9 g0 @ _5 s1 w 结果如下:! S% U( w% F' {. i+ r f- c8 d6 I
( T/ F& o* ^5 p3 r
---------------------
4 E E! W7 X/ z! [' a$ j% s4 x : I& |' B9 p! n z
: g& V/ _& @' v4 Z9 T+ a) D6 B
9 ~0 t5 H) N! L) e . J% P/ ] T, ~: O+ ~, w: k
& E+ M$ v8 A, B1 p1 C1 C* r9 S
zan