K Means聚類演算法的實現(C語言)

2021-06-27 00:56:29 字數 2127 閱讀 1514

最近做了聚類實驗,就寫了下k-means演算法,c語言實現.

實驗給出的資料集比較小,總共有11個:(2, 10), (2, 5), (8, 4), (5, 8), (7, 5), (6, 4), (1, 2), (4, 9), (7, 3), (1, 3), (3, 9)

**執行的聚類結果:

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

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

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

clementine軟體執行結果:

可以看出與軟體執行結果相比**是正確的.

code:

#include #include #include #include #include #define n 11

#define k 3

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 < k; ++i)

}/// 計算平方誤差函式

float gete()

} }return sum;

}/// 把n個點聚類

void cluster()

for(q = 0; q < k; ++q)

}printf("( %.0f, %.0f )\t in cluster-%d\n", point[i].x, point[i].y, center[i] + 1);

} printf("-----------------------------\n");

}int main()

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

/* 可以選擇當前時間為隨機數

srand((unsigned int)time(null));

for(i = 0; i < k; ++i)

*/ 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); /// 統計出迭代次數

system("pause");

return 0;

}

k means聚類演算法C 實現

clustering 中文翻譯作 聚類 簡單地說就是把相似的東西分到一組,同 classification 分類 不同,對於乙個 classifier 通常需要你告訴它 這個東西被分為某某類 這樣一些例子,理想情況下,乙個 classifier 會從它得到的訓練集中進行 學習 從而具備對未知資料進行...

kmeans聚類 c 實現

num class 聚類數 num data 資料個數 dimension 資料維度 每個資料是多少維的 data 待聚類資料指標 cluster center 聚類中心指標 max error 前後兩次誤差降低到此值迭代終止 max iters 最大迭代次數 1 隨機初始化聚類中心 2 根據聚類中...

C 實現簡單的K means聚類演算法

namespace k means public int getprocess endregion region 根據點到質心的距離,將點放到不同的組中 for int i 0 i num i if j 0 else int groupknum groupnum index resultp inde...