1.Kmeans算法
1.1算法思想
kmeans算法又名k均值算法,是一個重復移動類中心點的過程,把類的中心點,也稱重心(centroids),移動到其包含成員的平均位置,然后重新划分其內部成員。k是算法計算出的超參數,表示類的數量;Kmeans可以自動分配樣本到不同的類,但是不能決定究竟要分幾個類。k必須是一個比訓練集樣本數小的正整數。有時,類的數量是由問題內容指定的。其算法思想總結為:先從樣本集中隨機選取 k 個樣本作為簇中心,並計算所有樣本與這 k 個“簇中心”的距離,對於每一個樣本,將其划分到與其距離最近的“簇中心”所在的簇中,對於新的簇計算各個簇的新的“簇中心”。
根據以上描述,我們可以知道實現kmeans算法的要點:
(1)簇個數 k 的選擇,一般是按照實際需求進行決定,或在實現算法時直接給定 kk 值。
(2)各個樣本點到“簇中心”的距離
給定樣本 x(i)={x(i)1,x(i)2,,...,x(i)n,}與x(j)={x(j)1,x(j)2,,...,x(j)n,},其中i,j=1,2,...,m,表示樣本數,n表示特征數x(i)={x1(i),x2(i),,...,xn(i),}與x(j)={x1(j),x2(j),,...,xn(j),},其中i,j=1,2,...,m,表示樣本數,n表示特 征數 。本文數據集為連續屬性,因此代碼中主要以歐式距離進行距離的度量計算

(3)根據新划分的簇,更新“簇中心”
1.2算法步驟
輸入:訓練數據集 D=x(1),x(2),...,x(m)D=x(1),x(2),...,x(m) ,聚類簇數 k ;
過程:函數 kMeans(D,k,maxIter)kMeans(D,k,maxIter) .
1:從 D 中隨機選擇 kk 個樣本作為初始“簇中心”向量: μ(1),μ(2),...,,μ(k)μ(1),μ(2),...,,μ(k) :
2:repeat
3: 令 Ci=∅(1≤i≤k)Ci=∅(1≤i≤k)
4: for j=1,2,...,mj=1,2,...,m do
5: 計算樣本 x(j)x(j) 與各“簇中心”向量 μ(i)(1≤i≤k)μ(i)(1≤i≤k) 的歐式距離
6: 根據距離最近的“簇中心”向量確定 x(j)x(j) 的簇標記: λj=argmini∈{1,2,...,k}djiλj=argmini∈{1,2,...,k}dji
7: 將樣本 x(j)x(j) 划入相應的簇: Cλj=Cλj⋃{x(j)}Cλj=Cλj⋃{x(j)} ;
8: end for
9: for i=1,2,...,ki=1,2,...,k do
10: 計算新“簇中心”向量: (μ(i))′=1|Ci|∑x∈Cix(μ(i))′=1|Ci|∑x∈Cix ;
11: if (μ(i))′=μ(i)(μ(i))′=μ(i) then
12: 將當前“簇中心”向量 μ(i)μ(i) 更新為 (μ(i))′(μ(i))′
13: else
14: 保持當前均值向量不變
15: end if
16: end for
17: else
18:until 當前“簇中心”向量均未更新
輸出:簇划分 C=C1,C2,...,CK
1.3代碼實現

1.4算法優缺點
1.4.1優點:
1.原理比較簡單,實現也是很容易,收斂速度快。
2.對大數據集有較高的效率並且是可伸縮性的。
3.主要需要調參的參數僅僅是簇數k。
1.4.2缺點:
1.K值需要預先給定,很多情況下K值的估計是非常困難的。
2.K-Means算法對初始選取的質心點是敏感的,不同的隨機種子點得到的聚類結果完全不同 ,對結果影響很大。
3.采用迭代方法,可能只能得到局部的最優解,而無法得到全局的最優解。
參考文獻:
http://bigdata.51cto.com/art/201804/571439.htm
https://www.cnblogs.com/lliuye/p/9144312.html
