聚類分析
指將對象的集合分組為由類似的對象組成的多個類的分析過程,目的是在相似的基礎上收集數據來分類。
聚類算法分為:
1)划分聚類:K-means聚類、K-中心點聚類、CLARANS算法
2)層次聚類 :DIANA算法、BIRCH算法、Chameleon算法
3)模糊聚類 :EM算法
4)基於密度聚類:OPTICS算法、DBSCAN算法

K-Means(K均值)聚類
算法步驟:
(1) 首先我們選擇一些類/組,並隨機初始化它們各自的中心點。中心點是與每個數據點向量長度相同的位置。這需要我們提前預知類的數量(即中心點的數量)。
(2) 計算每個數據點到中心點的距離,數據點距離哪個中心點最近就划分到哪一類中。
(3) 計算每一類中中心點作為新的中心點。
(4) 重復以上步驟,直到每一類中心在每次迭代后變化不大為止。也可以多次隨機初始化中心點,然后選擇運行結果最好的一個。
K-Modes算法
X-01 為什么要用k-modes算法
傳統的k-means算法只適用於連續屬性的數據集,但對於離散屬性的數據集,計算簇的均值以及點之間的歐式距離就變得不合適了。k-modes作為k-means的一種擴展,適用於離散屬性的數據集。
X-02 k-modes算法介紹
假設有N個樣本,M個屬性且全是離散的,簇的個數為k
步驟一:隨機確定k個聚類中心C1,C2...CkC1,C2...Ck,CiCi是長度為M的向量,Ci=[C1i,C2i,...,CMi]Ci=[Ci1,Ci2,...,CiM]
步驟二:對於樣本xj(j=1,2,...,N)xj(j=1,2,...,N),分別比較其與k個中心之間的距離(這里的距離為不同屬性值的個數,假如x1=[1,2,1,3],C1=[1,2,3,4]那么x1x1與C1C1之間的距離為2)
步驟三:將xjxj划分到距離最小的簇,在全部的樣本都被划分完畢之后,重新確定簇中心,向量CiCi中的每一個分量都更新為簇ii中的眾數
步驟四:重復步驟二和三,直到總距離(各個簇中樣本與各自簇中心距離之和)不再降低,返回最后的聚類結果。
算例
假設有7個樣本,每個樣本有4個屬性,表示為矩陣X

隨機確定2個聚類中心C1=[1,5,1,3],C2=[2,5,1,2]
划分結果用Y表示

即第1、2、3、5個樣本划分到
,第4、6個樣本被划分到C2
接下來更新C1、C2
即第1、2、3、5個樣本被划分到C1,即第4、6個樣本被划分到C2
接下來更新C1和C2
C1=[1,6,0,3], C2=[2,7,0,4]
不斷重復步驟二和三了
安裝k-modes參考官方網站:https://pypi.org/project/kmodes/
安裝kmodes算法遇到的版本兼容問題
from kmodes.kmodes import Kmodes
ImportError: No module named 'kmodes'
Python中K-modes算法
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 12 15:47:15 2018
@author: Administrator
"""
import numpy as np
from kmodes.kmodes import KModes
import pandas as pd
#反恐數據集
fileAdress = 'E:\\1MyProject\\python\\classificationModel\\data\\fankongData_1.xlsx'
data = pd.read_excel(fileAdress)#讀取數據
km = KModes(n_clusters=4, init='Huang', n_init=5, verbose=1)
clusters = km.fit_predict(data)
# Print the cluster centroids
print(km.cluster_centroids_)
'''計算正確歸類率'''
score = np.sum(clusters[:int(len(clusters)/2)])+(len(clusters)/2-np.sum(clusters[int(len(clusters)/2):]))
score = score/len(clusters)
if score >= 0.5:
print('正確率:'+ str(score))
else:
print('正確率:'+ str(1-score))
