6 j: i3 i C# a6 v. b无监督学习主要的挑战就是,如何确定一个算法是否出色,或者学习到什么有用内容,通常评估一个无监督学习算法结果的唯一方式是手动检查,并确定结果是否有意义。. `9 T7 F0 ]* k* b2 C# l0 y+ e
% P, q! l& V; _- S) K
话虽然如此,但是非监督学习,可以非常有,比如作为预处理或者特征提取的步骤。 1 Q9 u% z. R+ E+ g3 o7 s# O9 Q+ a0 e, E' {% H8 h$ |
2理解K-means聚类 $ ~6 ?+ x* F8 F. a# [Opencv 提供最有用的聚类算法是k-means,因为它会从一个没有标记的多维度数据集中搜寻预设的K个聚类结果。 / s6 g5 O6 D% `& P% T/ b; x& D% |9 Q 4 E, e( J6 W9 `. m- k$ g它通过两个简单的假设来完成最佳聚类了。 u9 w+ ^4 C! F" k3 T: R3 c1 每个聚类中心都是属于该类别的所有数据点的算术平均值5 P% D( H6 J- v- `# H, @, Z& t
2 聚类中的每一个点相对其他聚类中心,更靠近本类别的中心。 ' V0 u4 q) \0 g0 K* r. i' b1 j( y. r0 I5 O' d& _
2.1 实现第一个kmeans例子3 p! J' f, p" ]9 k- }' d" t
首先,生成一个包含四个不同点集合的数据集。为了强调这是一个非监督的方法,我门在可视化将忽略哪些标签。使用matplotlib进行可视化。# D* T4 N2 t* |
7 t+ h+ @7 d' I1 H. iimport matplotlib.pyplot as plt' f( |/ m$ S7 j+ |" G
import pylab* X7 Y& c* o0 Z. d
from sklearn.datasets._samples_generator import make_blobs9 s _5 p2 g1 j: ~ {# l
^* D# j, v3 M7 `: T( o$ d+ k3 v4 o9 Tplt.style.use('ggplot')+ q6 R& W0 G$ {9 x3 q# Y" ?
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10) ) w% q+ I s% n W; b9 cplt.scatter(x[:,0],x[:,1],s=100)' k( G5 T, v: w; t* |. e
pylab.show() 3 L7 v6 B7 U4 M9 N. Q0 r% }2 L4 c( D3 [% q
% y3 E$ V, y1 |9 ]
1' G; y {! w( @, P0 O6 I
2 9 E9 L) ~9 T _" e/ Z/ e% {3 $ j; b0 k& u, A/ J: c8 }4) v. a$ n. G/ @/ E; `. k
5( g3 z R. L4 b
6% _ o* s9 R$ ]7 \" `- H
7 & f5 h- ]0 ^- O% @/ p8 ! A$ j* O7 a8 u* ]8 F: P9 ^+ O0 Q$ v1 w' O* p, D( N
108 Z" h2 G9 Z; ^8 A( i
# f" `9 }2 c% S
我们创建一个四个不同区域的聚类,centers=4,一共300节点。 1 B b! C9 B9 x; z如上程序生成图像所示结果。. u S) |3 N9 V% k1 J3 \2 o
尽管没有给数据分配目标标签,但直接使用肉眼还是可以看出来一共是四类。 8 d l: y' u' a% Okmeans就可以通过算法办到,无需任何关于目标的标签或者潜在的数据分布的信息。 6 r3 E% O; |1 ^. l: t+ s) [当然尽管,kmeans在opencv中是一个统计模型,不能调用api中的train和predict。相反,使用cv2.kmeans可以直接使用这个算法。。为了使用这个模型,我们需要指定一些参数,比如终止条件,和初始化标志。 ) O9 Y9 `1 t. J) N + ^# g; U% }# S# Y# b4 p我们让算法误差小于1.0(cv2.TERM_CRITERIA_EPS),或者已经 执行了十次迭代(cv2.TERM_CITTERIA_MAX_ITER)时候终止。 B; M5 w) ^ k' d% z7 h
6 }5 P0 L! X c: w1 t" n& o1 g. j : v) d/ a! K+ g* Z6 w% F: N/ q3 s# |6 a+ f' O2 U; |
import matplotlib.pyplot as plt7 ?, c/ M# p: l) m8 ]
import pylab " [6 s: ^- ^8 K( g _4 Ufrom sklearn.datasets._samples_generator import make_blobs . \. J$ M' a1 `% N0 x0 f$ S; `import cv2 ( u8 p; H" x: wimport numpy as np6 b5 Z) s/ T2 J. B) M& w+ P+ r
( Q/ _% e n- S- ?. H" H# c
plt.style.use('ggplot')+ j# M- e1 z8 z& ^
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10) " t, n" v. F- m6 k ?plt.scatter(x[:,0],x[:,1],s=100)' W: m3 x- b4 E+ @2 m7 Z; r; k* R
- L! Q; C7 i1 M1 P9 x