日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习----聚类算法

發布時間:2024/1/1 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习----聚类算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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')

?

總結

以上是生活随笔為你收集整理的机器学习----聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。