???♂? 個(gè)人主頁(yè):@艾派森的個(gè)人主頁(yè)
???作者簡(jiǎn)介:Python學(xué)習(xí)者
?? 希望大家多多支持,我們一起進(jìn)步!??
如果文章對(duì)你有幫助的話,
歡迎評(píng)論 ??點(diǎn)贊???? 收藏 ??加關(guān)注+
目錄
1.KMeans聚類算法
2.DBSCAN密度聚類算法
3.層次聚類
4.實(shí)戰(zhàn)案例
4.1數(shù)據(jù)集介紹
4.2加載數(shù)據(jù)
4.3數(shù)據(jù)預(yù)處理?
4.4Kmeans聚類
4.5DBSCAN密度聚類
4.6層次聚類
4.7總結(jié)
文末福利
源代碼
?
1.KMeans聚類算法
????????kmeans聚類可以說是聚類算法中最為常見的,它是基于劃分方法聚類的,原理是先初始化k個(gè)簇類中心,基于計(jì)算樣本與中心點(diǎn)的距離歸納各簇類下的所屬樣本,迭代實(shí)現(xiàn)樣本與其歸屬的簇類中心的距離為最小的目標(biāo)(如下目標(biāo)函數(shù))。
?
其優(yōu)化算法步驟為:
1.隨機(jī)選擇 k 個(gè)樣本作為初始簇類中心(k為超參,代表簇類的個(gè)數(shù)??梢詰{先驗(yàn)知識(shí)、驗(yàn)證法確定取值);
2.針對(duì)數(shù)據(jù)集中每個(gè)樣本 計(jì)算它到 k 個(gè)簇類中心的距離,并將其歸屬到距離最小的簇類中心所對(duì)應(yīng)的類中;
3.針對(duì)每個(gè)簇類,重新計(jì)算它的簇類中心位置;
4.重復(fù)迭代上面 2 、3 兩步操作,直到達(dá)到某個(gè)中止條件(如迭代次數(shù),簇類中心位置不變等)。
關(guān)于具體的Kmeans介紹,可參考我之前博文
機(jī)器學(xué)習(xí)之KMeans聚類算法原理(附案例實(shí)戰(zhàn))
2.DBSCAN密度聚類算法
????????BSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基于密度的聚類方法)是一種基于密度的空間聚類算法。它可以替代KMeans和層次聚類等流行的聚類算法。DBSCAN算法將“簇”定義為密度相連的點(diǎn)的最大集合。DBSCAN 算法中有兩個(gè)重要參數(shù):Eps 和 MmPtS。Eps 是定義密度時(shí)的鄰域半徑,MmPts 為定義核心點(diǎn)時(shí)的閾值。
DBSCAN聚類算法原理:
1、DBSCAN通過檢查數(shù)據(jù)集中每個(gè)點(diǎn)的r鄰域來(lái)搜索簇,如果點(diǎn)p的r鄰域包含多于MinPts個(gè)點(diǎn),則創(chuàng)建一個(gè)以p為核心對(duì)象的簇;
2、然后, DBSCAN迭代的聚集從這些核心對(duì)象直接密度可達(dá)的對(duì)象,這個(gè)過程可能涉及一些密度可達(dá)簇的合并;
3、當(dāng)沒有新的帶你添加到任何簇時(shí),迭代過程結(jié)束。
DBSCAN算法的描述如下:
輸入:數(shù)據(jù)集,鄰域半徑 Eps,鄰域中數(shù)據(jù)對(duì)象數(shù)目閾值 MinPts;
輸出:密度聯(lián)通簇。
處理流程如下:
1)從數(shù)據(jù)集中任意選取一個(gè)數(shù)據(jù)對(duì)象點(diǎn) p;
2)如果對(duì)于參數(shù) Eps 和 MinPts,所選取的數(shù)據(jù)對(duì)象點(diǎn) p 為核心點(diǎn),則找出所有從 p 密度可達(dá)的數(shù)據(jù)對(duì)象點(diǎn),形成一個(gè)簇;
3)如果選取的數(shù)據(jù)對(duì)象點(diǎn) p 是邊緣點(diǎn),選取另一個(gè)數(shù)據(jù)對(duì)象點(diǎn);
4)重復(fù)(2)、(3)步,直到所有點(diǎn)被處理。
注意:DBSCAN 算法的計(jì)算復(fù)雜的度為 O(n),n 為數(shù)據(jù)對(duì)象的數(shù)目。這種算法對(duì)于輸入?yún)?shù) Eps 和 MinPts 是敏感的。
3.層次聚類
????????層次聚類(Hierarchical Clustering)是通過計(jì)算不同類別數(shù)據(jù)點(diǎn)間的相似度來(lái)創(chuàng)建一棵有層次的嵌套聚類樹,不同類別的原始數(shù)據(jù)點(diǎn)是樹的最低層,樹的頂層是一個(gè)聚類的根節(jié)點(diǎn)。層次聚類算法分為兩類:自上而下和自下而上。自下而上的算法在一開始就將每個(gè)數(shù)據(jù)點(diǎn)視為一個(gè)單一的聚類,然后依次合并類,直到所有類合并成一個(gè)包含所有數(shù)據(jù)點(diǎn)的單一聚類。
算法過程:
1.首先將每個(gè)數(shù)據(jù)點(diǎn)作為一個(gè)單個(gè)類,然后根據(jù)選擇的度量方法計(jì)算兩聚類之間的距離。
2.對(duì)所有數(shù)據(jù)點(diǎn)中最為相似的兩個(gè)數(shù)據(jù)點(diǎn)進(jìn)行組合,形成具有最小平均連接的組。
3.重復(fù)迭代步驟2直到只有一個(gè)包含所有數(shù)據(jù)點(diǎn)的聚類為止。
優(yōu)點(diǎn):
- 無(wú)需指定聚類的數(shù)量
- 對(duì)距離度量的選擇不敏感
- 當(dāng)?shù)讓訑?shù)據(jù)具有層次結(jié)構(gòu)時(shí),可以恢復(fù)層次結(jié)構(gòu)
缺點(diǎn):時(shí)間復(fù)雜度為O(n3)
確定聚類數(shù)量:對(duì)于層次聚類,可以根據(jù)聚類過程中,每次合并的兩個(gè)cluster的距離來(lái)作判斷,取距離突變處的值為distance_threshold。若數(shù)據(jù)應(yīng)當(dāng)被分為K個(gè)簇,K個(gè)簇之間會(huì)有明顯的間距。若合并的兩個(gè)小簇同屬于一個(gè)目標(biāo)簇,那么它們的距離就不會(huì)太大。但當(dāng)合并出來(lái)K個(gè)目標(biāo)簇后,再進(jìn)行合并,則是對(duì)K個(gè)簇間進(jìn)行合并了,一般來(lái)說,此合并產(chǎn)生的距離就會(huì)有非常明顯的突變。
4.實(shí)戰(zhàn)案例
4.1數(shù)據(jù)集介紹
????????本數(shù)據(jù)集是由249名度假者在2014年10月之前發(fā)布的目的地評(píng)論組成的。在整個(gè)南印度的目的地中,分為6類的評(píng)論被考慮,每個(gè)評(píng)論(旅行者)在每一類的評(píng)論計(jì)數(shù)被記錄統(tǒng)計(jì)。數(shù)據(jù)集共有249條,共7列。具體字段信息如下表:
屬性 |
數(shù)據(jù)類型 |
屬性描述 |
User?Id |
Object字符類型 |
用戶唯一的ID |
Sports |
Int整數(shù)類型 |
對(duì)體育場(chǎng)館、體育綜合體等的評(píng)論數(shù)量 |
Religious |
Int整數(shù)類型 |
對(duì)宗教機(jī)構(gòu)的評(píng)論數(shù)量 |
Nature |
Int整數(shù)類型 |
關(guān)于海灘、湖泊、河流等的評(píng)論數(shù)量 |
Theatre |
Int整數(shù)類型 |
關(guān)于劇院、展覽等的評(píng)論數(shù)量 |
Shopping |
Int整數(shù)類型 |
對(duì)商場(chǎng)、購(gòu)物場(chǎng)所等的評(píng)論數(shù)量 |
Picnic |
Int整數(shù)類型 |
對(duì)公園、野餐地點(diǎn)等的評(píng)論數(shù)量 |
4.2加載數(shù)據(jù)
?
4.3數(shù)據(jù)預(yù)處理?
4.4Kmeans聚類
首先使用肘部法則確定K
通過圖形確定K值為3,使用Kmeans聚類?
?
4.5DBSCAN密度聚類
4.6層次聚類
4.7總結(jié)
????????從前面結(jié)果中得到的三類聚類算法模型結(jié)果中,我們發(fā)現(xiàn)KMeans模型和層次聚類模型結(jié)果相似,而DBSCAN模型結(jié)果與KMeans模型和層次聚類模型結(jié)果差距較大。通過查閱相關(guān)資料,我們發(fā)現(xiàn)可能是在構(gòu)建BDSCAN模型的時(shí)候,參數(shù)的選擇很重要,參數(shù)變化一點(diǎn)點(diǎn)都會(huì)對(duì)最后的模型造成很大的影響,且由于本次數(shù)據(jù)集樣本較少,對(duì)三個(gè)模型的結(jié)果都有一定的模型,樣本數(shù)據(jù)過少會(huì)導(dǎo)致模型的泛化能力較差,不能很好的在實(shí)際應(yīng)用中進(jìn)行使用。
文末福利
參與福利?
- 抽獎(jiǎng)方式:評(píng)論區(qū)隨機(jī)抽取2位小伙伴免費(fèi)送出!
- 參與方式:關(guān)注博主、點(diǎn)贊、收藏、評(píng)論區(qū)評(píng)論“人生苦短,拒絕內(nèi)卷!”(切記要點(diǎn)贊+收藏,否則抽獎(jiǎng)無(wú)效,每個(gè)人最多評(píng)論三次!)
- 活動(dòng)截止時(shí)間:2023-06-05?20:00:00
- ?京東自營(yíng)店購(gòu)買鏈接:https://item.jd.com/13737387.html#crumb-wrap
名單公布時(shí)間:2023-06-05?21:00:00???
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-470626.html
源代碼
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv('buddymove_holidayiq.csv')
data.head()
# 數(shù)據(jù)預(yù)處理
data.dropna(inplace=True) # 刪除缺失值
data.drop_duplicates(inplace=True) # 刪除重復(fù)值
# 數(shù)據(jù)標(biāo)準(zhǔn)化
from sklearn.preprocessing import StandardScaler
df = data.drop('User Id',axis=1)
scaler = StandardScaler()
X = scaler.fit_transform(df)
data_scaler = pd.DataFrame(X,columns=df.columns)
data_scaler.head()
KMeans聚類
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解決中文顯示|
plt.rcParams['axes.unicode_minus'] = False #解決符號(hào)無(wú)法顯示
from sklearn.cluster import KMeans
# 肘部法則
loss = []
for i in range(2,6):
model = KMeans(n_clusters=i).fit(X)
loss.append(model.inertia_)
plt.plot(range(2,6),loss)
plt.xlabel('k')
plt.ylabel('loss')
plt.show()
from sklearn.cluster import KMeans
k = 3 # 聚成3類
kmodel = KMeans(k) # 創(chuàng)建聚類模型
kmodel.fit(data_scaler) # 訓(xùn)練模型
print(pd.Series(kmodel.labels_).value_counts())
pd.Series(kmodel.labels_).value_counts().plot(kind='bar')
plt.title('KMeans聚類的結(jié)果')
plt.xlabel('聚類標(biāo)簽')
plt.ylabel('聚類數(shù)量')
plt.show()
DBSCAN密度聚類
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=1.1)
# 模型擬合
dbscan.fit(X)
data2 = data_scaler.copy()
data2['dbscan_label'] = dbscan.labels_
print(pd.Series(dbscan.labels_).value_counts())
data2['dbscan_label'].value_counts().plot(kind='bar')
plt.title('DBSCAN密度聚類的結(jié)果')
plt.xlabel('聚類標(biāo)簽')
plt.ylabel('聚類數(shù)量')
plt.show()
層次聚類
from sklearn.cluster import AgglomerativeClustering
# n_clusters為集群數(shù),affinity指定用于計(jì)算距離的度量,linkage參數(shù)中的ward為離差平方和法
Agg_hc = AgglomerativeClustering(n_clusters = 3, affinity = 'euclidean', linkage = 'ward')
y_hc = Agg_hc.fit_predict(data_scaler) # 訓(xùn)練數(shù)據(jù)
print(pd.Series(y_hc).value_counts())
pd.Series(y_hc).value_counts().plot(kind='bar')
plt.title('層次聚類的結(jié)果')
plt.xlabel('聚類標(biāo)簽')
plt.ylabel('聚類數(shù)量')
plt.show()
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470626.html
到了這里,關(guān)于KMeans+DBSCAN密度聚類+層次聚類的使用(文末送書)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!