1、分類的分類
分類的分類孩等?沒(méi)錯(cuò)艾君,分類也有不同的種類,而且在數(shù)學(xué)建模瞎访、機(jī)器學(xué)習(xí)領(lǐng)域常常被混淆腻贰。
首先我們談?wù)動(dòng)斜O(jiān)督學(xué)習(xí)(Supervised learning)和無(wú)監(jiān)督學(xué)習(xí)(Unsupervised learning),是指有沒(méi)有老師扒秸,有沒(méi)有紀(jì)委嗎播演?差不多。有老師伴奥,就有正確解法写烤,就有標(biāo)準(zhǔn)答案;有紀(jì)委拾徙,就會(huì)樹(shù)學(xué)習(xí)榜樣洲炊,還有反面教材。
有監(jiān)督學(xué)習(xí)尼啡,是指樣本數(shù)據(jù)已經(jīng)給出了正確的分類暂衡,我們通過(guò)對(duì)正確分類的樣本數(shù)據(jù)進(jìn)行學(xué)習(xí),從中總結(jié)規(guī)律崖瞭,獲取知識(shí)狂巢,付諸應(yīng)用。所以书聚,監(jiān)督學(xué)習(xí)的樣本數(shù)據(jù)唧领,既提供了特征值又提供了目標(biāo)值,通過(guò)回歸(Regression)雌续、分類(Classification)學(xué)習(xí)特征與目標(biāo)之間的關(guān)系斩个。回歸是針對(duì)連續(xù)變量驯杜、連續(xù)數(shù)據(jù)嫁蛇,分類是針對(duì)離散變量和布爾變量(0-1)魂那。
無(wú)監(jiān)督學(xué)習(xí)阶女,是指樣本數(shù)據(jù)沒(méi)有提供確定的分類屬性违寞,沒(méi)有老師继蜡,沒(méi)有標(biāo)準(zhǔn)答案祷膳,樣本數(shù)據(jù)中只有樣本的特征值而沒(méi)有目標(biāo)值馅袁,只能通過(guò)樣本數(shù)據(jù)自身的特征一邊摸索一邊自我學(xué)習(xí)乘瓤,通過(guò)聚類(Clustering)方法來(lái)尋找和認(rèn)識(shí)對(duì)象的相似性膝但。
所以冲九,我們說(shuō)到分類時(shí),其實(shí)有時(shí)是指分類(Classification),有時(shí)則是指聚類(Clustering)莺奸。
有監(jiān)督學(xué)習(xí)有老師丑孩,就有正確答案。雖然有時(shí)也會(huì)有模糊地帶灭贷,但總體說(shuō)來(lái)還是有判定標(biāo)準(zhǔn)温学、有是非對(duì)錯(cuò)的,只要與標(biāo)準(zhǔn)答案不一致就會(huì)被認(rèn)為判斷錯(cuò)誤甚疟。
無(wú)監(jiān)督學(xué)習(xí)則不同仗岖,可以有不同的分類方法、不同的分類結(jié)果览妖,通常只有相對(duì)的好壞而沒(méi)有絕對(duì)的對(duì)錯(cuò)轧拄。甚至連分類結(jié)果的好壞也是相對(duì)的,要根據(jù)實(shí)際需要實(shí)際情況進(jìn)行綜合考慮讽膏,才能評(píng)價(jià)分類結(jié)果的好壞檩电。誰(shuí)能說(shuō)人應(yīng)該分幾類,怎么分更合理呢府树?
2俐末、聚類分析
2.1 聚類的分類
聚類是從數(shù)據(jù)分析的角度,對(duì)大量的奄侠、多維的卓箫、無(wú)標(biāo)記的樣本數(shù)據(jù)集,按照樣本數(shù)據(jù)自身的相似性對(duì)數(shù)據(jù)集進(jìn)行分類遭铺。大量丽柿,是指樣本的數(shù)量大;多維魂挂,是指每個(gè)樣本都有很多特征值甫题;無(wú)標(biāo)記,是指樣本數(shù)據(jù)對(duì)于每個(gè)樣本沒(méi)有指定的類別屬性涂召。
需要說(shuō)明的是坠非,有時(shí)樣本數(shù)據(jù)帶有一個(gè)或多個(gè)分類屬性,但那并不是我們所要研究的類別屬性果正,才會(huì)被稱為無(wú)監(jiān)督學(xué)習(xí)炎码。比如說(shuō),體能訓(xùn)練數(shù)據(jù)集中每個(gè)樣本都有很多特征數(shù)據(jù)秋泳,包括性別潦闲、年齡,也包括體重迫皱、腰圍歉闰、心率和血壓。性別、年齡顯然都是樣本的屬性和敬,我們也可以根據(jù)性別屬性把樣本集分為男性凹炸、女性兩類,這當(dāng)然是有監(jiān)督學(xué)習(xí)昼弟;但是啤它,如果我們是打算研究這些樣本的生理變化與鍛煉的關(guān)系,這是性別就不定是唯一的分類屬性舱痘,甚至不一定是相關(guān)的屬性了变骡,從這個(gè)意義上說(shuō),樣本數(shù)據(jù)中并沒(méi)有給出我們所要進(jìn)行分類的類別屬性衰粹。
至于聚類的分類锣光,是針對(duì)研究對(duì)象的不同來(lái)說(shuō)的。把樣本集的行(rows)作為對(duì)象铝耻,考察樣本的相似度誊爹,將樣本集分成若干類,稱為 Q型聚類分析瓢捉,屬于樣本分類频丘。把樣本集的列(columns)作為對(duì)象,考察各個(gè)特征變量之間的關(guān)聯(lián)程度泡态,按照變量的相關(guān)性聚合為若干類搂漠,稱為 R型聚類分析,屬于因子分析某弦。
2.2 Q型聚類分析(樣本聚類)
Q 型聚類分析考察樣本的相似度桐汤,將樣本集分成若干類。我們需要綜合考慮樣本各種特征變量的數(shù)值或類型靶壮,找到一種分類方法將樣本集分為若干類怔毛,使每一類的樣本之間具有較大的相似性,又與其它類的樣本具有較大的差異性拣度。通常是根據(jù)不同樣本之間的距離遠(yuǎn)近進(jìn)行劃分,距離近者分為一類抗果,距離遠(yuǎn)者分成不同類,以達(dá)到“同類相似冤馏,異類相異”。
按照相似性分類宿接,首先就要定義什么是相似赘淮。對(duì)于任意兩個(gè)樣本睦霎,很容易想到以樣本間的距離作為衡量相似性的指標(biāo)副女。在一維空間中兩點(diǎn)間的距離是絕對(duì)值:d(a,b)=abs[x(a)-x(b)];二維空間中兩點(diǎn)間的距離碑幅,我們最熟悉的是歐幾里德(Euclid)距離:d(a,b)=sqrt[(x1(a)-x1(b))**2+(x2(a)-x2(b))**2],歐式距離也可以拓展到多維空間沟涨。
除了歐式距離之外,還有其它度量樣本間距的方案裹赴,例如閔可夫斯基距離(Minkowski)、切比雪夫距離(Chebyshev)棋返、馬氏距離(Mahalanobis)等。這些距離的定義雷猪、公式和使用條件睛竣,本文就不具體介紹了。世界是豐富多彩的求摇,問(wèn)題是多種多樣的射沟,對(duì)于特殊問(wèn)題有時(shí)就要針對(duì)其特點(diǎn)采用特殊的解決方案。
進(jìn)而与境,對(duì)于兩組樣本G1验夯、G2,也需要度量類與類之間的相似性程度嚷辅。常用的方法有最短距離法(Nearest Neighbor or Single Linkage Method)簿姨、最長(zhǎng)距離法(Farthest Neighbor or Complete Linkage Method)、重心法(Centroid Method)簸搞、類均值法(Group Average Method)扁位、離差平方和法(Sum of Squares Method)。
另外趁俊,處理實(shí)際問(wèn)題時(shí)域仇,在計(jì)算距離之前要對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化、歸一化寺擂,解決不同特征之間的統(tǒng)一量綱暇务、均衡權(quán)重泼掠。
3、SKlearn 中的聚類方法
SKlearn 工具包提供了多種聚類分析算法:原型聚類方法(Prototype)垦细、密度聚類方法(Density)择镇、層次聚類方法(Hierarchical)、模型聚類(Model)括改,等等腻豌,原型聚類方法又包括 k均值算法(K-Means)、學(xué)習(xí)向量量化算法(LVQ)嘱能、高斯混合算法(Gaussian Mixture)吝梅。詳見(jiàn)下表。
為什么會(huì)有這么多方法和算法呢惹骂?因?yàn)樘厥鈫?wèn)題需要針對(duì)其特點(diǎn)采用特殊的解決方案苏携。看看下面這張圖右冻,就能理解這句話了国旷,也能理解各種算法都是針對(duì)哪種問(wèn)題的茫死。SKlearn 還提供了十多個(gè)聚類評(píng)價(jià)指標(biāo)峦萎,本文就不再展開(kāi)介紹了。
4被环、K-均值(K-Means)聚類算法
K-均值聚類算法筛欢,是最基礎(chǔ)的唇聘、應(yīng)用最廣泛的聚類算法,也是最快速的聚類算法之一剥险。
4.1 原理和過(guò)程
K-均值聚類算法以最小化誤差函數(shù)為目標(biāo)將樣本數(shù)據(jù)集分為 K類表制。
K-均值聚類算法的計(jì)算過(guò)程如下:
- 設(shè)定 K 個(gè)類別的中心的初值;
- 計(jì)算每個(gè)樣本到 K個(gè)中心的距離娜遵,按最近距離進(jìn)行分類夭拌;
- 以每個(gè)類別中樣本的均值鸽扁,更新該類別的中心桶现;
- 重復(fù)迭代以上步驟鼎姊,直到達(dá)到終止條件(迭代次數(shù)相寇、最小平方誤差、簇中心點(diǎn)變化率)婆赠。
K-均值聚類算法的優(yōu)點(diǎn)是原理簡(jiǎn)單佳励、算法簡(jiǎn)單,速度快妙黍,聚類效果極好拭嫁,對(duì)大數(shù)據(jù)集具有很好的伸縮性抓于。這些優(yōu)點(diǎn)特別有利于初學(xué)者毡咏、常見(jiàn)問(wèn)題。其缺點(diǎn)是需要給定 K值堵泽,對(duì)一些特殊情況(如非凸簇、特殊值睬愤、簇的大小差別大)的性能不太好纹安。怎么看這些缺點(diǎn)厢岂?需要給定 K值的問(wèn)題是有解決方法的;至于特殊情況结借,已經(jīng)跟我們沒(méi)什么關(guān)系了船老。
4.2 SKlearn 中 K-均值算法的使用
sklearn.cluster.KMeans 類是 K-均值算法的具體實(shí)現(xiàn)圃酵,官網(wǎng)介紹詳見(jiàn):https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans
class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
KMeans 的主要參數(shù):
- n_clusters: int,default=8 K值郭赐,給定的分類數(shù)量堪置,默認(rèn)值 8。
- init:{‘k-means++’, ‘random’} 初始中心的選擇方式岭洲,默認(rèn)'K-means++'是優(yōu)化值盾剩,也可以隨機(jī)選擇或自行指定替蔬。
- n_init:int, default=10 以不同的中心初值多次運(yùn)行承桥,以降低初值對(duì)算法的影響。默認(rèn)值 10蜀撑。
- max_iter:int, default=300 最大迭代次數(shù)。默認(rèn)值 300矿卑。
- algorithm:{“auto”, “full”, “elkan”}, default=”auto” 算法選擇沃饶,"full"是經(jīng)典的 EM算法糊肤,"elkan"能快速處理定義良好的簇,默認(rèn)值 “auto"目前采用"elkan"椎咧。
KMeans 的主要屬性:
- clustercenters:每個(gè)聚類中心的坐標(biāo)
- labels_: 每個(gè)樣本的分類結(jié)果
- inertia_: 每個(gè)點(diǎn)到所屬聚類中心的距離之和。
4.3 sklearn.cluster.KMeans 用法實(shí)例
from sklearn.cluster import KMeans # 導(dǎo)入 sklearn.cluster.KMeans 類
import numpy as np
X = np.array([[1,2], [1,4], [1,0], [10,2], [10,4], [10,0]])
kmCluster = KMeans(n_clusters=2).fit(X) # 建立模型并進(jìn)行聚類拗踢,設(shè)定 K=2
print(kmCluster.cluster_centers_) # 返回每個(gè)聚類中心的坐標(biāo)
#[[10., 2.], [ 1., 2.]] # print 顯示聚類中心坐標(biāo)
print(kmCluster.labels_) # 返回樣本集的分類結(jié)果
#[1, 1, 1, 0, 0, 0] # print 顯示分類結(jié)果
print(kmCluster.predict([[0, 0], [12, 3]])) # 根據(jù)模型聚類結(jié)果進(jìn)行預(yù)測(cè)判斷
#[1, 0] # print顯示判斷結(jié)果:樣本屬于哪個(gè)類別
例程很簡(jiǎn)單巢墅,又給了詳細(xì)注釋券膀,就不再解讀了。核心程序就是下面這句:
kMeanModel = KMeans(n_clusters=2).fit(X)
4.4 針對(duì)大樣本集的改進(jìn)算法:Mini Batch K-Means
對(duì)于樣本集巨大的問(wèn)題蓄髓,例如樣本量大于 10萬(wàn)舒帮、特征變量大于100玩郊,K-Means算法耗費(fèi)的速度和內(nèi)存很大。SKlearn 提供了針對(duì)大樣本集的改進(jìn)算法 Mini Batch K-Means预茄,并不使用全部樣本數(shù)據(jù)耻陕,而是每次抽樣選取小樣本集進(jìn)行 K-Means聚類,進(jìn)行循環(huán)迭代淮蜈。Mini Batch K-Means 雖然性能略有降低梧田,但極大的提高了運(yùn)行速度和內(nèi)存占用○睦妫
class sklearn.cluster.MiniBatchKMeans 類是算法的具體實(shí)現(xiàn)存皂,官網(wǎng)介紹詳見(jiàn):https://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html#sklearn.cluster.MiniBatchKMeans
class sklearn.cluster.MiniBatchKMeans(n_clusters=8, *, init='k-means++', max_iter=100, batch_size=100, verbose=0, compute_labels=True, random_state=None, tol=0.0, max_no_improvement=10, init_size=None, n_init=3, reassignment_ratio=0.01)
MiniBatchKMeans 與 KMeans不同的主要參數(shù)是:
- batch_size: int, default=100 抽樣集的大小旦袋。默認(rèn)值 100它改。
Mini Batch K-Means 的用法實(shí)例如下:
from sklearn.cluster import MiniBatchKMeans # 導(dǎo)入 .MiniBatchKMeans 類
import numpy as np
X = np.array([[1,2], [1,4], [1,0], [4,2], [4,0], [4,4],
[4,5], [0,1], [2,2],[3,2], [5,5], [1,-1]])
# fit on the whole data
mbkmCluster = MiniBatchKMeans(n_clusters=2,batch_size=6,max_iter=10).fit(X)
print(mbkmCluster.cluster_centers_) # 返回每個(gè)聚類中心的坐標(biāo)
# [[3.96,2.41], [1.12,1.39]] # print 顯示內(nèi)容
print(mbkmCluster.labels_) # 返回樣本集的分類結(jié)果
#[1 1 1 0 0 0 0 1 1 0 0 1] # print 顯示內(nèi)容
print(mbkmCluster.predict([[0,0], [4,5]])) # 根據(jù)模型聚類結(jié)果進(jìn)行預(yù)測(cè)判斷
#[1, 0] # 顯示判斷結(jié)果:樣本屬于哪個(gè)類別
5央拖、K-均值算法例程
5.1 問(wèn)題描述
- 聚類分析案例—我國(guó)各地區(qū)普通高等教育發(fā)展?fàn)顩r分析鲜戒,本問(wèn)題及數(shù)據(jù)來(lái)自:司守奎、孫兆亮伦腐,數(shù)學(xué)建模算法與應(yīng)用(第2版)蔗牡,國(guó)防工業(yè)出版社嗅剖。
問(wèn)題的原始數(shù)據(jù)來(lái)自《中國(guó)統(tǒng)計(jì)年鑒,1995》和《中國(guó)教育統(tǒng)計(jì)年鑒黔攒,1995》督惰,給出了各地區(qū)10 項(xiàng)教育發(fā)展數(shù)據(jù)。我國(guó)各地區(qū)普通高等教育的發(fā)展?fàn)顩r存在較大的差異访娶,請(qǐng)根據(jù)數(shù)據(jù)對(duì)我國(guó)各地區(qū)普通高等教育的發(fā)展?fàn)顩r進(jìn)行聚類分析觉阅。
5.2 Python 程序
# Kmeans_sklearn_v1d.py
# K-Means cluster by scikit-learn for problem "education2015"
# v1.0d: K-Means 聚類算法(SKlearn)求解:各地區(qū)高等教育發(fā)展?fàn)顩r-2015 問(wèn)題
# 日期:2021-05-10
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans, MiniBatchKMeans
# 主程序
def main():
# 讀取數(shù)據(jù)文件
readPath = "../data/education2015.xlsx" # 數(shù)據(jù)文件的地址和文件名
dfFile = pd.read_excel(readPath, header=0) # 首行為標(biāo)題行
dfFile = dfFile.dropna() # 刪除含有缺失值的數(shù)據(jù)
# print(dfFile.dtypes) # 查看 df 各列的數(shù)據(jù)類型
# print(dfFile.shape) # 查看 df 的行數(shù)和列數(shù)
print(dfFile.head())
# 數(shù)據(jù)準(zhǔn)備
z_scaler = lambda x:(x-np.mean(x))/np.std(x) # 定義數(shù)據(jù)標(biāo)準(zhǔn)化函數(shù)
dfScaler = dfFile[['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']].apply(z_scaler) # 數(shù)據(jù)歸一化
dfData = pd.concat([dfFile[['地區(qū)']], dfScaler], axis=1) # 列級(jí)別合并
df = dfData.loc[:,['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']] # 基于全部 10個(gè)特征聚類分析
# df = dfData.loc[:,['x1','x2','x7','x8','x9','x10']] # 降維后選取 6個(gè)特征聚類分析
X = np.array(df) # 準(zhǔn)備 sklearn.cluster.KMeans 模型數(shù)據(jù)
print("Shape of cluster data:", X.shape)
# KMeans 聚類分析(sklearn.cluster.KMeans)
nCluster = 4
kmCluster = KMeans(n_clusters=nCluster).fit(X) # 建立模型并進(jìn)行聚類劫哼,設(shè)定 K=2
print("Cluster centers:\n", kmCluster.cluster_centers_) # 返回每個(gè)聚類中心的坐標(biāo)
print("Cluster results:\n", kmCluster.labels_) # 返回樣本集的分類結(jié)果
# 整理聚類結(jié)果
listName = dfData['地區(qū)'].tolist() # 將 dfData 的首列 '地區(qū)' 轉(zhuǎn)換為 listName
dictCluster = dict(zip(listName,kmCluster.labels_)) # 將 listName 與聚類結(jié)果關(guān)聯(lián)权烧,組成字典
listCluster = [[] for k in range(nCluster)]
for v in range(0, len(dictCluster)):
k = list(dictCluster.values())[v] # 第v個(gè)城市的分類是 k
listCluster[k].append(list(dictCluster.keys())[v]) # 將第v個(gè)城市添加到 第k類
print("\n聚類分析結(jié)果(分為{}類):".format(nCluster)) # 返回樣本集的分類結(jié)果
for k in range(nCluster):
print("第 {} 類:{}".format(k, listCluster[k])) # 顯示第 k 類的結(jié)果
return
if __name__ == '__main__':
main()
5.3 程序運(yùn)行結(jié)果
地區(qū) x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
0 北京 5.96 310 461 1557 931 319 44.36 2615 2.20 13631
1 上海 3.39 234 308 1035 498 161 35.02 3052 0.90 12665
2 天津 2.35 157 229 713 295 109 38.40 3031 0.86 9385
3 陜西 1.35 81 111 364 150 58 30.45 2699 1.22 7881
4 遼寧 1.50 88 128 421 144 58 34.30 2808 0.54 7733
Shape of cluster data: (30, 10)
Cluster centers:
[[ 1.52987871 2.10479182 1.97836141 1.92037518 1.54974999 1.50344182
1.13526879 1.13595799 0.83939748 1.38149832]
[-0.32558635 -0.28230636 -0.28071191 -0.27988803 -0.28228409 -0.28494074
0.01965142 0.09458383 -0.26439737 -0.31101153]
[ 4.44318512 3.9725159 4.16079449 4.20994153 4.61768098 4.65296699
2.45321197 0.4021476 4.22779099 2.44672575]
[ 0.31835808 -0.56222029 -0.54985976 -0.52674552 -0.33003935 -0.26816609
-2.60751756 -2.51932966 0.35167418 1.28278289]]
Cluster results:
[2 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 3]
聚類分析結(jié)果(分為4類):
第 0 類:['上海', '天津']
第 1 類:['陜西', '遼寧', '吉林', '黑龍江', '湖北', '江蘇', '廣東', '四川', '山東', '甘肅', '湖南', '浙江', '新疆', '福建', '山西', '河北', '安徽', '云南', '江西', '海南', '內(nèi)蒙古', '河南', '廣西', '寧夏', '貴州']
第 2 類:['北京']
第 3 類:['西藏', '青海']
版權(quán)說(shuō)明:
本文中案例問(wèn)題來(lái)自:司守奎、孫兆亮乱顾,數(shù)學(xué)建模算法與應(yīng)用(第2版),國(guó)防工業(yè)出版社。
本文內(nèi)容及例程為作者原創(chuàng)温技,并非轉(zhuǎn)載書籍或網(wǎng)絡(luò)內(nèi)容扭粱。
YouCans 原創(chuàng)作品
Copyright 2021 YouCans, XUPT
Crated:2021-05-09