相對於決策樹、樸素貝葉斯、SVM等有監督學習,聚類算法屬於無監督學習。html
有監督學習一般根據數據集的標籤進行分類,而無監督學習中,數據集並無相應的標籤,算法僅根據數據集進行劃分。算法
因爲具備出色的速度和良好的可擴展性,Kmeans聚類算法算得上是最著名的聚類方法。dom
在沒有標籤的數據集中,全部的數據點都是同一類的。學習
在這張圖中,雖然數據都爲同一類,可是能夠直觀的看出,數據集存在簇或聚類。這種數據沒有比標籤,但能發現其結構的狀況,稱做非監督學習。優化
最基本的聚類算法,也是目前使用最多的聚類算法叫作K-均值(K-Means)。spa
假設一組數據集爲下圖:3d
他們應該有兩個簇,其中簇的中心以下圖:code
在K-Means算法中,首先隨便畫出聚類中心,它能夠是不正確的:htm
(假設上方綠點爲中心1,下方綠點爲中心2)blog
K-Means算法分爲兩個步驟:
一、分配
二、優化
進行第一步,對於上圖的數據集,首先找出在全部紅色點中,距離中心1比距離中心2更近的點
簡單的方法是找出兩個中心點的垂直平分線,將紅色的點分割爲兩部分,分別是距離各自中心更近的點
第二步是優化。首先將聚類中心和第一步分配完的點相鏈接,而後開始優化:移動聚類中心,使得與聚類中心相鏈接的線的平方和最短。
屢次進行步驟1和2,即先分配再優化,聚類中心將會逐步移動到數據簇的中心。
環境:MacOS mojave 10.14.3
Python 3.7.0
使用庫:scikit-learn 0.19.2
sklearn.cluster.KMeans官方庫:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
>>> from sklearn.cluster import KMeans >>> import numpy as np >>> X = np.array([[1, 2], [1, 4], [1, 0], ... [10, 2], [10, 4], [10, 0]]) #輸入六個數據點 >>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X) #肯定一共有兩個聚類中心 >>> kmeans.labels_ array([1, 1, 1, 0, 0, 0], dtype=int32) >>> kmeans.predict([[0, 0], [12, 3]]) #預測兩個新點的聚類分類狀況 array([1, 0], dtype=int32) >>> kmeans.cluster_centers_ #輸出兩個聚類中心的座標 array([[10., 2.], [ 1., 2.]])