聚類演算法的設計與實現

2022-01-17 07:28:46 字數 3434 閱讀 1860

常用的聚類演算法有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 5

#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 }

view code

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的大小,若前者小於後者,則為...