機器學習——k-均值算法(聚類)

k-均值(k-means)聚類

一、k-均值算法

k-均值算法是一種無監督學習,是一種「基於原型的聚類」(prototype-based clustering)方法,給定的數據是不含標籤的 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} ,目標是找出數據的模式特徵進行分類。如社交網絡分析,經過用戶特徵進行簇劃分,分出不一樣羣體。
在這裏插入圖片描述
(圖源網絡,侵刪)html

二、k-均值算法的代價函數

給定數據集 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} ,k-均值聚類算法的代價函數(基於歐式距離的平方偏差)爲:
J = m 1 i = 1 m x ( i ) u c ( i ) 2 J=\frac{m}{1}\sum_{i=1}^{m}||x^{(i)}-u_{c^{(i)}}||^2
其中, c ( i ) c^{(i)} 是訓練樣例 x ( i ) x^{(i)} 分配的聚類序號; u c ( i ) u_{c^{(i)}} x ( i ) x^{(i)} 所屬聚類的中心點 。k-均值算法的代價函數函數的物理意義就是,訓練樣例到其所屬的聚類中心點的距離的平均值。python

三、k-均值算法步驟

k-均值算法主要包括:根據聚類中心分配樣本類別——>更新聚類中心web

  1. 隨機選擇K個聚類中心 u 1 , u 2 , . . . , u K u_1,u_2,...,u_K
  2. 從1~m中遍歷全部的數據集,計算 x ( i ) x^{(i)} 分別到 u 1 , u 2 , . . . , u K u_1,u_2,...,u_K 的距離,記錄距離最短的聚類中心點 u k u_k ,而後把 x ( i ) x^{(i)} 這個點分配給這個簇,即令 c ( i ) = k c^{(i)}=k
  3. 從1~k中遍歷全部的聚類中心,移動聚類中心的新位置到這個簇的均值處,即 u k = 1 c k j = 1 c k x ( j ) u_k=\frac{1}{c_k}\sum_{j=1}^{c_k}x^{(j)} ,其中 c k c_k 表示這個簇的樣本數;
  4. 重複步驟2,直到聚類中心再也不移動。

四、初始化聚類中心點和聚類個數

一、在實際應用的過程當中,聚類結果會和咱們初始化的聚類中心相關,由於代價函數可能會收斂在一個局部最優解上,而不是全局最優解。咱們的解決方法是屢次初始化,而後選取代價函數最小的
在這裏插入圖片描述
二、若是沒有特別的業務要求,聚類個數如何選取?咱們能夠把聚類個數做爲橫座標,代價函數做爲縱座標,找出拐點。
在這裏插入圖片描述算法

五、sklearn實現k-means算法

推薦一篇博文: 聚類效果評價

主函數KMeans網絡

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=1, 
	algorithm='auto'
	)

參數解釋:app

  1. n_clusters:簇的個數,即你想聚成幾類
  2. init: 初始簇中心的獲取方法
  3. n_init: 獲取初始簇中心的更迭次數,爲了彌補初始質心的影響,算法默認會初始10次質心,實現算法,而後返回最好的結果。
  4. max_iter: 最大迭代次數(由於kmeans算法的實現須要迭代)
  5. tol: 容忍度,即kmeans運行準則收斂的條件
  6. precompute_distances:是否須要提早計算距離,這個參數會在空間和時間之間作權衡,若是是True 會把整個距離矩陣都放到內存中,auto 會默認在數據樣本大於featurs*samples 的數量大於12e6 的時候False,False 時核心實現的方法是利用Cpython 來實現的
  7. verbose: 冗長模式(不太懂是啥意思,反正通常不去改默認值)
  8. random_state: 隨機生成簇中心的狀態條件。
  9. copy_x: 對是否修改數據的一個標記,若是True,即複製了就不會修改數據。bool 在scikit-learn 不少接口中都會有這個參數的,就是是否對輸入數據繼續copy 操做,以便不修改用戶的輸入數據。這個要理解Python 的內存機制纔會比較清楚。
  10. n_jobs: 並行設置
  11. algorithm: kmeans的實現算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式實現

代碼:dom

# -*- coding: utf-8 -*-
""" Created on Wed Nov 20 18:52:21 2019 @author: 1 """

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df=pd.read_csv('D:\\workspace\\python\machine learning\\data\\iris.csv',sep=',')
data=df.iloc[:,0:3]
kmeans=KMeans(n_clusters=3)   #n_clusters:number of cluster
kmeans.fit(data)
labels=kmeans.labels_#聚類標籤
centres=kmeans.cluster_centers_#聚類中心

#畫三維聚類結果圖
markers=['o','^','*']
colors=['r','b','y']
data['labels']=labels
ax = plt.subplot(111, projection='3d')  # 建立一個三維的繪圖工程
data_new,X,Y,Z=[[]]*3,[[]]*3,[[]]*3,[[]]*3
for i in range(3):
    data_new[i]=data.loc[data['labels']==i]
    X[i],Y[i],Z[i]=data_new[i].iloc[:,0],data_new[i].iloc[:,1],data_new[i].iloc[:,2]
    ax.scatter(X[i],Y[i],Z[i],marker=markers[i],c=colors[i])

聚類結果:
在這裏插入圖片描述svg

相關文章
相關標籤/搜索