- J+ O0 R u" @& F, Zimport matplotlib.pyplot as plt 1 N! n4 L7 L1 B/ Dimport pylab" f# N9 O+ E7 |; j4 k$ q4 q
from sklearn.datasets._samples_generator import make_blobs9 v# c m0 M5 F1 P; o- Y9 F# V1 h
+ Q9 u2 A1 Q( P$ I( b: s. Kplt.style.use('ggplot'); {0 ?- x+ o' d9 m3 l @9 W9 I* d4 K
x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10)! r& [. l& X0 q2 M( N' |6 ^" q0 |4 L, P
plt.scatter(x[:,0],x[:,1],s=100) ( h0 a, |8 @) e/ R" k+ v E# apylab.show()9 |2 V( S. l3 J7 d5 B
, C+ i8 N; S, C$ S4 d . u" L2 U! x% b% P2 l, ~1/ I$ N' S; V% |- v8 {
23 E) L4 N% i; T- t; E
3$ X0 [, V* A/ X5 x j6 U X
4 2 k* A* _" {" K' r3 j5 / F- e" \5 y0 @0 z6 ' r* v8 l9 Q! a9 s6 H- a# N7: f! h# w5 m8 M. N5 o9 q. l0 P
8! d% y1 r: m& J- M3 D: e% ]
9$ O, d. D6 r1 O- K$ @- m6 m( ^% B
10 r0 o4 ^" d4 O$ g X: F
5 P! i2 W ]1 x
我们创建一个四个不同区域的聚类,centers=4,一共300节点。 ! b* ^+ j2 B3 O. y3 A! ~如上程序生成图像所示结果。 : K" n% H) o& d* p; Z4 S/ L$ j/ x尽管没有给数据分配目标标签,但直接使用肉眼还是可以看出来一共是四类。1 X: T: l' m7 i# \4 ]
kmeans就可以通过算法办到,无需任何关于目标的标签或者潜在的数据分布的信息。 / L3 M- h! ^9 b' d* h当然尽管,kmeans在opencv中是一个统计模型,不能调用api中的train和predict。相反,使用cv2.kmeans可以直接使用这个算法。。为了使用这个模型,我们需要指定一些参数,比如终止条件,和初始化标志。 3 ~) b) n( ?/ S- P; s( H3 ]* w! T9 l! w
我们让算法误差小于1.0(cv2.TERM_CRITERIA_EPS),或者已经 执行了十次迭代(cv2.TERM_CITTERIA_MAX_ITER)时候终止。 7 `) h. a4 V5 [8 [. k, C ) ~* B) W2 {( p5 u+ ^6 T! W ( O. }) d) d P% k. [4 ]/ O7 C, d# u- h& F8 Y
import matplotlib.pyplot as plt1 f& z9 K L2 J
import pylab ) p& x# b% U6 [% i( yfrom sklearn.datasets._samples_generator import make_blobs 5 n" f# |' X" w Gimport cv2 4 g) R& j" @1 j0 kimport numpy as np $ D Q3 ]" E, P6 L6 a + M! E/ x! R4 R% {8 {& J3 }! \plt.style.use('ggplot') 3 ?: m- C. z8 a; ^x,y=make_blobs(n_samples=300,centers=4,cluster_std=1.0,random_state=10)9 x$ a* s$ \: e8 a- M: j& j8 K
plt.scatter(x[:,0],x[:,1],s=100)9 ~* k' g" G' A" t
9 p7 A; p# `$ h$ C, E
3 ~ h; D2 _4 E3 B/ v# g; }criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)/ d5 R; s& X% G& m9 p9 H2 C
flags=cv2.KMEANS_RANDOM_CENTERS. P' o0 w# i/ s+ z
compactness,labels,centers=cv2.kmeans(x.astype(np.float32),4,None,criteria,10,flags), [+ e! k& C! G
print(compactness)4 P% G) C/ G2 x" @
: X% ?+ J( W+ w9 u) H# W3 {$ eplt.scatter(x[:,0],x[:,1],c=labels,s=50,cmap='viridis')0 B" s4 ~# @: ]0 [7 D
plt.scatter(centers[:,0],centers[:,1],c='black',s=200,alpha=0.5) & o6 B! [% c( F5 ]" W: d2 b& b6 M- T* O. Z+ B
pylab.show()# h2 R2 ]6 u. s1 \, |7 r