数字图像处理-----主成成分分析PCA

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字图像处理-----主成成分分析PCA
主成分分析PCA
降维的必要性
1.多重共线性--预测变量之间相互关联。

多重共线性会导致解空间的不稳定,从⽽可能导致结果的不连贯。

2.⾼维空间本⾝具有稀疏性。

⼀维正态分布有68%的值落于正负标准差之间,⽽在⼗维空间上只有0.02%。

3.过多的变量会妨碍查找规律的建⽴。

4.仅在变量层⾯上分析可能会忽略变量之间的潜在联系。

例如⼏个预测变量可能落⼊仅反映数据某⼀⽅⾯特征的⼀个组内。

降维的⽬的:
1.减少预测变量的个数
2.确保这些变量是相互独⽴的
3.提供⼀个框架来解释结果
降维的⽅法有:主成分分析、因⼦分析、⽤户⾃定义复合等。

PCA(Principal Component Analysis)不仅仅是对⾼维数据进⾏降维,更重要的是经过降维去除了噪声,发现了数据中的模式。

PCA把原先的n个特征⽤数⽬更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最⼤化样本⽅差,尽量使新的m个特征互不相关。

从旧特征到新特征的映射捕获数据中的固有变异性。

预备知识
样本X和样本Y的协⽅差(Covariance):
协⽅差矩阵的最⼤特征向量总是指向数据最⼤⽅差的⽅向,并且该向量的幅度等于相应的特征值。

第⼆⼤特征向量总是正交于最⼤特征向量,并指向第⼆⼤数据的传播⽅向。

协⽅差的matlab计算公式为:
协⽅差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1)
a =
-1 1 2
-2 3 1
4 0 3
for i=1:size(a,2)
for j=1:size(a,2)
c(i,j)=sum((a(:,i)-mean(a(:,i))).*(a(:,j)-mean(a(:,j))))/(size(a,1)-1);
end
end
c =
10.3333 -4.1667 3.0000
-4.1667 2.3333 -1.5000
3.0000 -1.5000 1.0000
协⽅差为正时说明X和Y是正相关关系,协⽅差为负时X和Y是负相关关系,协⽅差为0时X和Y相互独⽴。

Cov(X,X)就是X的⽅差(Variance).
当样本是n维数据时,它们的协⽅差实际上是协⽅差矩阵(对称⽅阵),⽅阵的边长是。

⽐如对于3维数据(x,y,z),计算它的协⽅差就是:
了变化,缩放⽐例就是相应的特征值。

当A是n阶可逆矩阵时,A与P-1Ap相似,相似矩阵具有相同的特征值。

特别地,当A是对称矩阵时,A的奇异值等于A的特征值,存在正交矩阵Q(Q-1=Q T),使得:
对A进⾏就能求出所有特征值和Q矩阵。

D是由特征值组成的对⾓矩阵
由特征值和特征向量的定义知,Q的列向量就是A的特征向量。

Jama包
包是⽤于基本线性代数运算的java包,提供矩阵的cholesky分解、LUD分解、QR分解、奇异值分解,以及PCA中要⽤到的特征值分解,此外可以计算矩阵的乘除法、矩阵的范数和条件数、解线性⽅程组等。

PCA过程
1.特征中⼼化。

即每⼀维的数据都减去该维的均值。

这⾥的“维”指的就是⼀个特征(或属性),变换之后每⼀维的均值都变成了0。

很多数据挖掘的教材上都会讲到鹫尾花的例⼦,本⽂就拿它来做计算。

原始数据是150×4的矩阵A:
5.1 3.5 1.40.2
4.9 3.0 1.40.2
4.7 3.2 1.30.2
4.6 3.1 1.50.2
5.0 3.6 1.40.2
5.4 3.9 1.70.4
4.6 3.4 1.40.3
5.0 3.4 1.50.2
4.4 2.9 1.40.2
4.9 3.1 1.50.1
5.4 3.7 1.50.2
4.8 3.4 1.60.2
4.8 3.0 1.40.1
4.3 3.0 1.10.1
5.8 4.0 1.20.2
5.7 4.4 1.50.4
5.4 3.9 1.30.4
5.1 3.5 1.40.3
5.7 3.8 1.70.3
5.1 3.8 1.50.3
5.4 3.4 1.70.2
5.1 3.7 1.50.4
4.6 3.6 1.00.2
5.1 3.3 1.70.5
4.8 3.4 1.90.2
5.0 3.0 1.60.2
5.0 3.4 1.60.4
5.2 3.5 1.50.2
5.2 3.4 1.40.2
4.7 3.2 1.60.2
4.8 3.1 1.60.2
5.4 3.4 1.50.4
5.2 4.1 1.50.1
5.5 4.2 1.40.2
4.9 3.1 1.50.1
5.0 3.2 1.20.2
5.5 3.5 1.30.2
4.9 3.1 1.50.1
4.4 3.0 1.30.2
5.1 3.4 1.50.2
5.0 3.5 1.30.3
4.5 2.3 1.30.3
4.4 3.2 1.30.2
5.0 3.5 1.60.6
5.1 3.8 1.90.4
4.8 3.0 1.40.3
5.1 3.8 1.60.2
4.6 3.2 1.40.2
5.3 3.7 1.50.2
5.0 3.3 1.40.2
7.0 3.2 4.7 1.4
6.4 3.2 4.5 1.5
6.9 3.1 4.9 1.5
5.9 3.0 4.2 1.5
6.0 2.2 4.0 1.0 6.1 2.9 4.7 1.4
5.6 2.9 3.6 1.3
6.7 3.1 4.4 1.4 5.6 3.0 4.5 1.5
5.8 2.7 4.1 1.0
6.2 2.2 4.5 1.5 5.6 2.5 3.9 1.1
5.9 3.2 4.8 1.8
6.1 2.8 4.0 1.3 6.3 2.5 4.9 1.5 6.1 2.8 4.7 1.2 6.4 2.9 4.3 1.3 6.6 3.0 4.4 1.4 6.8 2.8 4.8 1.4 6.7 3.0 5.0 1.7 6.0 2.9 4.5 1.5 5.7 2.6 3.5 1.0 5.5 2.4 3.8 1.1 5.5 2.4 3.7 1.0
5.8 2.7 3.9 1.2
6.0 2.7 5.1 1.6
5.4 3.0 4.5 1.5
6.0 3.4 4.5 1.6 6.7 3.1 4.7 1.5 6.3 2.3 4.4 1.3 5.6 3.0 4.1 1.3 5.5 2.5 4.0 1.3
5.5 2.6 4.4 1.2
6.1 3.0 4.6 1.4 5.8 2.6 4.0 1.2 5.0 2.3 3.3 1.0 5.6 2.7 4.2 1.3 5.7 3.0 4.2 1.2
5.7 2.9 4.2 1.3
6.2 2.9 4.3 1.3 5.1 2.5 3.0 1.1
5.7 2.8 4.1 1.3
6.3 3.3 6.0 2.5 5.8 2.7 5.1 1.9
7.1 3.0 5.9 2.1 6.3 2.9 5.6 1.8
6.5 3.0 5.8 2.2
7.6 3.0 6.6 2.1 4.9 2.5 4.5 1.7 7.3 2.9 6.3 1.8
6.7 2.5 5.8 1.8
7.2 3.6 6.1 2.5 6.5 3.2 5.1 2.0 6.4 2.7 5.3 1.9 6.8 3.0 5.5 2.1 5.7 2.5 5.0 2.0
5.8 2.8 5.1 2.4
6.4 3.2 5.3 2.3
6.5 3.0 5.5 1.8
7.7 3.8 6.7 2.2 7.7 2.6 6.9 2.3 6.0 2.2 5.0 1.5 6.9 3.2 5.7 2.3 5.6 2.8 4.9 2.0 7.7 2.8 6.7 2.0 6.3 2.7 4.9 1.8
6.7 3.3 5.7 2.1
7.2 3.2 6.0 1.8 6.2 2.8 4.8 1.8 6.1 3.0 4.9 1.8
6.4 2.8 5.6 2.1
7.2 3.0 5.8 1.6 7.4 2.8 6.1 1.9 7.9 3.8 6.4 2.0 6.4 2.8 5.6 2.2 6.3 2.8 5.1 1.5
6.1 2.6 5.6 1.4
7.7 3.0 6.1 2.3 6.3 3.4 5.6 2.4
6.7 3.0 5.2 2.3
6.3 2.5 5.0 1.9
6.5 3.0 5.2 2.0
6.2 3.4 5.4 2.3
5.9 3.0 5.1 1.8
每⼀列减去该列均值后,得到矩阵B:
-0.7433330.446 -2.35867 -0.998667 -0.943333 -0.054 -2.35867 -0.998667 -1.143330.146 -2.45867 -0.998667 -1.243330.046 -2.25867 -0.998667 -0.8433330.546 -2.35867 -0.998667 -0.4433330.846 -2.05867 -0.798667 -1.243330.346 -2.35867 -0.898667 -0.8433330.346 -2.25867 -0.998667 -1.44333 -0.154 -2.35867 -0.998667 -0.9433330.046 -2.25867 -1.09867 -0.4433330.646 -2.25867 -0.998667 -1.043330.346 -2.15867 -0.998667 -1.04333 -0.054 -2.35867 -1.09867 -1.54333 -0.054 -2.65867 -1.09867 -0.04333330.946 -2.55867 -0.998667 -0.143333 1.346 -2.25867 -0.798667 -0.4433330.846 -2.45867 -0.798667 -0.7433330.446 -2.35867 -0.898667 -0.1433330.746 -2.05867 -0.898667 -0.7433330.746 -2.25867 -0.898667 -0.4433330.346 -2.05867 -0.998667 -0.7433330.646 -2.25867 -0.798667 -1.243330.546 -2.75867 -0.998667 -0.7433330.246 -2.05867 -0.698667 -1.043330.346 -1.85867 -0.998667 -0.843333 -0.054 -2.15867 -0.998667 -0.8433330.346 -2.15867 -0.798667 -0.6433330.446 -2.25867 -0.998667 -0.6433330.346 -2.35867 -0.998667 -1.143330.146 -2.15867 -0.998667 -1.043330.046 -2.15867 -0.998667 -0.4433330.346 -2.25867 -0.798667 -0.643333 1.046 -2.25867 -1.09867 -0.343333 1.146 -2.35867 -0.998667 -0.9433330.046 -2.25867 -1.09867 -0.8433330.146 -2.55867 -0.998667 -0.3433330.446 -2.45867 -0.998667 -0.9433330.046 -2.25867 -1.09867 -1.44333 -0.054 -2.45867 -0.998667 -0.7433330.346 -2.25867 -0.998667 -0.8433330.446 -2.45867 -0.898667 -1.34333 -0.754 -2.45867 -0.898667 -1.443330.146 -2.45867 -0.998667 -0.8433330.446 -2.15867 -0.598667 -0.7433330.746 -1.85867 -0.798667 -1.04333 -0.054 -2.35867 -0.898667 -0.7433330.746 -2.15867 -0.998667 -1.243330.146 -2.35867 -0.998667 -0.5433330.646 -2.25867 -0.998667 -0.8433330.246 -2.35867 -0.998667 1.156670.1460.9413330.201333
0.5566670.1460.7413330.301333
1.056670.046 1.141330.301333
-0.343333 -0.7540.2413330.101333 0.656667 -0.2540.8413330.301333 -0.143333 -0.2540.7413330.101333 0.4566670.2460.9413330.401333 -0.943333 -0.654 -0.458667 -0.198667 0.756667 -0.1540.8413330.101333 -0.643333 -0.3540.1413330.201333 -0.843333 -1.054 -0.258667 -0.198667 0.0566667 -0.0540.4413330.301333 0.156667 -0.8540.241333 -0.198667 0.256667 -0.1540.9413330.201333 -0.243333 -0.154 -0.1586670.101333 0.8566670.0460.6413330.201333 -0.243333 -0.0540.7413330.301333
0.456667 -0.554 1.141330.301333
0.256667 -0.2540.9413330.00133333 0.556667 -0.1540.5413330.101333 0.756667 -0.0540.6413330.201333 0.956667 -0.254 1.041330.201333
0.856667 -0.054 1.241330.501333
0.156667 -0.1540.7413330.301333 -0.143333 -0.454 -0.258667 -0.198667 -0.343333 -0.6540.0413333 -0.0986667 -0.343333 -0.654 -0.0586667 -0.198667 -0.0433333 -0.3540.1413330.00133333 0.156667 -0.354 1.341330.401333
-0.443333 -0.0540.7413330.301333 0.1566670.3460.7413330.401333 0.8566670.0460.9413330.301333 0.456667 -0.7540.6413330.101333 -0.243333 -0.0540.3413330.101333 -0.343333 -0.5540.2413330.101333 -0.343333 -0.4540.6413330.00133333 0.256667 -0.0540.8413330.201333 -0.0433333 -0.4540.2413330.00133333 -0.843333 -0.754 -0.458667 -0.198667 -0.243333 -0.3540.4413330.101333 -0.143333 -0.0540.4413330.00133333 -0.143333 -0.1540.4413330.101333 0.356667 -0.1540.5413330.101333 -0.743333 -0.554 -0.758667 -0.0986667 -0.143333 -0.2540.3413330.101333 0.4566670.246 2.24133 1.30133
-0.0433333 -0.354 1.341330.701333
1.25667 -0.054
2.141330.901333
0.456667 -0.154 1.841330.601333
0.656667 -0.054 2.04133 1.00133
1.75667 -0.054
2.841330.901333
-0.943333 -0.5540.7413330.501333 1.45667 -0.154 2.541330.601333
0.856667 -0.554 2.041330.601333
1.356670.546
2.34133 1.30133
0.6566670.146 1.341330.801333
0.556667 -0.354 1.541330.701333
0.956667 -0.054 1.741330.901333
-0.143333 -0.554 1.241330.801333
-0.0433333 -0.254 1.34133 1.20133
0.5566670.146 1.54133 1.10133
0.656667 -0.054 1.741330.601333
1.856670.746
2.94133 1.00133
1.85667 -0.454 3.14133 1.10133
0.156667 -0.854 1.241330.301333
1.056670.146 1.94133 1.10133
-0.243333 -0.254 1.141330.801333
1.85667 -0.254
2.941330.801333
0.456667 -0.354 1.141330.601333
0.8566670.246 1.941330.901333
1.356670.146
2.241330.601333
0.356667 -0.254 1.041330.601333
0.256667 -0.054 1.141330.601333
0.556667 -0.254 1.841330.901333
1.35667 -0.054
2.041330.401333
1.55667 -0.254
2.341330.701333
2.056670.746 2.641330.801333
0.556667 -0.254 1.84133 1.00133
0.456667 -0.254 1.341330.301333
0.256667 -0.454 1.841330.201333
1.85667 -0.054
2.34133 1.10133
0.4566670.346 1.84133 1.20133
0.5566670.046 1.741330.601333
0.156667 -0.054 1.041330.601333
1.056670.046 1.641330.901333
0.8566670.046 1.84133 1.20133
1.056670.046 1.34133 1.10133
-0.0433333 -0.354 1.341330.701333
0.9566670.146 2.14133 1.10133
0.8566670.246 1.94133 1.30133
0.856667 -0.054 1.44133 1.10133
0.456667 -0.554 1.241330.701333
0.656667 -0.054 1.441330.801333
0.3566670.346 1.64133 1.10133
0.0566667 -0.054 1.341330.601333
2.计算B的协⽅差矩阵C:
-0.03926850.188004 -0.321713 -0.117981
1.27368 -0.321713 3.11318 1.29639
0.516904 -0.117981 1.296390.582414
3.计算协⽅差矩阵C的特征值和特征向量。

查阅matlab help可以知道,利⽤eig函数可以快速求解矩阵的特征值与特征向量。

格式:[V,D] = eig(A)
说明:其中D为特征值构成的对⾓阵,每个特征值对应于V矩阵中列向量(也正是其特征向量),如果只有⼀个返回变量,则得到该矩阵特征值构成的列向量。

C=V*S*V-1
S=
4.2248414 0 0 0
0 0.24224437 0 0
0 0 0.0785243870
0 0 0 0.023681839
V=
0.36158919 0.65654382 -0.58100304 0.3172364
-0.082268924 0.72970845 0.596429220 -0.3240827
0.85657212 -0.175769720. 072535217 -0.47971643
0.35884438 -0.074704743 0.54904125 0.75113489
4.选取⼤的特征值对应的特征向量,得到新的数据集。

特征值是由⼤到⼩排列的,前两个特征值的和已经超过了所有特征值之和的97%。

我们取前两个特征值对应的特征向量,得到⼀个4×2的矩阵M。

令A'150×2=A150×4M4×2,这样我们就把150×4的数据A集映射成了150×2的数据集A',特征由4个减到了2个。

A'=
2.8271335 5.6413345
2.7959501 5.1451715
2.6215213 5.1773814
2.7649037 5.0036022
2.7827477 5.648651
3.2314432 6.0625092
2.6904502 5.2326213
2.8848587 5.4851323
2.6233824 4.7439288
2.837496 5.2080359
3.0048137 5.9666624
2.898198 5.3362466
2.7239067 5.0869876
2.2861405 4.8114466
2.867797 6.5009233
3.127471 6.6594805
2.8888143 6.132817
2.8630179 5.633864
3.3122624 6.1939719
2.9239945 5.8351996
3.2008088 5.7125959
2.9681058 5.7547583
2.2954831 5.4563413
3.2082122 5.4202505
3.1551697 5.2835156
3.0034234 5.1756719
3.0422848 5.4526144
2.9489496 5.6894119
2.8715193 5.634018
2.8784929 5.1246505
2.9228787 5.117334
3.1012632 5.7328089
2.8637038 6.1347075
2.9141809 6.4147479
2.837496 5.2080359
2.6443408 5.3919215
2.8861119 5.921529
2.837496 5.2080359
2.5294983 4.8344766
2.9210176 5.5507867
2.7412018 5.5857866
2.6591299 4.3818646
2.5130445 4.9804183
3.1058267 5.5106443
3.3025077 5.7574212
5.6923082 4.4891254
6.5984751 5.3901207 6.1517776 4.8974035 6.6065644 5.5986187 4.759874 4.3136202 6.5546382 5.5436868 5.5011511 4.5941521
5.0002549 4.0522372
6.0224389 5.2124439
5.7736764 4.7668379
6.4953853 5.1903675
5.3364769 5.0629127
6.4389134 5.7829664 6.1709338 4.9627499
5.7458813 4.9828064
6.4537025 4.7729094
5.5545872 4.7332394
6.6275817 5.2305124
5.8681272 5.2479059
6.8078095 4.9871684 6.4318433 5.1323376 6.2253487 5.465109 6.4109813 5.6443412
6.8423818 5.5594003
7.0687368 5.5821223 6.3237964 5.1523966 5.204006 4.949643 5.440998 4.6121911 5.3194564 4.6372386
5.6463357 5.0030194
6.8900779 4.8935226 6.098616 4.8314411 6.3185463 5.5097803 6.7317694 5.722765 6.3242084 4.9440526 5.7565361 5.0479987 5.6758544 4.6350671
5.9743719 4.6452005
6.4015012 5.2809153 5.7402198 4.9124716
4.8042598 4.3063037
5.866874 4.8115092 5.8424678 5.1035466
5.8865791 5.0231053
6.1530309 5.3338002
4.6028777 4.5631602
5.8091488 4.9677114 8.0430681 5.3028838
6.9254133 4.7398024 8.1278252 5.6566652
7.4821558 5.1336016
7.8610989 5.2728454
8.9082203 5.8618983 6.0307247 4.123374 8.4433454 5.6671066
7.8310134 5.0691818
8.4294749 6.0951088 7.1732758 5.5567668 7.3136813 5.0985747 7.6767196 5.5300099
6.8559354 4.5383128
7.0966086 4.7754209 7.4160846 5.4335471 7.4605895 5.3554582 9.0001057 6.486272 9.3060273 5.5679974
6.8096707 4.5537158
7.939508 5.6915111 6.7094386 4.7091479 9.0106057 5.7715045
6.8990091 5.1106987
7.7871944 5.6481141
8.1255342 5.8730957 6.7689661 5.1355922
6.8020106 5.1983025
7.6341949 5.1038737
7.4162037 5.3627746
6.6801944 5.1502251
7.6189944 5.6862121
7.8256443 5.497338
7.4337916 5.7240021
6.9254133 4.7398024
8.0746635 5.5907028
7.9307322 5.6182322
7.4553579 5.5021455
7.0370045 4.9397096
7.2753867 5.3932482
7.4129702 5.430603
6.9010071 5.0318398
每个样本正好是⼆维的,画在平⾯坐标系中如图:
鹫尾花数据集共分为3类花(前50个样本为⼀类,中间50个样本为⼀类,后50个样本为⼀类),从上图可以看到把数据集映射到2维后分类会更容易进⾏,直观上看已经是线性可分的了,下⾯我们⽤对其进⾏聚类。

当然我们已知了有3类,所以在设计SOFM⽹络时,我把竞争层节点数设为3,此时的聚类结果是前50个样本聚为⼀类,后100个样本聚为⼀类。

当把竞争层节点数改为4时,仅第2类中的3个样本被误分到了第3类中,整体精度达98%!
#include<iostream>
#include<fstream>
#include<set>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<ctime>
using namespace std;
const int sample_num=150; //鹫尾花样本个数
const int class_num=4; //指定聚类的数⽬
int iteration_ceil; //迭代的上限
vector<pair<double,double> > flowers(sample_num); //样本数据
vector<vector<double> > weight(class_num); //权向量
const double prime_eta=0.7; //初始学习率
/*向量模长归⼀化*/
void normalize(vector<double> &vec){
double sum=0.0;
for(int i=0;i<vec.size();++i)
sum+=pow(vec[i],2);
sum=sqrt(sum);
for(int i=0;i<vec.size();++i)
vec[i]/=sum;
}
/*从⽂件读⼊鹫尾花样本数据*/
void init_sample(string filename){
ifstream ifs(filename.c_str());
if(!ifs){
cerr<<"open data file failed."<<endl;
exit(1);
}
for(int i=0;i<sample_num;++i){
vector<double> X(2);
ifs>>X[0]>>X[1];
normalize(X); //输⼊向量模长归⼀化
flowers[i]=make_pair(X[0],X[1]);
}
ifs.close();
}
/*初始化权值*/
void init_weight(){
srand(time(0));
for(int i=0;i<weight.size();++i){
vector<double> ele(2);
ele[0]=rand()/(double)RAND_MAX;
ele[1]=rand()/(double)RAND_MAX;
/*根据输⼊,选择获胜者*/
int pick_winner(double x1,double x2){
int rect=-1;
double max=0.0;
for(int i=0;i<weight.size();++i){
double product=x1*weight[i][0]+x2*weight[i][1];
if(product>max){
max=product;
rect=i;
}
}
return rect;
}
int main(int argc,char *argv[]){
cout<<"input iteration count"<<endl;
int count; //每个样本迭代的次数
cin>>count;
cout<<"input data file name"<<endl;
string filename;
cin>>filename;
iteration_ceil=count*sample_num;
init_sample(filename);
init_weight();
double eta=prime_eta;
double gradient1=-1*9*prime_eta/iteration_ceil;
double gradient2=-1*prime_eta/(9*iteration_ceil);
double b1=prime_eta;
double b2=prime_eta/9;
for(int iteration=0;iteration<iteration_ceil;++iteration){
int flower_index=iteration%sample_num;
double x1=flowers[flower_index].first;
double x2=flowers[flower_index].second;
int winner=pick_winner(x1,x2);
/*更改获胜者的权值*/
weight[winner][0]+=eta*(x1-weight[winner][0]);
weight[winner][1]+=eta*(x2-weight[winner][1]);
/*权向量归⼀化*/
for(int i=0;i<weight.size();++i){
vector<double> W(2);
W[0]=weight[i][0];
W[1]=weight[i][1];
normalize(W);
weight[i][0]=W[0];
weight[i][1]=W[1];
}
/*更新学习率*/
if(iteration<0.1*iteration_ceil){ //在前10%的迭代中,学习率线性下降到原来的10% eta=gradient1*iteration+b1;
}
else{ //后90%的迭代中线性降低到0
eta=gradient2*iteration+b2;
}
}
for(int i=0;i<sample_num;++i){
double x1=flowers[i].first;
double x2=flowers[i].second;
int winner=pick_winner(x1,x2);
cout<<i+1<<"\t"<<winner+1<<endl;
}
return0;
}
输出聚类结果:
12
22
32
42
52
62
72
82
92
102
112
122
132
182 192 202 212 222 232 242 252 262 272 282 292 302 312 322 332 342 352 362 372 382 392 402 412 422 432 442 452 462 472 482 492 502 514 524 534 544 554 564 574 584 594 604 614 624 634 644 654 664 674 684 691 704 714 724 731 744 754 764 774 784 794 804 814 824 834 841 854 864 874 884 894 904 914 924 934 944 954 964 974
1021 1031 1041 1051 1061 1071 1081 1091 1101 1111 1121 1131 1141 1151 1161 1171 1181 1191 1201 1211 1221 1231 1241 1251 1261 1271 1281 1291 1301 1311 1321 1331 1341 1351 1361 1371 1381 1391 1401 1411 1421 1431 1441 1451 1461 1471 1481 1491 1501。

相关文档
最新文档