C語言實現k means演算法

2021-09-26 23:43:08 字數 2830 閱讀 3302

k-means主要思想是在給定k值和若干樣本(點)的情況下,把每個樣本(點)分到離其最近的類簇中心點所代表的類簇中,所有點分配完畢之後,根據乙個類簇內的所有點重新計算該類簇的中心點(取平均值),然後再迭代的進行分配點和更新類簇中心點的步驟,直至類簇中心點的變化很小,或者達到指定的迭代次數。

自定義的資料集共有15個:

(2, 7) (2, 5) (8, 4)

(5, 8) (7, 5) (6, 4)

(1, 2) (4, 9) (7, 3)

(1, 3) (3, 9) (6, 7)

(3, 1) (4, 8) (5, 6)

**執行的聚類結果:

cluster-1: (2, 7), (2, 5), (5, 8), (4, 9), (3, 9), (4, 8)

cluster-2: (8, 4), (7, 5), (6, 4), (7, 3), (6, 7), (5, 6)

cluster-3: (1, 2), (1, 3), (3, 1)

#include 

#include

#include

#include

#include

#define n

15#define k3

typedef struct

point;

int center[n]

;/// 判斷每個點屬於哪個簇

point point[n]

=,,,

,,,,

,,,,

,,,}

; point mean[k]

;/// 儲存每個簇的中心點

//獲得兩點間直線距離

float getdistance

(point point1, point point2)

/// 計算每個簇的中心點 把歸屬於該中心點的點相加除以點數

void

getmean

(int center[n]

)}tep.x /= count;

tep.y /= count;

mean[i]

= tep;

}for

(i =

0; i

++i)

}/// 計算平方誤差函式(x1-x2)^2+(y1-y2)^2 計算當前各點與當前所屬中心點間距離誤差

float gete()

}}return sum;

}// 把n個點聚類

void

cluster()

//計算每個點到三個中心點的距離,如果發現有直線距離更短的中心點,則將自己歸入其中,放棄當前中心點

for(q =

0; q

++q)

}//輸出這個過程中的該點及其歸類

printf

("( %.0f, %.0f )\t in cluster-%d\n"

, point[i]

.x, point[i]

.y, center[i]+1

);}printf

("-----------------------------\n");

} int main()

printf

("-----------------------------\n");

mean[0]

.x = point[0]

.x;/// 初始化k個中心點

mean[0]

.y = point[0]

.y;

mean[1]

.x = point[3]

.x; mean[1]

.y = point[3]

.y;

mean[2]

.x = point[6]

.x; mean[2]

.y = point[6]

.y;cluster()

;/// 第一次根據預設的k個點進行聚類

temp1 =

gete()

;/// 第一次平方誤差

n++;/// n計算形成最終的簇用了多少次

printf

("the e1 is: %f\n\n"

, temp1)

;getmean

(center)

;cluster()

; temp2 =

gete()

;/// 根據簇形成新的中心點,並計算出平方誤差

n++;printf

("the e2 is: %f\n\n"

, temp2)

;while

(fabs

(temp2 - temp1)!=0

)/// 比較兩次平方誤差 判斷是否相等,不相等繼續迭代

printf

("the total number of cluster is: %d\n\n"

, n)

;/// 統計出迭代次數

c語言實現k means演算法

pree1.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define dim 784 定義資料的最大維數 define num 10000 定義資料的最大數量 define class 10 定義最大聚類數 int initi...

K means演算法介紹及C 語言實現

k means演算法是輸入聚類個數k,以及包含 n個資料物件的資料庫,輸出滿足方差最小標準的k個聚類。基本簡介k means 演算法接受輸入量 k 然後將n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值...

c語言實現磁碟排程演算法 C語言實現洗牌演算法

首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...