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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

无监督学习——K均值聚类的Python实现

發布時間:2023/12/14 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无监督学习——K均值聚类的Python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

概要

一、K均值算法

二、K值的選取:手肘法

三、用聚類實現鳶尾花數據分類

四、應用案例

1. 讀取數據

2. 繪制手肘圖

3. 找到最佳K值

4. 分類結果可視化


機器學習類型和算法的分類

無監督學習的數據集中沒有輸出標簽y,常用的無監督學習算法有聚類和降維。

概要

聚類人有歸納和總結的能力,機器也有。聚類就是讓機器把數據集中的樣本按照特征的性質分組,這個過程中沒有標簽的存在。

聚類和監督學習中的分類問題有些類似,其主要區別在于:傳統分類問題也就是說,在對貓狗圖像分類之前,我們心里面已經對貓、狗圖像形成了概念。這些概念指導著我們為訓練集設定好標簽。機器首先是學習概念,然后才能夠做分類、做判斷。分類的結果,還要接受標簽,也就是已有概念的檢驗。

而聚類不同,雖然本質上也是“分類”,但是“譬如,漫天繁星,彼此之間并沒有關聯,也 沒有星座的概念,當人們看到它們,是先根據星星在廣袤蒼穹中的位置將其一組一組地“聚集"起來,然后才逐漸形成星座的概念。人們說,這一-組星星是“大熊座",那一組星星是“北斗七星”。這個先根據特征進行分組,之后再概念化的過程就是聚類。聚類算法有好幾種,K均值(K-means)是其中最常見的一種。

一、K均值算法

K均值算法是最容易理解的無監督學習算法。算法簡單,速度也不差,但需要人工指定K值,也就是分成幾個聚類。

具體算法流程:

(1)首先確定K的數值,比如5個聚類,也叫5個簇。

(2)然后再一大堆數據中隨機挑選K個數據點,作為簇的質心(centroid)。這些隨機質心當然不完美,別著急,它們會慢慢變得完美。

(3)遍歷集合中每一個數據點,計算它們與每一個質心的距離(比如歐式距離)。數據點離哪個質心近,就屬于哪一類。此時初始的K個類別開始形成。

(4)這時每一個質心中都聚集了很多數據點,于是質心說,你們來了,我就要“退役”了(這是個偉大的“禪讓制度”啊!),選取一個新的質心吧。然后計算出每一類中最靠近中心的點,作為新的質心。此時新的質心會比原來隨機選來的靠譜一些(等會兒用圖展示質心的移動)

(5)重新進行步驟(3),計算所有數據點和新的質心的距離,在新的質心周圍形成新的簇分配(“吃瓜群眾”隨風飄搖,離誰進就跟誰)。

(6)重新進行步驟(4),繼續選擇更好的質心(一代一代的“禪讓”下去)。

(7)一直重復進行步驟(5)和(6),不斷更新簇中的數據點,不斷找到新的質心,直至收斂。

二、K值的選取:手肘法

聚類問題的關鍵在于K值的選取。也就是說,把一批數據劃分為多少個簇是最合理的呢?當數據特征維度較少、數據分布較為分散時,可通過數據可視化的方法來人工確定K值。但當數據特征維度較多、數據分布較為混亂時,數據可視化幫助不大。

當然,也可以經過多次實驗,逐步調整,使簇的數目逐漸達到最優,以符合數據集的特點。

這里我介紹一種直觀的手肘法( elbow method)進行簇的數量的確定。手肘法是基于 對聚類效果的一一個度量指標來實現的,這個指標也可以視為一一種損失。 在K值很小的時候,整體損失很大,而隨著K值的增大,損失函數的值會在逐漸收斂之前出現一個拐點。此時的K值就是比較好的值。

大家看下面的圖,損失隨著簇的個數而收斂的曲線有點像只手臂,最佳K值的點像是手肘,因此取名為手肘法。

三、用聚類實現鳶尾花數據分類

1. 數據讀取

import numpy as np import pandas as pd dataset = pd.read_csv('D:/NoteBook/Iris.txt') dataset.head()

#只對兩個特征進行聚類,以便二維展示 X = dataset.iloc[:,[0,3]].values

下面嘗試用不同的K值進行聚類的擬合

#聚類的集合,下面嘗試用不同的K值進行聚類的擬合 from sklearn.cluster import KMeans#導入聚類模型 cost = []#初始化損失(距離)值 for i in range(1,11):#嘗試不同的K值kmeans = KMeans(n_clusters= i ,init='k-means++', random_state = 0)kmeans.fit(X)cost.append(kmeans.inertia_)#inerita_是我們選擇的方法,其作用相當于損失函數 #繪制手肘圖找到最佳K值 import matplotlib.pyplot as plt import seaborn as sns hist,ax = plt.subplots() plt.plot(range(1,11),cost) # plt.title('The Elbow Method') ax.set_title('The Elbow Method') ax.set_ylabel('Cost') plt.show()

kmeansmodel = KMeans(n_clusters=3, init='k-means++') y_kmeans = kmeansmodel.fit_predict(X) #把分類好的聚類可視化 hist,ax = plt.subplots() plt.scatter(X[y_kmeans == 0,0], X[y_kmeans == 0,1],s = 100, c = 'cyan', label = 'Cluster 1')#聚類1 plt.scatter(X[y_kmeans == 1,0], X[y_kmeans == 1,1],s = 100, c = 'blue', label = 'Cluster 2')#聚類2 plt.scatter(X[y_kmeans == 2,0], X[y_kmeans == 2,1],s = 100, c = 'green', label = 'Cluster 3')#聚類3 plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s = 200, c = 'yellow', label = 'Centroids')#質心 ax.set_title('鳶尾花花萼形成的聚類')#鳶尾花花萼形成的聚類 ax.set_xlabel('花萼長度')# ax.set_ylabel('花萼寬度')# plt.legend() plt.show()

打印聚類結果圖:?

四、應用案例

本案例主要是基于企業注冊資金和參保人數的企業聚類分析

1. 讀取數據

import numpy as np import pandas as pd data = pd.read_excel('C:/新評分及數據補全合并.xlsx') data.head()

注冊資金數據去單位

import re io = 'C:/新評分及數據補全合并.xlsx' registered_capital = data['注冊資本'] capital = [] for i in registered_capital:m = str(i).replace('-','0') #匹配到“-”并替換為“0”now = re.match("\d*", m).group() #group(0) 同 group() 就是匹配正則表達式整體結果capital.append(now) data['注冊資本新'] = pd.DataFrame(capital) #數據存入Excel列 data['注冊資本新'].head() data.to_excel(io) #此行代碼為數據存入Excel列,上面已存儲,可注釋

數據歸一化處理

from sklearn.preprocessing import MinMaxScaler io = 'C:/新評分及數據補全合并.xlsx' x1 = data[['注冊資本新']] x2 = data[['參保人數']] # x2 = (x1 - np.min(x1))/(np.max(x1) - np.min(x1)) #注冊資本歸一化后的結果 min_max_scaler = MinMaxScaler() X_train_minmax1 = min_max_scaler.fit_transform(x1)#注冊資本歸一化后的結果 X_train_minmax2 = min_max_scaler.fit_transform(x2)#參保人數歸一化后的結果 data['注冊資本歸一化'] = pd.DataFrame(X_train_minmax1) #數據存入Excel列 data['參保人數一化'] = pd.DataFrame(X_train_minmax2) #數據存入Excel列 # pd.DataFrame(X_train_minmax1.tolist()).describe() # pd.DataFrame(X_train_minmax2.tolist()).describe() # data.to_excel(io)

歸一化結果

X2 = data.loc[:,['注冊資本歸一化','參保人數一化']].values print(X2)

?

2. 繪制手肘圖

#繪制手肘圖 from sklearn.cluster import KMeans cost = [] for i in range(1,11):kmeans = KMeans(n_clusters= i ,init='k-means++', random_state = 0)kmeans.fit(X2)cost.append(kmeans.inertia_)

3. 找到最佳K值

#繪制手肘圖找到最佳K值 import matplotlib.pyplot as plt import seaborn as sns hist,ax = plt.subplots() plt.plot(range(1,11),cost) # plt.title('The Elbow Method') ax.set_title('The Elbow Method') ax.set_ylabel('Cost') plt.show()

由手肘圖可判斷,最佳K值大概為4,我們選擇4作為聚類個數

kmeansmodel = KMeans(n_clusters=4, init='k-means++') y_kmeans = kmeansmodel.fit_predict(X2)

4. 分類結果可視化

#把分類好的聚類可視化 hist,ax = plt.subplots() #解決中文顯示問題 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.scatter(X2[y_kmeans == 0,0], X2[y_kmeans == 0,1],s = 100, c = 'cyan', label = 'Cluster 1')#聚類1 plt.scatter(X2[y_kmeans == 1,0], X2[y_kmeans == 1,1],s = 100, c = 'blue', label = 'Cluster 2')#聚類2 plt.scatter(X2[y_kmeans == 2,0], X2[y_kmeans == 2,1],s = 100, c = 'green', label = 'Cluster 3')#聚類3 plt.scatter(X2[y_kmeans == 3,0], X2[y_kmeans == 3,1],s = 100, c = 'red', label = 'Cluster 4')#聚類3 plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s = 200, c = 'yellow', label = 'Centroids')#質心 ax.set_title('企業聚類')#客戶形成的聚類 ax.set_xlabel('注冊資本')# ax.set_ylabel('參保人數')# plt.legend() plt.show()

企業聚類結果

?

?由于我們的數據比較隨機,并不是很規整,所以結果來看,聚類結果并不是十分美觀。

總結

以上是生活随笔為你收集整理的无监督学习——K均值聚类的Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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