《Python數據分析與挖掘實戰》書中本章無原始數據,文中僅展現了聚類分析了各人羣彙集區特徵(商圈特徵,作營銷策劃住宅區、CBD商場、辦公樓這還用聚類分析嗎,直接肉眼也能辨別吧,這就是全部的人流特徵和規律?)也是沒什麼實際用處,並且數據源數據預處理過程纔是挖掘重點吧,拈輕怕重。html
歸一化:無量綱化,提高模型的收斂速度、精度;需考慮標準化先後模型是否同解等價git
正則化:通常是爲解決模型過擬合問題,除下降特徵維度外可選用的方法就是給模型目標函數加入正則化項(即懲罰項,如L1範數(如Lasso),L2範數(如ridge))github
離差標準化(0-1標準化/max-min標準化)算法
Z標準化(標準差標準化,Z-score標準化)apache
小數定點標準化,歸一化dom
比較經典的有k-means
和層次聚類法。
ide
層次聚類法函數
層次聚類法基本過程以下:學習
層次聚類不指定具體的簇數,而只關注簇之間的遠近,最終會造成一個樹形圖。優化
sklearn模塊中
1 from sklearn.cluster import AgglomerativeClustering as AC 2 #sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward') 3 #affinity距離算法 4 #linkage合併的策略 5 model=AC(n_clusters=3,linkage='ward') 6 #linkage : {「ward」, 「complete」, 「average」}, optional, default: 「ward」 7 # 「euclidean」, 「l1」, 「l2」, 「manhattan」, 「cosine」, or ‘precomputed’. If linkage is 「ward」, only 「euclidean」 is accepted 8 model.fit(data_normal)
linkage criteria 肯定用於合併的策略的度量:
scipy模塊中
from scipy.cluster.hierarchy import linkage,dendrogram # scipy中的層次聚類 Z=linkage(data_normal,method='ward',metric='euclidean') #method={ ‘single’,‘complete’, ‘average’, ‘weighted’, ‘centroid’, ‘median’,‘ward’ } #metric={ ‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘cityblock’, ‘correlation’, ‘cosine’, ‘dice’, ‘euclidean’, ‘hamming’, ‘jaccard’, ‘kulsinski’, ‘mahalanobis’, ‘matching’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’} P=dendrogram(Z,0) #系統樹圖 plot.show() # 畫出聚類圖
K-means聚類法
k-means一般被稱爲 Lloyd’s algorithm(勞埃德算法),其中的k就是最終彙集的簇數。k-means基本過程以下:
sklearn模塊中
1 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') 2 3 from sklearn.cluster import KMeans 4 kmeans = KMeans(n_clusters=2, random_state=0).fit(X) 5 kmeans.labels_ #kmeans[1] 6 kmeans.cluster_centers_ #kmeans[0]
scipy模塊中
from scipy.cluster.vq import vq, kmeans, whiten whitened = whiten(features) # kmeans聚類前對每一個屬性特徵標準化,除以各自標準差(列) codebook, distortion = kmeans(whitened, 2) # 標準化後數據及須要聚成類個數 # 返回兩個量分別是類中心和損失 label=vq(whitened,codebook)[0] #vq函數根據聚類中心對全部數據進行分類,[0]表示返回兩維中的類別
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Oct 1 00:20:30 2018 4 5 @author: Luove 6 """ 7 8 import os 9 import pandas as pd 10 import numpy as np 11 from scipy.cluster.hierarchy import linkage,dendrogram # scipy中的層次聚類 12 from sklearn.cluster import AgglomerativeClustering as AC # sklearn中的層次聚類 13 import matplotlib.pyplot as plt 14 import scipy.cluster.vq 15 os.getcwd() 16 os.chdir('D:/Analyze/Python Matlab/Python/BookCodes/Python數據分析與挖掘實戰/圖書配套數據、代碼/chapter14/demo/code') 17 filepath='../data/business_circle.xls' 18 19 data=pd.read_excel(filepath) 20 data.head() 21 data=data.iloc[:,1:] 22 data_normal=(data-data.min())/(data.max()-data.min()) # 離差標準化 23 24 Z=linkage(data_normal,method='ward',metric='euclidean') 25 P=dendrogram(Z,0) 26 plot.show() 27 28 model=AC(n_clusters=3,linkage='ward') 29 model.fit(data_normal) 30 data_1=pd.concat([data_normal,pd.Series(model.labels_,index=data.index)],axis=1) 31 data_1.columns=list(data_normal.columns)+['聚類類別'] 32 data_1.shape 33 # 正確顯示 中文及負號 34 plt.rcParams['font.sans-serif']=['SimHei'] 35 plt.rcParams['axes.unicode_minus']=False 36 37 style=['bo-','ro-','go-'] 38 xlabels=['工做日人均停留時間','凌晨人均停留時間','週末人均停留時間','日均人流量'] 39 40 for i in range(3): 41 plt.figure() 42 tmp=data_1[data_1['聚類類別']==i].iloc[:,:4] 43 for j in range(len(tmp)): 44 plt.plot(range(1,5),tmp.iloc[j,:],style[i]) 45 plt.xticks(range(1,5),xlabels,rotation=20) 46 plt.subplots_adjust(bottom=0.15) 47
Ref:
sklearn.cluster
.AgglomerativeClustering
《數據分析與挖掘實戰》:源代碼及數據須要可自取:https://github.com/Luove/Data