Python:層次聚類分析——基於基站定位數據商圈分析


《Python數據分析與挖掘實戰》書中本章無原始數據,文中僅展示了聚類分析了各人群聚集區特征(商圈特征,做營銷策划住宅區、CBD商場、辦公樓這還用聚類分析嗎,直接肉眼也能辨別吧這就是所有的人流特征和規律?)也是沒什么實際用處,而且數據源數據預處理過程才是挖掘重點吧,避重就輕。

記錄學習一下兩點

  • 數據標准化方式(歸一化、標准化、正規化)
  • 聚類分析算法

歸一化:無量綱化,提升模型的收斂速度、精度;需考慮標准化前后模型是否同解等價

正則化:一般是為解決模型過擬合問題,除降低特征維度外可選用的方法就是給模型目標函數加入正則化項(即懲罰項,如L1范數(如Lasso),L2范數(如ridge))

 


數據標准化 

離差標准化(0-1標准化/max-min標准化)

 

Z標准化(標准差標准化,Z-score標准化)

 

 小數定點標准化,歸一化

 

 聚類分析算法

比較經典的有k-means層次聚類法。

 

層次聚類法

層次聚類法基本過程如下:

  • 每一個樣本點視為一個簇;
  • 計算各個簇之間的距離,最近的兩個簇聚合成一個新簇;
  • 重復以上過程直至最后只有一簇。

層次聚類不指定具體的簇數,而只關注簇之間的遠近,最終會形成一個樹形圖。

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 確定用於合並的策略的度量:

  • Ward 最小化所有聚類內的平方差總和。這是一種 variance-minimizing (方差最小化)的優化方向, 這是與k-means 的目標函數相似的優化方法,但是用 agglomerative hierarchical(聚類分層)的方法處理。
  • Maximum 或 complete linkage 最小化聚類對兩個樣本之間的最大距離。
  • Average linkage 最小化聚類兩個聚類中樣本距離的平均值。

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基本過程如下:

  • 首先任取(你沒看錯,就是任取)k個樣本點作為k個簇的初始中心;
  • 對每一個樣本點,計算它們與k個中心的距離,把它歸入距離最小的中心所在的簇;
  • 等到所有的樣本點歸類完畢,重新計算k個簇的中心;
  • 重復以上過程直至樣本點歸入的簇不再變動。

 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:

 

三種常用數據標准化方法

數據標准化/歸一化normalization

聚類分析:k-means和層次聚類

關於聚類及相似度、距離的知識點及kmeans聚類介紹 

使用scipy進行層次聚類和k-means聚類

K均值聚類和矢量量化(scipy.cluster.vq

sklearn.cluster.KMeans

sklearn.cluster.AgglomerativeClustering

 

《數據分析與挖掘實戰》:源代碼及數據需要可自取:https://github.com/Luove/Data

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM