/*k-means思想: 將n個樣本分成k個聚類,每個聚類裡的樣本關聯性(或者說是相似性)比較高。
舉個例子,假如有5個樣本,每個樣本是乙個2維向量,分別記做a,b,c,d,e,我要將他們分成2個聚類,第一步是隨機選2個樣本(也可以是虛擬的)把它們當做中心點,然後將
a,b,c,d,e歸類到距離最小的那個中心點,之後再對每個聚類進行調整中心點,假如現在a,b,c是乙個聚類,d,e是乙個聚類,調整的方式的話,以a,b,c這個聚類為例,
那麼中心點的第一維取a,b,c的第一維的平均值,第二維也是取平均值。於是得到了新的聚類中心點,一直迭代下去,直到所有的中心點不發生變化。
*/#include#include
#include
#include
#include
using
namespace
std;
struct vector //
資料向量
vector(
intd)
void create(int
d)
void copy(const vector&other)
void add(const vector&other)
~vector()
};struct cluster //
聚類結構
;class
kmeans
~kmeans()
void
initclusters()
}void
run()
}void
distribute()
}int closestcluster(int
id) }
return
clusterid;
}double eucnorm(int id,int
k)
return
sumofsquare;
}bool recalculatecenters()}}
return
converged;
}//獲得第id個聚類
cluster& getcluster(int
id)};
//列印乙個資料
void printvector(ostream& output,const vector&v)
}void partitionobservations(istream&input)
//建立kmeans例項
kmeans kmeans(n,dimen,k,obs);
kmeans.initclusters();
kmeans.run();
ostream& output=cout;
for(int c=0;c//
輸出k個簇
cluster& cluster=kmeans.getcluster(c);
output
<<"
----第
"<<(c+1)<<"
個聚類----\n";
output
<<"
聚類中心:";
printvector(output,cluster.center);
for(int m=0;m)
output
<}
delete
obs;
}int
main()
資料探勘經典演算法之 K means演算法
k means 是一種基於距離的排他的聚類劃分方法。上面的 k means 描述中包含了幾個概念 給定乙個 n 個物件的資料集,它可以構建資料的 k 個劃分,每個劃分就是乙個簇,並且 k n。同時還需滿足 每個組至少包含乙個物件。每個物件必須屬於且僅屬於乙個簇。如圖所示,簡單的來說,k means聚...
資料探勘演算法 k means
k means 演算法r實現 先用setwd設定工作空間,如d盤,並將相關資料拷貝到該目錄下 setwd d k means 讀入資料 data read.csv d k means data km kmeans data,center 3 print km km size sum km size ...
資料探勘演算法 K means演算法
k means中文稱為k均值聚類演算法,在1967年就被提出 所謂聚類就是將物理或者抽象物件的集合分組成為由類似的物件組成的多個簇的過程 聚類生成的組成為簇 簇內部任意兩個物件之間具有較高的相似度,不同簇的兩個物件之間具有較高的相異度 相異度和相似度可以根據描述的物件的屬性值來計算 物件間的距離是最...