機器學習(二)——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方法