class
pattern
: x=
0 y=
0def
__init__
(self,x,y)
: self.x=x
self.y=y
defdis
(a,b)
:return
((a.x-b.x)
*(a.x-b.x)
+(a.y-b.y)
*(a.y-b.y))**
0.5eps=
0.00001
maxn=
1000050
inf=
4000000000000000000
("請輸入需要將模式分為的類別數 c :")c=
input()
c=int
(c)print
("請輸入模式總數 n :")n=
input()
n=int
(n)print
("請輸入各模式的兩個特徵點 :")a=
b=[]for i in
range
(n):
x,y=
map(
int,
input()
.split())
tmp=pattern(x,y)
for i in
range
(c):
tmp=pattern(a[i]
.x,a[i]
.y)ans=
0while anscnt=[0
]*maxn
belong=[-
1]*maxn
for i in
range
(n):
minn=
4000000000000000000
mini=-1
for j in
range
(c):
dis_to_center=dis(a[i]
,b[j]
)if dis_to_centerminn=dis_to_center
mini=j
belong[i]
=mini
cnt[mini]
=cnt[mini]+1
sum=
for i in
range
(c):
tmp=pattern(0,
0)sumfor i in
range
(n):
sum[belong[i]
].x+=a[i]
.x sum
[belong[i]
].y+=a[i]
.y print
(a[i]
.x,a[i]
.y,belong[i]
,sum
[belong[i]
].x,
sum[belong[i]
].y)
ans=
0for i in
range
(n):
(i,"號點"
,a[i]
.x,a[i]
.y)for i in
range
(c):
if cnt[i]!=0
:sum
[i].x=
sum[i]
.x/cnt[i]
sum[i]
.y=sum
[i].y/cnt[i]
ifabs
(sum
[i].x-b[i]
.x)abs(
sum[i]
.y-b[i]
.y)ans=ans+
1 b[i]
.x=sum
[i].x
b[i]
.y=sum
[i].y
if a[1]
.x!=
1or a[1]
.y!=0:
("i="
,i)for i in
range
(n):
(i,"號點"
,a[i]
.x,a[i]
.y)print
("c均值聚類演算法已經完成!\n\nc個類中心分別為\n"
)for i in
range
(c):
("第"
,i+1
,"類的聚類中心的兩個特徵值分別為"
,b[i]
.x,b[i]
.y)print()
for i in
range
(c):
("屬於第"
,i+1
,"類的點有:"
)for j in
range
(n):
if belong[j]
==i:
(j+1
,"號點"
,a[j]
.x,a[j]
.y)print
()
模糊C均值聚類 python實現
模糊c均值聚類的python實現 存在的問題 用來判斷終止條件的變數dist,是前後兩次隸屬度矩陣的對應元素做差,取絕對值,再取最大值。用鳶尾花資料集的話,dist的值最低只能到小數點後兩位,但是網上別的 能達到小數點後6 7位。但是標準互資訊指數nmi的值相差不大,都在0.74左右。import ...
kmeans均值聚類演算法實現
這個演算法中文名為k均值聚類演算法,首先我們在二維的特殊條件下討論其實現的過程,方便大家理解。由於這是乙個無監督學習的演算法,因此我們首先在乙個二維的座標軸下隨機給定一堆點,並隨即給定兩個質心,我們這個演算法的目的就是將這一堆點根據它們自身的座標特徵分為兩類,因此選取了兩個質心,什麼時候這一堆點能夠...
模糊c均值聚類演算法
模糊c均值聚類演算法 隨著目標數目的增加,jpda所需的運算量呈指數增加,當目標的個數多到一定數目時,將引發運算量的 不滿足實時跟蹤的要求。為了解決這個問題,提出了模糊資料關聯演算法。模糊資料關聯演算法是以模糊均值聚類演算法為基礎的。該演算法通過使目標函式最小化把測量資料分別劃分到以目標 位置為中心...