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的話,要求是選擇不重複的數,所以要選出...