1. 程式人生 > >機器學習(二)——K均值聚類演算法(K-means)

機器學習(二)——K均值聚類演算法(K-means)

概述:

1.聚類

“類”指的是具有相似性的集合。聚類是指將資料集劃分為若干類,使得類內之間的資料最為相識,各類之間的資料相似度差別儘可能大。聚類分析就是以相似性為基礎,對資料集進行聚類分析,屬於無監督學習。

2.無監督學習和監督學習

k-均值聚類(k-means)與k-近鄰(knn)演算法之間沒有任何關係。

監督學習知道從物件(資料)中學習什麼,而無監督學習無需知道所要搜尋的目標,它是根據演算法得到資料的共同特徵。比如分類和聚類來說,分類事先就知道所要得到的類別,而聚類則不一樣,只是以相似度為基礎,將物件分得不同的簇。

3.k-means

k-means聚類演算法是一種簡單的迭代聚類演算法,採用距離作為相似性指標,從而發現給定資料集的K個類,且每個類的中心是根據類中所有值的均值得到。選取歐式距離來作為相似度指標。

4.虛擬碼

建立K個點作為起始質心(經常是隨機選擇)

當任意一個點的簇分配結果發生改變時

        對資料集中的每個資料點

                對每個質心

                        計算質心與資料點之間的距離

                將資料點分配到距其最近的簇

        對每一個簇,計算簇中所有點的均值並將均值作為質心

 

import numpy as np

#計算距離
def dist(vecA,vecB):
    return sqrt(sum(power((vecA-vecB),2)))

#隨機生成質心點
def randCent(dataSet,k):
    n = dataSet.shape[1]
    center = np.mat(np.zeros(k,n))
    for j in range(n):
        minJ = min(dataSet[:,j])
        rangeJ = float(max(dataSet[:,j])-minJ)
        center[:,j] = minJ+rangeJ*np.random.rand(k,1)
    return center
def kMeans(dataSet,k):
    m = dataSet.shape[0]  #資料集的個數
    clusterAssment = np.mat(np.zeros(m,2))  #生成一個m行2列的0矩陣,第一列用於儲存簇的類別,第二列用於儲存距離
    center = randCent(dataSet,k)  #隨機得到的質心點
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):  #遍歷每一個數據
            minDist = inf  #inf代表無窮大,-inf代表無窮小
            minIndex = -1
            for j in range(k):  #遍歷每一個質心
                distJI = dist(dataSet[i,:],center[j,:])  #計算資料與質心的距離
                if distJI<minDist:
                    minDist = distJI
                    minIndex = j
            if clusterAssment[i,0] != minIndex:  #判斷是否收斂,用於迭代,直到所有資料點的簇分配結果不再改變
                clusterChanged = True
            clusterAssment[i,:] = minIndex,minDist**2  #賦值
        print(center)
        for cent in range(k):  #更新聚類質心的值
            dataCent = dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]]  #得到的dataCent為屬於同一質心的資料集
            center[cent,:]=np.mean(dataCent,axis=0)  #計算每一個類的新質心
    return center,clusterAssment
                

sklearn中的k-means

class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’

1. k-means需要調的引數很少,主要是n_clusters,簇的個數

 2.返回物件的屬性

(1)cluster_centers_:每個簇的中心座標

(2)labels_:每個資料點的標籤

(3)inertia_:同一類別下的所有點到簇的平方距離

3.k-means物件的方法

(1) fit(X):計算聚類的簇

(2)predict(X):預測新的資料集的分類

from sklearn.cluster import KMeans
import numpy as np
x = np.array([[1, 2], [1, 4], [1, 0],
             [4, 2], [4, 4], [4, 0]])
clf = KMeans(n_clusters=2,random_state=0)
clf.fit(x)
clf.labels_
>>>array([0, 0, 0, 1, 1, 1])

clf.cluster_centers_
>>>array([[ 1.,  2.],
       [ 4.,  2.]])

clf.inertia_
>>>16.0
clf.predict([[0, 0], [4, 4]])
>>>array([0, 1])

用分類器對未知資料進行分類,需要使用的是分類器的predict方法