【机器学习】无监督学习的概念,使用无监督学习发现数据的特点 ' h, ~* _; ~7 l' `/ R 1 O) M: ?1 V6 v5 m" M; f9 }到目前位置,我们主要把注意力集中在监督学习的问题上,数据集中的每个数据点都有一个已知的标签或者目标值。然而如果面对没有已知的输出结果,或者没有人监督学习算法,我们要怎么做。4 J K' F: I' W
, Y/ t" N. o \# N' V7 i这就是无监督学习 。. _" j* a( d7 I9 o \
6 u. a) Y; t: @1 K- A( U! ]2 s# P在无监督、非监督学习中了,学习过程仅使用输入数据,没有更多的指导信息,要求从这些数据中提取知识。我们已经讨论了非监督学习众多形式的一种降维。另一个普及的领域就是聚类分析。他的目的是吧数据分为相似元素组成的不同区域中。- P& `8 g; Y& _
+ y e9 p/ j: J0 k; q9 C在本章中,我们想要理解不同的聚类算法如何从简单到,无标记的数据集中提取特征。这些结构特征,可以用于特征处理,图像处理,甚至是作为无监督学习任务的预处理步骤。 / v! f, a) D. S5 l, Z; D作为一个具体的例子,我们将对图像进行聚类,将色彩空间降到16位数。 6 _& I) p5 y. d1 R' \0 _5 N $ \* |2 |# `% p" f/ A解决的问题8 M' H7 M9 w9 x) K+ t
1.K-means聚类和期望最大化是什么?如何在opencv中实现这些算法。0 O. U1 \ E# i5 {3 Z
2.如何在层次树中使用聚类算法。他带来的好处有哪些。 5 k4 W, h8 {# N$ ?* ]$ I$ J, W2 b3.如何使用无监督学习,进行预处理,图像处理,分类。 8 {5 \- W9 P6 g4 J% t. g$ C: W X3 r+ Z+ V4 n0 o9 [1 理解无监督学习 9 M0 n$ n1 ]. m& S8 T无监督学习可能有很多形式,但是他们的目标总是把原始数据转化为更加丰富,更加有意义的表示,这么做可以让人们更容易理解,也可以更方便的使用机器学习算法进行解析。" d9 j/ {; N& a. v" b
无监督学习的应用包括一下应用:0 U( y& C3 }% k+ M/ l( g9 Z3 l! T
1降维:他接受一个许多特征的高维度数据表示,尝试对这些数据进行压缩,以使其主要特征,可以使用少量的携带高信息量的数据来表示。0 K9 C- C1 k) S+ Z* k' M' ^
2因子分析:用于找到导致被观察的到的数据的隐含因素或者未观察到的方面。7 M. K' E& j$ o, S) r: j W
3聚类分析:. i, F) ?; ?. W7 U1 i4 E5 {
尝试把数据分成相似元素组成的不同组。0 T! a* Q- T( i0 ?5 I: W9 W' L
3 j8 e$ E2 D: ]) \3 `+ N0 L
无监督学习主要的挑战就是,如何确定一个算法是否出色,或者学习到什么有用内容,通常评估一个无监督学习算法结果的唯一方式是手动检查,并确定结果是否有意义。 ! h# \# Q% s+ |5 `$ } ( |6 u/ p, _) ]5 O7 V3 k3 j; u话虽然如此,但是非监督学习,可以非常有,比如作为预处理或者特征提取的步骤。1 C6 l) W' [: I A9 B2 T3 ?% C
- y2 c ^( r: ]
2理解K-means聚类9 d6 h3 N; E" F! j/ c' u( \
Opencv 提供最有用的聚类算法是k-means,因为它会从一个没有标记的多维度数据集中搜寻预设的K个聚类结果。 ! _. S! O& B( }+ k8 m$ q: ?4 Y; w! _6 M2 Q; F
它通过两个简单的假设来完成最佳聚类了。3 ?/ g; ^, X( s; K& w3 f
1 每个聚类中心都是属于该类别的所有数据点的算术平均值 ; C8 g0 Y) S0 E1 Q1 H" Q+ l2 聚类中的每一个点相对其他聚类中心,更靠近本类别的中心。 : }0 L" i& @5 u9 l6 }1 G0 o2 W1 x / ]! ?1 f% j% {8 i2.1 实现第一个kmeans例子2 o* O3 L) E8 B+ K/ e
首先,生成一个包含四个不同点集合的数据集。为了强调这是一个非监督的方法,我门在可视化将忽略哪些标签。使用matplotlib进行可视化。( ^, a& g) H8 F- O# Q1 r
/ c" J5 y( ?) G4 A- U8 S: f" I
import matplotlib.pyplot as plt/ e& l# E! D$ J# {# Z7 o
import pylab + L( F3 n4 j, ffrom sklearn.datasets._samples_generator import make_blobs8 X/ Q6 ?9 S" `1 v. y k
3 \4 T3 X+ ^, J- t, [
plt.style.use('ggplot')+ w/ V8 q x0 c& n& `' r
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10)% {) c I7 }4 A
plt.scatter(x[:,0],x[:,1],s=100) 9 L. N4 U2 d+ q* Q3 A- |$ k3 Ppylab.show(): ^) o- \ e2 C1 D" g" P( i+ N) h
8 P; E/ Y" p6 G5 D. D5 x & o y+ p/ M6 K" \" N' Y- N1 % a) ?' ^8 | H, l9 C5 l9 `2 [2 , e! R' |9 ? q3 T* q3. g1 _8 d% E5 i( O
4 1 K" I# W$ t1 ? L( ^7 _5' p4 o4 u. E: q# \9 m* @( M
6& m1 L$ y) I+ w( t; P; D) P
7! [2 x: Q5 m' ^7 { [7 A# Z4 o
8% q* X7 N) u6 \1 ^4 f2 M7 ?% i/ v# A
9* w& G9 o* e0 j5 s: u. o! R
10 : l, O$ p/ m1 ?* |" c7 y( b! i t+ F4 J: a3 E' }
我们创建一个四个不同区域的聚类,centers=4,一共300节点。5 K5 V. v* J; g6 [! _
如上程序生成图像所示结果。! F0 m3 ]1 Q3 z0 ?; k/ |+ C
尽管没有给数据分配目标标签,但直接使用肉眼还是可以看出来一共是四类。 : D! X* u! K. s' ]- _kmeans就可以通过算法办到,无需任何关于目标的标签或者潜在的数据分布的信息。 4 Z2 x0 z# I, G2 U5 N; k当然尽管,kmeans在opencv中是一个统计模型,不能调用api中的train和predict。相反,使用cv2.kmeans可以直接使用这个算法。。为了使用这个模型,我们需要指定一些参数,比如终止条件,和初始化标志。 % k* x* R( g0 A9 ? 8 |8 @2 c9 d, E! L- [- @' j2 B我们让算法误差小于1.0(cv2.TERM_CRITERIA_EPS),或者已经 执行了十次迭代(cv2.TERM_CITTERIA_MAX_ITER)时候终止。6 z3 W9 Q9 [9 G9 T7 M
3 m% |' H. B9 w- q- O7 Y, b/ U
2 Y2 ^/ x; v9 e , i: X/ L+ y, P( V6 A. A himport matplotlib.pyplot as plt 9 u$ t6 k$ A o! k+ J) @import pylab 5 W/ Y6 I+ i) Y0 F" `' yfrom sklearn.datasets._samples_generator import make_blobs9 `3 o( Q) D7 {1 t8 W
import cv2 t S) d1 W9 t" timport numpy as np : x: ~% W* t$ L* E4 j6 B! ^6 N" {" J2 J, W: n9 }
plt.style.use('ggplot') 6 a+ ~2 g( D7 O( R: T- r; a- Ox,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10) ! B" ^: z) Q/ J' D4 |4 ^' hplt.scatter(x[:,0],x[:,1],s=100)) A4 ~# ]5 w1 q- Y5 e
1 H6 p0 m) K+ ]9 x3 m- s+ L
( E* S$ p4 p2 K+ [" A6 \
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)* e4 f, H) P1 X8 }+ @7 \7 k
flags=cv2.KMEANS_RANDOM_CENTERS6 \2 e! F) o! D/ N
compactness,labels,centers=cv2.kmeans(x.astype(np.float32),4,None,criteria,10,flags)& |/ X: M$ Q, `- @) ^8 u2 c
print(compactness) : {9 d% A0 b. u5 [1 a % y" F# p( s4 m- I& Mplt.scatter(x[:,0],x[:,1],c=labels,s=50,cmap='viridis')$ r( F. q1 Z$ D, j+ x# u, H
plt.scatter(centers[:,0],centers[:,1],c='black',s=200,alpha=0.5)4 {# y" o: Q' f
& G F9 E* j$ \( x# I
pylab.show() ) z J4 T5 S" Z2 B* l" O8 Z ' M3 e. Q- G1 k" { & @8 X# N# }1 M: ~. t+ b5 F. w# S. S. `1 u- b r/ m" A/ Q
) h( }2 K; Q2 z8 I
' i C2 f* `+ P; e0 M. Q+ r
; O4 K) ~$ W6 I' I4 r
: R1 v4 H2 q8 K N1 6 i; l6 ?2 m/ u: M$ _1 K3 u# J2 ; A" W6 b! U2 z1 m3/ {6 [1 B6 i3 C- {. Z' X9 X
4 2 }" b/ {8 t7 H2 _3 ~( E$ ~5 1 a6 ^5 [! Q# H66 P8 W, K2 F- h. B0 C
7: j" }1 b/ u& ]; r
8 4 I( X2 R1 e8 n' r9 ( _; g( Y( _1 m2 B$ h10$ A. s, j0 r+ H8 c3 G/ w# u% F3 {
111 X4 b( D5 o7 ~7 F R0 C( ]& d9 J
127 l% z+ S8 z7 D/ j# R& S4 `
13, _5 e' ~; k- X, m P Y2 N- t
142 a+ }" v7 C5 n
15' P& N" t \% z: Q
16 P C$ \$ j* J7 i17/ y0 ^6 T3 ^4 j6 _' O9 u3 g1 v
18! u# U/ c, K6 F
191 Q. i6 a6 a' U( V, p
20 ; J6 n( w: F( \# S: U; w215 S" W5 O: F/ }1 E w5 L! b1 s7 S8 k
22; X' B7 H% h7 S1 H# Q' Q
23 * O2 C. @8 u( Z243 E2 z. y4 l1 L& f! Y- b9 X
25 , ?; N! ?8 |/ `) Q* m: c266 x( p, q4 u, i$ ?7 e
上面程序结果可以产生图2的效果。 ! X7 N/ o/ m" j2 T& @" E+ o" S. M. Y7 a b
print(compactness)这个变量,表示每个点到它聚类中心的距离平方和。较高紧凑都表明所有的点更靠近他们的聚类中心,较低 的紧凑度表明不同的聚类可能无法的很好区分。! p/ p8 n% v# Q0 O: S0 R/ q
" L* ?5 b/ q. f9 z, ^1 A2 ^
当然,这个是非常依赖于x中的真实值。如果点与点之间最初的距离比较大,那我们就很难得到一个非常小的紧凑度。因此,把数据画出来,并按照聚类标签分配不同颜色,可以显示更多信息。. N0 y: |: p9 O" I
; t2 { v: E8 \
3理解kmeans - _2 C9 p9 Q: A# Q" d7 o1 X% dkmeans是聚类众多常见期望最大化中一个具体的例子。简单来说,算法处理的过程如下所示:% D& D7 ?0 Q: @. U2 w0 g) ~
1.从一些随机的聚类中心开始/ T0 Y; E+ n( _3 i( L1 Y
2.一种重复直到收敛 7 N4 A5 q' b7 L0 O( [$ t4 @. g8 e7 `. G
期望步骤:把所有的数据点分配到离他们最近的聚类中心。 6 \% o; u5 ^9 Y( N5 ~最大化步骤:通过取出聚类中所有点的平均来更新聚类中心。" ?9 P1 m% L A
! ^ s! }: t l) C ?7 n' l' H( k# _它涉及到一个定义聚类中心位置的适应性函数最大化的过程。对于kmeans最大化是计算一个聚类中所有数据点的算数平均得到。 & U, {2 O6 r5 h. F———————————————— ! t4 X. X0 t) z' A版权声明:本文为CSDN博主「紫钺-高山仰止」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* [+ X% T, h$ _; Z: Z. o
原文链接:https://blog.csdn.net/qq_43158059/article/details/126789000- F" O9 s2 i+ N5 @" q$ C @
' L1 m1 k" i* p! U, l4 b4 E* _ 1 Y# s( i0 a6 A) U( s. ?* b