k-means中文稱為k均值聚類演算法,在2023年就被提出 所謂聚類就是將物理或者抽象物件的集合分組成為由類似的物件組成的多個簇的過程
聚類生成的組成為簇 簇內部任意兩個物件之間具有較高的相似度,不同簇的兩個物件之間具有較高的相異度
相異度和相似度可以根據描述的物件的屬性值來計算 物件間的距離是最常採用的相異度度量指標
常用的距離方法有
k-means是基於劃分的方法 就是通過迭代將資料物件劃分為k個組每個組為乙個簇
每個分組至少包含乙個物件
每個物件屬於且僅屬於某個分組
輸入:簇的數目k和包含n個物件的資料集d
輸出:k個簇的集合
方法:1.從d中任意選擇k個物件作為初始簇的質心;
2.計算每個物件與各簇質心的距離,並且將物件劃分到距離其更近的簇
3.更新每個新簇的質心
4.重複2.3步驟,直到簇中的物件不再變化
對k-means演算法的幾點說明
1.簇的質心就是簇中所有物件在每一維屬性的舉止組合成的虛擬點 並非實際存在的資料點
2.對雜訊和離群(孤立)點資料是敏感,因為它們的存在會對均值的計算產生極大的影響
3.物件到質心的距離通常使用歐式距離來計算
4.要求使用者實現給出生成的數目,要求k值已直
5.演算法收斂的速度和結果容易受初始質心的影響
來個例子:
資料集:
n = 8, k = 2;取1和
3為初始點
序號屬性1
屬性2111
2213
1242
2543
6537
4485
4
1 #include2結果可得using
namespace
std;
3struct
node
4node[100
];8 vectorbeginn[100],endd[100];9
int flag = 0;10
double distance(paira, node b)
13bool check(int
k )
1420
for(int i = 0 ; i < k ; i ++)21
29}
30return
true;31
}32intmain()
33//
只要把這些點當作是初始點就可以 與其他的點無關即可
46while(true)47
53for(int i = 0; i < k; i ++) //
表示有k個堆 計算每個堆裡面的值
5459
for(int i = 0 ;i < n ; i ++)
6068
} 69 endd[u].push_back(i + 1
); 70
}71 cout<
新計算得到的
"<
72for(int i = 0 ; i < k ; i ++)
7378 cout<
原本的"
<
79for(int i = 0 ; i < k ; i ++)
8085
gg.clear();
86for(int i = 0 ; i < k ; i ++)
8794 sum1 = sum1 /endd[i].size();
95 sum2 = sum2 /endd[i].size();
96 gg.push_back(make_pair(sum1,sum2)); //
得到的新的值 97}
98 cout<
新的平均值:
"<
99for(int i = 0 ; i < k ;i ++)
100 cout
"<< gg[i].second<
101 cout<
102if
(check(k))
103return0;
104}
105return0;
106 }
資料探勘演算法 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思想 將n個樣本分成k個聚類,每個聚類裡的樣本關聯性 或者說是相似性 比較高。舉個例子,假如有5個樣本,每個樣本是乙個2維向量,分別記做a,b,c,d,e,我要將他們分成2個聚類,第一步是隨機選2個樣本 也可以是虛擬的 把它們當做中心點,然後將 a,b,c,d,e歸類到距離最小的那個中...
資料探勘經典演算法之 K means演算法
k means 是一種基於距離的排他的聚類劃分方法。上面的 k means 描述中包含了幾個概念 給定乙個 n 個物件的資料集,它可以構建資料的 k 個劃分,每個劃分就是乙個簇,並且 k n。同時還需滿足 每個組至少包含乙個物件。每個物件必須屬於且僅屬於乙個簇。如圖所示,簡單的來說,k means聚...