常用的聚類演算法有k-means(k均值聚類演算法)、dbscan和optics等。
k-means演算法實質上是一種將聚類視為密度估計問題的概率方法。k-means 演算法接受輸入量 k ;然後將n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的物件相似度較高;而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個「中心物件」(引力中心)來進行計算的。
k-means 演算法的步驟:
(1)選k個初始聚類中心,z1(1),z2(1),…,zk(1),其中括號內的序號為尋找聚類中心的迭代運算的次序號。聚類中心的向量值可任意設定,例如可選開始的k個模式樣本的向量值作為初始聚類中心。
(2)逐個將需分類的模式樣本按最小距離準則分配給k個聚類中心中的某乙個zj(1)。假設i=j時,其中k為迭代運算的次序號,第一次迭代k=1,sj表示第j個聚類,其聚類中心為zj。
(3)計算各個聚類中心的新的向量值,zj(k+1),j=1,2,…,k。求各聚類域中所包含樣本的均值向量;其中nj為第j個聚類域sj中所包含的樣本個數。以均值向量作為新的聚類中心,可使如下聚類準則函式最小:在這一步中要分別計算k個聚類中的樣本均值向量,所以稱之為k-均值演算法。
(4)若j=1,2,…,k,則返回第二步,將模式樣本逐個重新分類,重複迭代運算;
若本次迭代與前次的質心聚合相等,即已收斂,計算結束。實現**(參考自
1 #include 2 #include 3 #include 4 #include 5view code#define true 1
6#define false 0
7int n;//
資料個數
8int k;//
集合個數
9int * centerindex;//
初始化質心陣列的索引
10double * center;//
質心集合
11double * centercopy;//
質心集合副本
12double * alldata;//
資料集合
13double ** cluster;//
簇的集合
14int * top;//
集合中元素的個數,也會用作棧處理
1516
17//
隨機生成k個數x(0<=x<=n-1)作為起始的質心集合
18void createrandomarray(int n, int k,int *center)
1933}34
if(j>=i)//
如果不重複,加入
3538
else
3943
} 44}
4546
//返回距離最小的質心的序號
47int getindex(double value,double *center)
4859}60
return
index;61}
6263
//拷貝質心陣列到副本
64void
copycenter()
6571}72
//初始化質心,隨機生成法
73void
initcenter()
7481 copycenter();//
拷貝到質心副本82}
83//
加入乙個資料到乙個cluster[index]集合
84void addtocluster(int index,double
value)85
8889
//重新計算簇集合
90void
updatecluster()
9199
for(i=0;i)
100104
}105
//重新計算質心集合,對每一簇集合中的元素加總求平均即可
106void
updatecenter()
107119
if(top[i]>0)//
如果該簇元素不為空
120123
}124
}125
//判斷2陣列元素是否相等
126int isequal(double * center1 ,double *center2)
127135
}136
return
true;
137}
138//
列印聚合結果
139void
print()
140
150 printf("\n"
);151
}
152}
153//
初始化聚類的各種資料
154void
initdata()
155166 center=(double *)malloc(sizeof(double)*k);//
為質心集合申請空間
167 centerindex=(int *)malloc(sizeof(int)*k);//
為質心集合索引申請空間
168 centercopy=(double *)malloc(sizeof(double)*k);//
為質心集合副本申請空間
169 top=(int *)malloc(sizeof(int)*k);
170 alldata=(double *)malloc(sizeof(double)*n);//
為資料集合申請空間
171 cluster=(double **)malloc(sizeof(double *)*k);//
為簇集合申請空間
172//
初始化k個簇集合
173for(i=0;i)
174178 printf("
輸入%d資料:\n
",n);
179for(i=0;i)
180184 initcenter();//
初始化質心集合
185 updatecluster();//
初始化k個簇集合
186187
}188
/*189
演算法描述:
190k均值演算法:
191給定類的個數k,將n個物件分到k個類中去,
192使得類內物件之間的相似性最大,而類之間的相似性最小。
193*/
194main()
195207
else
//否則將質心副本置為本次迭代得到的的質心集合
208211
}212 print();//
輸出結果
213 }
Kmeans聚類演算法原理與實現
k means 演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。k means 演算法的基本思想是 以空間中 k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。假設要把樣本集分為 k個類別,演算法描述如下 1 適當選擇 ...
聚類演算法之K means演算法與聚類演算法衡量指標
原文出處 聚類就是按照某個特定標準 如距離準則 把乙個資料集分割成不同的類或簇,使得同乙個簇內的資料物件的相似性盡可能大,同時不在同乙個簇中的資料物件的差異性也盡可能地大。即聚類後同一類的資料盡可能聚集到一起,不同資料盡量分離。聚類演算法屬於無監督學習,即事先不會給出標記資訊,通過對無標記樣本的學習...
DBSCAN聚類演算法的實現
設有n個樣本,樣本為p維,1 計算距離矩陣d,時間複雜度為o n n p 2 對距離矩陣的每一行進行從小到大排序,得到sd sorted d 時間複雜度為o n n log n 3 根據eps與minpts,標註核心點 邊界點和雜訊點。首先比較sd minpts 與eps的大小,若前者小於後者,則為...