机器学习----聚类算法
1、聚類算法介紹
1.1 聚類算法在現實中的應用
-
用戶畫像,廣告推薦,搜索引擎的流量推薦,惡意流量識別
-
基于位置信息的商業推送,新聞聚類,篩選排序
-
圖像分割,降維,識別;離群點檢測;信用卡異常消費;發掘相同功能的基因片段
1.2 聚類算法的概念
聚類算法:
一種典型的無監督學習算法,主要用于將相似的樣本自動歸到一個類別中。
在聚類算法中根據樣本之間的相似性,將樣本劃分到不同的類別中,對于不同的相似度計算方法,會得到不同的聚類結果,常用的相似度計算方法有歐式距離法。
1.3 聚類算法和分類算法(knn)最大區別
聚類算法是無監督的學習算法,而分類算法屬于監督的學習算法。
2、Sklearn實現KMeans聚類
2.1 api介紹
sklearn.cluster.KMeans(n_clusters=8)
參數: n_clusters:開始的聚類中心數量 整型,n_clusters=8,生成的聚類數,即產生的質心(centroids)數。
方法: estimator.fit(x) estimator.predict(x) estimator.fit_predict(x)計算聚類中心并預測每個樣本屬于哪個類別,相當于先調用fit(x),然后再調用predict(x)
2.2 案例
1、創建數據集
import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 創建數據集 # X為樣本特征,Y為樣本簇類別, 共1000個樣本,每個樣本2個特征,共4個簇, # 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分別為[0.4, 0.2, 0.2, 0.2] X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2],random_state=9)# 數據集可視化 plt.scatter(X[:, 0], X[:, 1], marker='o')?2、使用k-means進行聚類,并使用silhouette_score(輪廓系數)評估
model = KMeans(n_clusters=2, random_state=9) y_pred = model.fit_predict(X) # 分別嘗試n_cluses=2\3\4,然后查看聚類效果 plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show()# 用輪廓系數評估的聚類分數 silhouette_score(X, y_pred) # 0.6435178953651656?3、聚類原理詳解
3.1 距離的度量(相似性度量)
Euclidean Distance(歐式距離) 定義:
?
其他距離衡量:余弦值(cos), 相關度 (correlation), 曼哈頓距離 (Manhattan distance)
曼哈頓距離:紐約曼哈頓的街區比較平整,我們從P1起點到P2起點,首先橫向跨越三個街區,在縱向跨越2個街區就達到P2點了。
3.2 Kmean算法原理
3.2.1 K-means算法詳解
K-幾個聚類中心,Mean-均值,每次迭代的時候使用均值方式迭代
-
K : 初始中心點個數(計劃聚類數)
-
means:求中心點到其他數據點距離的平均值
Clustering 中的經典算法,數據挖掘十大經典算法之一
算法接受參數 k ;然后將事先輸入的n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。
算法思想:
以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果
?算法終止條件:迭代次數/簇中心變化率/最小平方誤差和SSE
算法核心步驟梳理:
計算距離---歸類-----計算均值---距離----歸類----均值----距離--.........
(1)求解第i個樣本xi到達第j個聚類中心的距離,選擇j最小的值賦值給第i個樣本的標記值。
(2)對于屬于第j個樣本的所有的xj求均值,作為第j個樣本的新的聚類中心,聚類中心改變了,重新計算標記信息,標記變了重新計算距離。
算法流程鞏固:
輸入:k, data[n];
(1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
(2) 對于data[0]….data[n], 分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;
(3) 對于所有標記為i點,重新計算c[i]={所有標記為i的data[j]之和}/標記為i的個數;
(4) 重復(2)(3),直到所有c[i]值的變化小于給定閾值。
3.2.2?K-Mean性能評價指標
1、SSE誤差平方和
SSE表示數據樣本與它所屬的簇中心之間的距離(差異度)平方之和。直觀的來說,SSE越小,表示數據點越接近它們的中心,聚類效果越好。因為對誤差取了平方,更加重視那些遠離中心的點。
2、肘部法
?
(1)對于n個點的數據集,迭代計算k from 1 to n,每次聚類完成后計算每個點到其所屬的簇中心的距離的平方和;
(2)平方和是會逐漸變小的,直到k==n時平方和為0,因為每個點都是它所在的簇中心本身。
(3)在這個平方和變化過程中,會出現一個拐點也即“肘”點,下降率突然變緩時即認為是最佳的k值。在決定什么時候停止訓練時,肘形判據同樣有效,數據通常有更多的噪音,在增加分類無法帶來更多回報時,我們停止增加類別。
3、輪廓系數
?結合了聚類的凝聚度(Cohesion)和分離度(Separation),用于評估聚類的效果:
?
目的:內部距離最小化,外部距離最大化
計算樣本i到同簇其他樣本的平均距離ai,ai 越小樣本i的簇內不相似度越小,說明樣本i越應該被聚類到該簇。
計算樣本i到最近簇Cj 的所有樣本的平均距離bij,稱樣本i與最近簇Cj 的不相似度,定義為樣本i的簇間不相似度:bi =min{bi1, bi2, ..., bik},bi越大,說明樣本i越不屬于其他簇。
求出所有樣本的輪廓系數后再求平均值就得到了平均輪廓系數。
平均輪廓系數的取值范圍為[-1,1],系數越大,聚類效果越好。
簇內樣本的距離越近,簇間樣本距離越遠
3.2.3?K-Mean算法特點
優點:速度快,簡單
對處理大數據集,該算法保持可伸縮性和高效率
當簇近似為高斯分布時,它的效果較好。
空間復雜度o(N),時間復雜度o(IKN)(N為樣本點個數,K為中心點個數,I為迭代次數)
缺點:最終結果跟初始點選擇相關,容易陷入局部最優,需直到k值
-
k均值算法中k是實現給定的,這個k值的選定是非常難估計的。
-
k均值的聚類算法需要不斷地進行樣本分類調整,不斷地計算調整后的新的聚類中心,當數據量大的時候,算法開銷很大。
-
k均值是求得局部最優解的算法,所以對于初始化時選取的k個聚類的中心比較敏感,不同點的中心選取策略可能帶來不同的聚類結果。比如實際分類5類的情況卻只進行了3均值的聚類。
-
對噪聲點和孤立點數據敏感。
-
KMeans一般是其他聚類方法的基礎算法,如譜聚類。
4. 聚類分析案例
4.1 聚類分析案例1:年齡與收入人群聚類
# 年齡與收入分群 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt# 加載數據 ageinc_df=pd.read_csv('data/ageinc.csv') ageinc_df.info()ageinc_df.describe()# 數據標準化 #(收入-收入均值)/收入標準差 ageinc_df['z_income']=(ageinc_df['income']-ageinc_df['income'].mean())/ageinc_df['income'].std() #(年齡-年齡均值)/年齡標準差 ageinc_df['z_age']=(ageinc_df['age']-ageinc_df['age'].mean())/ageinc_df['age'].std() ageinc_df.describe()# 數據可視化 sns.scatterplot(x='income',y='age',data=ageinc_df)#將群體分成3層 #用標準化的收入與年齡來擬合模型 from sklearn.cluster import KMeans model =KMeans(n_clusters=3,random_state=10) model.fit(ageinc_df[['z_income','z_age']])# 為用戶打上標簽 ageinc_df['cluster']=model.labels_ # 查看用戶的分群情況 ageinc_df.head(50)# 將分群結果可視化 sns.scatterplot(x='age',y='income',hue='cluster',data=ageinc_df)?
4.2?聚類分析案例2:顧客數據聚類分析
# 導入數據并查看數據情況 import pandas as pd airbnb=pd.read_csv('data/airbnb.csv') airbnb.info()airbnb.head()# 單變量分析 airbnb.describe()# 發現年齡最小是2最大是2014,屬于數據異常,進行數據清洗,這里保留用戶年齡在18-70歲之間的群體 airbnb=airbnb[airbnb['age']<=70] airbnb=airbnb[airbnb['age']>=18] airbnb.age.describe()# 日期數據處理 #將注冊日期轉變為日期時間格式 airbnb['date_account_created']=pd.to_datetime(airbnb['date_account_created']) airbnb.info()#將年份從中提取出來,將2019 -注冊日期的年份,并生成一個新的變量year_since_account_created airbnb['year_since_account_created']=airbnb['date_account_created'].apply(lambda x: 2019-x.year) airbnb.year_since_account_created.describe()# 計算用戶第一次預定到2019年的時間 airbnb['date_first_booking']=pd.to_datetime(airbnb['date_first_booking']) airbnb['year_since_first_booking']=airbnb['date_first_booking'].apply(lambda x:2019-x.year) airbnb.year_since_first_booking.describe()# 選擇五個變量,作為分群的維度 airbnb_5=airbnb[['age','web','moweb','ios','android']]# 數據標準化,使用sklearn中預處理的scale from sklearn.preprocessing import scale x=pd.DataFrame(scale(airbnb_5))# 使用cluster建模 from sklearn.cluster import KMeans # 嘗試分為3類 model=KMeans(n_clusters=3,random_state=10) model.fit(x)# 提取標簽,查看分類結果 airbnb_5['cluster']=model.labels_ airbnb_5.head(10)# 模型評估與優化 #使用groupby'函數,評估各個變量維度的分群效果 airbnb_5.groupby(['cluster'])['age'].describe() airbnb_5.groupby(['cluster'])['ios'].describe()# 使用silhouette_score,評估模型效果 from sklearn.metrics import silhouette_score #調用sklearn的metrics庫 x_cluster = model.fit_predict(x) #個體與群的距離 score = silhouette_score(x,x_cluster) #評分越高,個體與群越近;評分越低,個體與群越遠 scorecenters=pd.DataFrame(model.cluster_centers_) centers.to_csv('center_3.csv')# 將群體分為5組 model=KMeans(n_clusters=5,random_state=10) model.fit(x) centers=pd.DataFrame(model.cluster_centers_) centers.to_csv('center_5.csv')?
總結
以上是生活随笔為你收集整理的机器学习----聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元宇宙:一场虚拟空间的跃迁
- 下一篇: 【动画演示软件】Focusky教程 |