資料來自《python資料分析與挖掘實戰》書第14章, 該章意在使用運營商通過手機基站蒐集的使用者歷史定位資料,採用資料探勘技術對基站進行分群並對不同的商圈分群進行特徵分析,以選取合適的商圈進行**.
層次聚類試圖在不同層次對資料集進行劃分, 從而形成樹形的聚類結構. 資料集的劃分可採用「自底向上」的聚合策略, 也可採用「自頂向下」的分拆策略.
其中, 自底向上的策略先將資料集中的每個樣本看作乙個初始聚類簇, 然後在演算法執行的每一步中找出距離最近的兩個聚類簇進行合併, 該過程不斷重複, 直至達到預設的聚類簇個數; 自頂向下的策略, 先將所有物件置於同乙個簇中, 然後逐漸細分為越來越小的簇, 直到每個物件自成一簇, 或者達到了某個終止條件. 常用的為自底向上策略.
(** )
又做0~1標準化, 它是對原始資料進行線性變換, 使結果落到 [0,1] 區間.
公式:
原始資料為處理過後的基站資料, 包含基站編號與其對應的工作日上班時間人均停留時間, 凌晨人均停留時間, 週末人均停留時間, 週末人均停留時間, 日人均流量, 資料各列均無缺失值.
由於各屬性之間的差異較大, 為消除數量級資料帶來的影響, 在進行聚類前, 對資料進行了離差標準化處理, 並把處理後的資料進行了儲存.
相關**:
# -*- coding:utf-8 -*-
import pandas as pd
from sklearn.preprocessing import minmaxscaler
inputfile = './data/business_circle.xls'
outputfile = './data/standardized.xls'
# 載入資料
data = pd.read_excel(inputfile, index_col='基站編號')
# print(data.head(5))
# print(data.info())
# 離差標準化
mm = minmaxscaler()
data = pd.dataframe(mm.fit_transform(data.values), index=data.index, columns=data.columns)
data = data.reset_index()
print(data.head(10))
data.to_excel(outputfile, index=false)
使用python畫出資料的譜系聚類圖如下, 從圖中確定聚類類別數 k = 3 較為合適.
相關**:
# -*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
filepath = './data/standardized.xls'
data = pd.read_excel(filepath, index_col='基站編號')
# scipy 層次聚類函式
z = linkage(data, method='ward', metric='euclidean') # 譜系聚類圖
p = dendrogram(z, 0) # 畫譜系聚類圖
plt.show()
python中sklearn工具包提供 agglomerativeclustering() 函式進行層次聚類. 讀取標準化後的資料並建立模型, 傳入引數 n_clusters = 3 指定需要分類的類別數為3.
在聚類後把聚類類別標籤與相應的基站資料合併, 對每一聚類的資料進行繪圖表示, 如下:
從上圖可知, 商圈類別1日均**量大, 工作日、凌晨及週末人均停留時間較短, 該類別所覆蓋的區域應該為商業區; 商圈類別2凌晨和週末人均停留時間明顯較長, 可判定為住宅區; 而根據商圈類別3圖中所反映現象可知其基站覆蓋的區域為上班區域.
相關**:
# -*- coding:utf-8 -*-
import pandas as pd
from sklearn.cluster import agglomerativeclustering # sklearn中的層次聚類函式
import matplotlib.pyplot as plt
plt.rcparams['font.sans-serif'] = ['simhei']
plt.rcparams['axes.unicode_minus'] = false
filepath = './data/standardized.xls'
k = 3 # 聚類數
data = pd.read_excel(filepath, index_col='基站編號')
model = agglomerativeclustering(n_clusters=k, linkage='ward')
model.fit(data)
# 詳細輸出原始資料及其類別
r = pd.concat([data, pd.series(model.labels_, index=data.index, name='聚類類別')], axis=1)
print(r.head(10))
# 畫圖
style = ['ro-', 'bo-', 'go-']
for i in range(k):
plt.figure()
tmp = r[r['聚類類別'] == i].iloc[:, :4]
for j in range(len(tmp)):
plt.plot(range(1, 5), tmp.iloc[j], style[i])
plt.title('商圈類別' + str(i+1), fontsize=20)
plt.xticks(range(1, 5), data.columns, rotation=20)
plt.subplots_adjust(bottom = .18) # 調整底部, 讓標籤顯示完全
plt.show()
詳細資料及**: github 聚類之層次聚類 基於劃分的聚類(
目錄 一層次聚類 層次聚類的原理及分類 層次聚類的流程 層次聚類的優缺點 二劃分聚類法k means kmeans演算法的原理 k均值的優缺點及分類 k means與dbscan的區別 k means注意問題 三基於密度的聚類 dbscan的概念 簇的生成原理及過程 根據資料點的密度分為三類點 db...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...
層次聚類(1)
層次聚類演算法不同於其它演算法,主要體現在它不是只生成乙個分類結果,而是產生一系列原模式集合的分類結果,每個分類結果滿足一些限制。x 是n個l維特徵向量組成的集合,我們就是要對這個集合中的特徵向量分類。clustering r 是某個聚類結果,就叫他類簇吧,我想這樣叫,也許別人已經定義了類簇,但是我...