数学建模社区-数学中国
标题:
【机器学习】无监督学习的概念,使用无监督学习发现数据的特点
[打印本页]
作者:
杨利霞
时间:
2022-9-14 16:37
标题:
【机器学习】无监督学习的概念,使用无监督学习发现数据的特点
【机器学习】无监督学习的概念,使用无监督学习发现数据的特点
% g R+ T) b: m* o+ c/ J( h
4 A5 [! Y" M) N8 c( D
到目前位置,我们主要把注意力集中在监督学习的问题上,数据集中的每个数据点都有一个已知的标签或者目标值。然而如果面对没有已知的输出结果,或者没有人监督学习算法,我们要怎么做。
6 ?/ F6 ]. n' \& F( W7 k
8 L! i( j# o, ~; Q/ Q" K
这就是无监督学习 。
g4 q( i( Z+ \0 W r
, E0 s3 P; C R4 h$ j1 O& M
在无监督、非监督学习中了,学习过程仅使用输入数据,没有更多的指导信息,要求从这些数据中提取知识。我们已经讨论了非监督学习众多形式的一种降维。另一个普及的领域就是聚类分析。他的目的是吧数据分为相似元素组成的不同区域中。
3 _+ E0 W# [( _, g( }7 T/ h; X
0 A1 K4 O/ G0 B$ k+ C
在本章中,我们想要理解不同的聚类算法如何从简单到,无标记的数据集中提取特征。这些结构特征,可以用于特征处理,图像处理,甚至是作为无监督学习任务的预处理步骤。
- Z1 A, ~* m/ g3 j9 E. F
作为一个具体的例子,我们将对图像进行聚类,将色彩空间降到16位数。
& y" L' p! P6 e* t: j+ p
/ ~0 x. m( v% V) ^8 Z) ~
解决的问题
1 S; R' B0 x% f$ F& d7 A8 R' A; K
1.K-means聚类和期望最大化是什么?如何在opencv中实现这些算法。
" B' O% \8 r2 t. l% v4 G/ _& ?
2.如何在层次树中使用聚类算法。他带来的好处有哪些。
w+ e. {* Z6 e. b- w1 \0 B) v
3.如何使用无监督学习,进行预处理,图像处理,分类。
& g2 Y% q* S2 H6 l
& g( q: h" n* |( D9 D$ a) P
1 理解无监督学习
. H. _8 n: U7 @5 a& m6 p8 ~
无监督学习可能有很多形式,但是他们的目标总是把原始数据转化为更加丰富,更加有意义的表示,这么做可以让人们更容易理解,也可以更方便的使用机器学习算法进行解析。
5 G' E2 O4 z. H4 W0 I
无监督学习的应用包括一下应用:
6 T3 O) H2 o- o N
1降维:他接受一个许多特征的高维度数据表示,尝试对这些数据进行压缩,以使其主要特征,可以使用少量的携带高信息量的数据来表示。
6 z6 J# Z' W/ @
2因子分析:用于找到导致被观察的到的数据的隐含因素或者未观察到的方面。
4 s' e3 Y- o! Y8 b8 C# \* Q
3聚类分析:
' t& ~2 h( `) I+ G7 x. [
尝试把数据分成相似元素组成的不同组。
* v5 I$ a: m& J4 X; M* E
2 u4 x6 Y" Z% c+ W5 b3 m Y1 n
无监督学习主要的挑战就是,如何确定一个算法是否出色,或者学习到什么有用内容,通常评估一个无监督学习算法结果的唯一方式是手动检查,并确定结果是否有意义。
1 P B+ O6 N; j
6 J5 q) d# a; m: U4 e* H% b
话虽然如此,但是非监督学习,可以非常有,比如作为预处理或者特征提取的步骤。
0 d* O& y3 g: Y1 r' I
7 \- a1 l" b( ]1 g; D
2理解K-means聚类
; x/ `/ }5 @; |$ A( [; z' {
Opencv 提供最有用的聚类算法是k-means,因为它会从一个没有标记的多维度数据集中搜寻预设的K个聚类结果。
! O; C, o4 j. k( D9 U
L! \$ `) l# S) e: R3 b+ |
它通过两个简单的假设来完成最佳聚类了。
9 W0 g! Y7 I: k4 \
1 每个聚类中心都是属于该类别的所有数据点的算术平均值
3 Q; |$ T4 W9 R% ^0 d
2 聚类中的每一个点相对其他聚类中心,更靠近本类别的中心。
6 ]- b7 ?' H# J: L S0 l, A
, V' Y2 {# c# f" |( l- a- F7 A
2.1 实现第一个kmeans例子
# D8 q6 W- Z) x2 y3 Q, N2 M. z
首先,生成一个包含四个不同点集合的数据集。为了强调这是一个非监督的方法,我门在可视化将忽略哪些标签。使用matplotlib进行可视化。
7 ?7 F" P7 C1 S! E" Y, N
. {& G' x* O: {
import matplotlib.pyplot as plt
9 W+ B1 ~7 z* l6 o0 m+ N7 N
import pylab
8 w# K* @; z/ J% I
from sklearn.datasets._samples_generator import make_blobs
, M1 ^* _" X9 m! s2 h- j
" q: o* |, z! L# @) |. M* k
plt.style.use('ggplot')
& M0 Z" Z4 g6 d( j8 q, s6 l
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10)
2 m; J' [/ V9 V+ y6 E
plt.scatter(x[:,0],x[:,1],s=100)
% O6 M1 ~" D3 t) R
pylab.show()
$ p7 T' X6 B$ N/ S) _& l+ ?( `/ ~: _
$ R S% [2 M/ l" P) }; q( {
2 p4 w$ _, ~: z) d8 _
1
# ?) T9 x+ w! d! X7 I& L
2
; o q6 I4 m. ` j; @7 K1 w
3
- U; A# p! Y4 i) {% b. h1 J b
4
0 \: y8 Z% {: D. R1 U. d
5
& m' x5 H6 a! W, B t! [- R6 K
6
) d. `4 Z% F; ~
7
; M& ?9 h: @; d* W6 k
8
6 F0 C# k( w( K3 e" N+ v5 p5 m( F2 p* r
9
6 y: q4 ~7 m8 i9 _0 f& I# S
10
2 x. V8 |( Z. }1 A/ [+ A
& b* H& X, t% P/ B2 ~
我们创建一个四个不同区域的聚类,centers=4,一共300节点。
, F p3 b3 Z7 y1 v5 N5 P/ g
如上程序生成图像所示结果。
, c/ r/ `7 T( V; D
尽管没有给数据分配目标标签,但直接使用肉眼还是可以看出来一共是四类。
% a' Q6 C8 a3 \& Q" H* i: V
kmeans就可以通过算法办到,无需任何关于目标的标签或者潜在的数据分布的信息。
9 _ _9 Q. c7 r$ u0 `' u
当然尽管,kmeans在opencv中是一个统计模型,不能调用api中的train和predict。相反,使用cv2.kmeans可以直接使用这个算法。。为了使用这个模型,我们需要指定一些参数,比如终止条件,和初始化标志。
; g6 W; o5 R# k' ?
! Y* _9 z; Q- g* _. W0 U# |
我们让算法误差小于1.0(cv2.TERM_CRITERIA_EPS),或者已经 执行了十次迭代(cv2.TERM_CITTERIA_MAX_ITER)时候终止。
0 n) Q' u& X7 N2 M, C; x Z" j
; h1 O0 I& a3 k- Q
$ t1 L6 ~" J ^$ J
& V! q0 r+ z" E- X4 G* e
import matplotlib.pyplot as plt
! v+ E' p1 ?7 @) U: G7 O
import pylab
0 Z" P* s" b6 D' F5 m
from sklearn.datasets._samples_generator import make_blobs
8 ?; n1 x+ U4 F# g7 M0 F
import cv2
2 w# \+ J' e/ P" j, F
import numpy as np
& S3 ?& R6 M9 L; {: Y; m; L
8 l& M* s+ J% _: }# E% y: A
plt.style.use('ggplot')
6 a. n. K3 p; ]+ U5 L
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10)
8 c' Q% O, u6 I
plt.scatter(x[:,0],x[:,1],s=100)
* ~9 t) s1 T$ p$ A- o5 n
" j5 J4 L8 K' _8 B7 e
; u$ |8 G( X T; x3 W7 ^2 Q7 ^
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
' T) S$ p6 x; @7 F. {& C/ G
flags=cv2.KMEANS_RANDOM_CENTERS
6 D7 }# Z$ ^- ]. ~/ L* R. B3 d3 \1 V
compactness,labels,centers=cv2.kmeans(x.astype(np.float32),4,None,criteria,10,flags)
. k, W ?' w6 [$ I0 `- R- Z( S
print(compactness)
) F4 H/ f: O. I1 `" H$ h* h
% N7 F- j) J: A% R
plt.scatter(x[:,0],x[:,1],c=labels,s=50,cmap='viridis')
- c+ M2 E/ P; v, f" y
plt.scatter(centers[:,0],centers[:,1],c='black',s=200,alpha=0.5)
$ C) _5 i- n$ h1 T+ H
$ ^; D4 X- q) z: V# z7 O
pylab.show()
( t( o+ o9 Z' ~1 ]
) j4 J' F7 w8 Y" e& ?8 Q
4 F( `+ b- e! g0 L' W, d
! P) c9 b, ?! ?2 V. w$ E* y2 l
. y/ {. E! f3 ] _/ K. h
2 l6 V" B4 T; ]7 o1 o
% m+ S; i' @; z: x
9 d- p7 J8 r) D$ J g
1
; ?+ d% m0 L) s" D
2
- G$ R7 s' l/ G( B3 B0 @/ S
3
a6 t: h( |4 P" l; H
4
5 X3 _8 _! o' p
5
% `/ R4 W S4 Q, ]9 z
6
* v& e3 B: i* ~5 S+ o
7
7 {% _+ e. C9 y
8
0 W2 y3 |2 \+ E; a" W- d( ?2 y( [4 v& r6 I
9
/ ^# [9 j4 n0 t; w* H# ?- v: ~/ I
10
$ n+ D7 h+ Z, R& `
11
( b2 H" I4 Y7 ?
12
/ }$ p$ i& L$ U
13
& R- F6 k7 X; f5 T n+ c
14
$ E6 o9 H7 z( N6 i6 W6 b
15
7 x( J, P! L; M
16
! r3 k2 K T3 d. v
17
% _% O. r; {! V; A' G
18
+ x* ^- E/ y, u v
19
4 P7 P" |1 B1 E/ p
20
; D$ k! Q1 C2 |5 Y* F2 F: c9 a
21
/ z" A3 ~. _* @# G+ e3 ?1 L
22
" {# }+ L% O+ i( |
23
" ?- T6 p+ d5 \+ C0 L% a7 Q+ o
24
, o" k! i- u& b' ?' C- z/ M) a4 {
25
# Q5 P1 ]% a }" n2 y
26
% |; ~* z- T$ {. N, k
上面程序结果可以产生图2的效果。
, w8 U+ W& A$ R1 C% c- U2 n
% D7 D% `: I8 ?% a2 d6 p
print(compactness)这个变量,表示每个点到它聚类中心的距离平方和。较高紧凑都表明所有的点更靠近他们的聚类中心,较低 的紧凑度表明不同的聚类可能无法的很好区分。
0 O2 i" @0 ]2 _4 s' p
. \8 |: g4 s3 ~. Q+ _
当然,这个是非常依赖于x中的真实值。如果点与点之间最初的距离比较大,那我们就很难得到一个非常小的紧凑度。因此,把数据画出来,并按照聚类标签分配不同颜色,可以显示更多信息。
; g N0 ]& r3 m& J) q
* ~& e: `% i8 Z. e! [/ C6 M& \( W3 W
3理解kmeans
9 O5 [' _4 ]: X$ C2 i6 Y- J! j
kmeans是聚类众多常见期望最大化中一个具体的例子。简单来说,算法处理的过程如下所示:
* n$ A" j% y) {) ?- q+ Q! l8 v
1.从一些随机的聚类中心开始
$ Z" J0 F8 w5 b6 o" G1 Z! @
2.一种重复直到收敛
{: I; y+ @% C7 G/ |' T H2 w
5 a+ Y% P7 K3 a0 s! ]" Z" a4 r
期望步骤:把所有的数据点分配到离他们最近的聚类中心。
6 H8 ]( w0 G& u( @
最大化步骤:通过取出聚类中所有点的平均来更新聚类中心。
" ]8 k2 W# e# c: D/ ~1 D3 L% G3 A9 E
. [5 N% M, ^5 c- @" f* m% G2 W
它涉及到一个定义聚类中心位置的适应性函数最大化的过程。对于kmeans最大化是计算一个聚类中所有数据点的算数平均得到。
2 x/ V* M+ v3 q$ b
————————————————
/ D; i0 N; e5 F9 G# d* o/ k
版权声明:本文为CSDN博主「紫钺-高山仰止」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
D, {: I' i7 b( ^, I- M
原文链接:https://blog.csdn.net/qq_43158059/article/details/126789000
4 |7 }& g- ~0 e( y. ?
+ a" L4 h. R0 c" A& @
9 t2 K+ g* ?& c9 g0 h
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5