国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

(python實(shí)現(xiàn))一篇文章教會(huì)你k-means聚類算法(包括最優(yōu)聚類數(shù)目k的確定)

這篇具有很好參考價(jià)值的文章主要介紹了(python實(shí)現(xiàn))一篇文章教會(huì)你k-means聚類算法(包括最優(yōu)聚類數(shù)目k的確定)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

摘要

Kmeans算法中,K值所決定的是在該聚類算法中,所要分配聚類的簇的多少。Kmeans算法對(duì)初始值是?較敏感的,對(duì)于同樣的k值,選取的點(diǎn)不同,會(huì)影響算法的聚類效果和迭代的次數(shù)。本文通過計(jì)算原始數(shù)據(jù)中的:手肘法、輪廓系數(shù)、CH值和DB值,四種指標(biāo)來(lái)衡量K-means的最佳聚類數(shù)目,并使用K-means進(jìn)行聚類,最后可視化聚類的結(jié)果。
一篇文章教會(huì)你如何使用matlab進(jìn)行K-means聚類,以及如何確定最優(yōu)k值,不要再去看那些付費(fèi)文章了。

1. K-means算法

1.1 聚類算法簡(jiǎn)介

對(duì)于"監(jiān)督學(xué)習(xí)"(supervised learning),其訓(xùn)練樣本是帶有標(biāo)記信息的,并且監(jiān)督學(xué)習(xí)的目的是:對(duì)帶有標(biāo)記的數(shù)據(jù)集進(jìn)行模型學(xué)習(xí),從而便于對(duì)新的樣本進(jìn)行分類。而在“無(wú)監(jiān)督學(xué)習(xí)”(unsupervised learning)中,訓(xùn)練樣本的標(biāo)記信息是未知的,目標(biāo)是通過對(duì)無(wú)標(biāo)記訓(xùn)練樣本的學(xué)習(xí)來(lái)揭示數(shù)據(jù)的內(nèi)在性質(zhì)及規(guī)律,為進(jìn)一步的數(shù)據(jù)分析提供基礎(chǔ)。對(duì)于無(wú)監(jiān)督學(xué)習(xí),應(yīng)用最廣的便是"聚類"(clustering)。

"聚類算法"試圖將數(shù)據(jù)集中的樣本劃分為若干個(gè)通常是不相交的子集,每個(gè)子集稱為一個(gè)“簇”(cluster),通過這樣的劃分,每個(gè)簇可能對(duì)應(yīng)于一些潛在的概念或類別。

1.2 K-means聚類算法

kmeans算法又名k均值算法,K-means算法中的k表示的是聚類為k個(gè)簇,means代表取每一個(gè)聚類中數(shù)據(jù)值的均值作為該簇的中心,或者稱為質(zhì)心,即用每一個(gè)的類的質(zhì)心對(duì)該簇進(jìn)行描述。

其算法思想大致為:先從樣本集中隨機(jī)選取 k個(gè)樣本作為簇中心,并計(jì)算所有樣本與這 k個(gè)“簇中心”的距離,對(duì)于每一個(gè)樣本,將其劃分到與其距離最近的“簇中心”所在的簇中,對(duì)于新的簇計(jì)算各個(gè)簇的新的“簇中心”。

根據(jù)以上描述,我們大致可以猜測(cè)到實(shí)現(xiàn)kmeans算法的主要四點(diǎn):
?? (1)簇個(gè)數(shù) k 的選擇
?? (2)各個(gè)樣本點(diǎn)到“簇中心”的距離
?? (3)根據(jù)新劃分的簇,更新“簇中心”
?? (4)重復(fù)上述2、3過程,直至"簇中心"沒有移動(dòng)。

1.3 代碼實(shí)現(xiàn)

注意:需要先通過下文2部分確定k值

import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 計(jì)算歐式距離
def calcDis(dataSet, centroids, k):
    clalist=[]
    for data in dataSet:
        diff = np.tile(data, (k, 1)) - centroids  #相減   (np.tile(a,(2,1))就是把a(bǔ)先沿x軸復(fù)制1倍,即沒有復(fù)制,仍然是 [0,1,2]。 再把結(jié)果沿y方向復(fù)制2倍得到array([[0,1,2],[0,1,2]]))
        squaredDiff = diff ** 2     #平方
        squaredDist = np.sum(squaredDiff, axis=1)   #和  (axis=1表示行)
        distance = squaredDist ** 0.5  #開根號(hào)
        clalist.append(distance) 
    clalist = np.array(clalist)  #返回一個(gè)每個(gè)點(diǎn)到質(zhì)點(diǎn)的距離len(dateSet)*k的數(shù)組
    return clalist

# 計(jì)算質(zhì)心
def classify(dataSet, centroids, k):
    # 計(jì)算樣本到質(zhì)心的距離
    clalist = calcDis(dataSet, centroids, k)
    # 分組并計(jì)算新的質(zhì)心
    minDistIndices = np.argmin(clalist, axis=1)    #axis=1 表示求出每行的最小值的下標(biāo)
    newCentroids = pd.DataFrame(dataSet).groupby(minDistIndices).mean() #DataFramte(dataSet)對(duì)DataSet分組,groupby(min)按照min進(jìn)行統(tǒng)計(jì)分類,mean()對(duì)分類結(jié)果求均值
    newCentroids = newCentroids.values
 
    # 計(jì)算變化量
    changed = newCentroids - centroids
 
    return changed, newCentroids

# 使用k-means分類
def kmeans(dataSet, k):
    # 隨機(jī)取質(zhì)心
    centroids = random.sample(dataSet, k)
    
    # 更新質(zhì)心 直到變化量全為0
    changed, newCentroids = classify(dataSet, centroids, k)
    while np.any(changed != 0):
        changed, newCentroids = classify(dataSet, newCentroids, k)
 
    centroids = sorted(newCentroids.tolist())   #tolist()將矩陣轉(zhuǎn)換成列表 sorted()排序
 
    # 根據(jù)質(zhì)心計(jì)算每個(gè)集群
    cluster = []
    clalist = calcDis(dataSet, centroids, k) #調(diào)用歐拉距離
    minDistIndices = np.argmin(clalist, axis=1)  
    for i in range(k):
        cluster.append([])
    for i, j in enumerate(minDistIndices):   #enymerate()可同時(shí)遍歷索引和遍歷元素
        cluster[j].append(dataSet[i])
        
    return centroids, cluster
 
# 創(chuàng)建數(shù)據(jù)集
def createDataSet():
    return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]

if __name__=='__main__': 
    dataset = createDataSet()
    centroids, cluster = kmeans(dataset, 2)
    print('質(zhì)心為:%s' % centroids)
    print('集群為:%s' % cluster)
    for i in range(len(dataset)):
      plt.scatter(dataset[i][0],dataset[i][1], marker = 'o',color = 'green', s = 40 ,label = '原始點(diǎn)')
                                                    #  記號(hào)形狀       顏色      點(diǎn)的大小      設(shè)置標(biāo)簽
      for j in range(len(centroids)):
        plt.scatter(centroids[j][0],centroids[j][1],marker='x',color='red',s=50,label='質(zhì)心')
        plt.show()

2. 最優(yōu)聚類數(shù)目K的確定

2.1 手肘法–Elbow(經(jīng)驗(yàn)方法)

我們知道k-means是以最小化樣本與質(zhì)點(diǎn)平方誤差作為目標(biāo)函數(shù),將每個(gè)簇的質(zhì)點(diǎn)與簇內(nèi)樣本點(diǎn)的平方距離誤差和稱為畸變程度(distortions),那么,對(duì)于一個(gè)簇,它的畸變程度越低,代表簇內(nèi)成員越緊密,畸變程度越高,代表簇內(nèi)結(jié)構(gòu)越松散。 畸變程度會(huì)隨著類別的增加而降低,但對(duì)于有一定區(qū)分度的數(shù)據(jù),在達(dá)到某個(gè)臨界點(diǎn)時(shí)畸變程度會(huì)得到極大改善,之后緩慢下降,這個(gè)臨界點(diǎn)就可以考慮為聚類性能較好的點(diǎn)。

# 導(dǎo)包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist
from sklearn.cluster import KMeans

# 1.利用pandas讀入數(shù)據(jù)
data = pd.read_csv(data_path, header=None) # data_path換成你的需要聚類的數(shù)據(jù)所在路徑,我的數(shù)據(jù)沒有表頭,所以設(shè)置header=None
x = data[0: 150] # 設(shè)置需要聚類的數(shù)據(jù)列數(shù),我的是150維

# 2.繪制手肘圖
dispersions = []
for k in range(1, 20): # k:需要聚幾類,按需修改,推薦至少10類
    kmeans = KMeans(n_clusters=k, random_state=9)
    y_pred = kmeans.fit_predict(x)
    dispersions.append(sum(np.min(cdist(x, kmeans.cluster_centers_, 'euclidean'), axis=1))/x.shape[0])
print(dispersions)

plt.plot(range(1, 20), dispersions, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Average Dispersion')
plt.title('the Elbow Method')
plt.show()

(python實(shí)現(xiàn))一篇文章教會(huì)你k-means聚類算法(包括最優(yōu)聚類數(shù)目k的確定)

我的數(shù)據(jù)比較差,暫且認(rèn)為在聚5類之前走勢(shì)變換程度較大,聚5類以后走勢(shì)變得平緩,所以如果按照手肘法,我的k值確定為5。
注意:手肘法通過人眼觀察肘部圖的走向來(lái)確定肘部位置進(jìn)而來(lái)確定k值,主觀因素很大,不推薦在寫論文時(shí)使用,解釋不清,以免審稿人刁難。

2.2 Silhouette Coefficient(輪廓系數(shù),理論方法)

對(duì)于一個(gè)聚類任務(wù),我們希望得到的類別簇中,簇內(nèi)盡量緊密,簇間盡量遠(yuǎn)離,輪廓系數(shù)便是類的密集與分散程度的評(píng)價(jià)指標(biāo),公式表達(dá)為s=(b?a)/max(a,b),其中a簇樣本到彼此間距離的均值,b代表樣本到除自身所在簇外的最近簇的樣本的均值,s取值在[-1, 1]之間,越接近1表示聚類效果越好

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score


data = pd.read_csv(data_path, header=None)
x = data[0: 150]

silhouette_scores = []
for k in range(2, 10):
    y_pred = KMeans(n_clusters=k, random_state=9).fit_predict(x)
    silhouette_scores.append(silhouette_score(x, y_pred))
print(silhouette_scores)

plt.plot(range(2, 10), silhouette_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('silhouette')
plt.title('the Silhouette Method')
plt.show()

(python實(shí)現(xiàn))一篇文章教會(huì)你k-means聚類算法(包括最優(yōu)聚類數(shù)目k的確定)

2.3 Calinski-Harabasz Criterion(卡林斯基-哈拉巴斯指標(biāo),CH值,理論方法)

定義就不多說了,直接上代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-446186.html

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans


data = pd.read_csv(data_path, header=None)
x = data[0: 520]

scores = []
for k in range(2, 20):
    y_pred = KMeans(n_clusters=k, random_state=9).fit_predict(x)
    score = metrics.calinski_harabasz_score(x, y_pred)
    scores.append(score)

print(scores)
plt.plot(range(2, 20), scores, 'bx-')
plt.xlabel('k')
plt.ylabel('the Calinski Carabasz Score')
plt.title('the CH Method')
plt.show()

2.4 Davies-Bouldin Criterion(戴維斯-博爾丁指標(biāo),DB值,理論方法)

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans


data = pd.read_csv(data_path, header=None)
x = data[0: 520]

scores = []
for k in range(2, 20):
    y_pred = KMeans(n_clusters=k, random_state=9).fit_predict(x)
    score = metrics.davies_bouldin_score(x, y_pred)
    scores.append(score)

print(scores)
plt.plot(range(2, 20), scores, 'bx-')
plt.xlabel('k')
plt.ylabel('the Davies Bouldin Score')
plt.title('the DB Method')
plt.show()

到了這里,關(guān)于(python實(shí)現(xiàn))一篇文章教會(huì)你k-means聚類算法(包括最優(yōu)聚類數(shù)目k的確定)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)學(xué)建模--K-means聚類的Python實(shí)現(xiàn)

    數(shù)學(xué)建模--K-means聚類的Python實(shí)現(xiàn)

    目錄 1.算法流程簡(jiǎn)介 2.1.K-mean算法核心代碼 2.2.K-mean算法效果展示 3.1.肘部法算法核心代碼? 3.2.肘部法算法效果展示? ?

    2024年02月09日
    瀏覽(20)
  • Python | 實(shí)現(xiàn) K-means 聚類——多維數(shù)據(jù)聚類散點(diǎn)圖繪制

    Python | 實(shí)現(xiàn) K-means 聚類——多維數(shù)據(jù)聚類散點(diǎn)圖繪制

    客觀吐槽:CSDN的富文本編輯器真是超級(jí)無(wú)敵難用 。首先要吐槽一下CSDN的富文本編輯器,好難用,好難用,好難用,好難用好難用,好難用,好難用,好難用!?。。。。。。。。。。。。。。。。∏斑叺拈_頭文字編輯了三四次,每次都是不小心按了ctrl+z,就完全消失了。

    2024年02月03日
    瀏覽(25)
  • ai寫作怎么用?這篇文章教會(huì)你

    ai寫作怎么用?這篇文章教會(huì)你

    在數(shù)字化時(shí)代,寫作已經(jīng)成為了一種不可或缺的技能。無(wú)論是學(xué)術(shù)論文、商業(yè)文案、社交媒體帖子,還是個(gè)人日記、博客文章,我們都需要用到寫作。然而,隨著人工智能技術(shù)的發(fā)展,我們開始使用ai寫作來(lái)完成這些任務(wù)。ai寫作可以幫助人們快速、準(zhǔn)確地完成寫作任務(wù),提高

    2024年02月16日
    瀏覽(25)
  • k-means聚類算法 心得分享(含python實(shí)現(xiàn)代碼)

    k-means聚類算法 心得分享(含python實(shí)現(xiàn)代碼)

    目錄 1.K-means聚類算法 1.1 引言: 1.2 K-Means 算法的基本思想 1.3 K-Means 算法的優(yōu)缺點(diǎn): 1.4 K-Means 算法的應(yīng)用: 2.K-means聚類算法的實(shí)現(xiàn)具體步驟 2.1初始化聚類中心 2.2計(jì)算每個(gè)數(shù)據(jù)點(diǎn)到聚類中心的距離 2.3確定每個(gè)數(shù)據(jù)點(diǎn)所屬聚類簇 2.4更新聚類中心 2.5循環(huán)執(zhí)行步驟2-4,直到達(dá)到最

    2024年02月02日
    瀏覽(25)
  • 一篇文章教會(huì)你什么是Linux進(jìn)程控制

    一篇文章教會(huì)你什么是Linux進(jìn)程控制

    在Linux上一篇文章進(jìn)程概念詳解我們提到了在linux中fork函數(shù)是非常重要的函數(shù),它從已存在進(jìn)程中創(chuàng)建一個(gè)新進(jìn)程。新進(jìn)程為子進(jìn)程,而原進(jìn)程為父進(jìn)程。 返回值 自進(jìn)程中返回0,父進(jìn)程返回子進(jìn)程id,出錯(cuò)返回-1 1.1那么fork創(chuàng)建子進(jìn)程時(shí),操作系統(tǒng)都做了什么呢? 當(dāng)在操作系

    2024年02月13日
    瀏覽(34)
  • docker從安裝到部署項(xiàng)目,一篇文章教會(huì)你

    docker從安裝到部署項(xiàng)目,一篇文章教會(huì)你

    首先看下 Docker 圖標(biāo): 一條小鯨魚上面有些集裝箱,比較形象的說明了 Docker 的特點(diǎn),以后見到這個(gè)圖標(biāo)等同見到了 Docker 1. Docker 是一個(gè)開源的應(yīng)用容器引擎,它基于 Go 語(yǔ)言開發(fā),并遵從 Apache2.0 開源協(xié)議 2. 使用 Docker 可以讓開發(fā)者封裝他們的應(yīng)用以及依賴包到一個(gè)可移植的

    2024年02月08日
    瀏覽(25)
  • 一篇文章教會(huì)你如何編寫一個(gè)簡(jiǎn)單的Shell腳本

    一篇文章教會(huì)你如何編寫一個(gè)簡(jiǎn)單的Shell腳本

    Shell腳本概念 Shell 腳本是一種用于自動(dòng)化執(zhí)行一系列命令和操作的腳本文件。它使用的是 Shell 解釋器(如 Bash、Korn Shell、Zsh 等)來(lái)解釋和執(zhí)行其中的命令。Shell 腳本通常用于編寫簡(jiǎn)單的任務(wù)和工作流程,可以幫助我們進(jìn)行系統(tǒng)管理、批量處理、自動(dòng)化部署等任務(wù)。 以.sh后綴

    2024年02月10日
    瀏覽(30)
  • C++初階之一篇文章教會(huì)你list(理解和使用)

    C++初階之一篇文章教會(huì)你list(理解和使用)

    在C++標(biāo)準(zhǔn)庫(kù)中, std::list 是一個(gè)雙向鏈表容器,用于存儲(chǔ)一系列元素。與 std::vector 和 std::deque 等容器不同, std::list 使用鏈表的數(shù)據(jù)結(jié)構(gòu)來(lái)組織元素,因此在某些操作上具有獨(dú)特的優(yōu)勢(shì)和性能特點(diǎn)。以下是關(guān)于 std::list 的詳細(xì)介紹: 雙向鏈表結(jié)構(gòu): std::list 內(nèi)部使用雙向鏈表來(lái)

    2024年02月13日
    瀏覽(29)
  • K-Means聚類算法及其python實(shí)現(xiàn)(已附上代碼至本博客)

    K-Means聚類算法及其python實(shí)現(xiàn)(已附上代碼至本博客)

    覺得有用的,一腚要先點(diǎn)贊后收藏!!!氣死人了,40多個(gè)收藏0點(diǎn)贊!! 對(duì)于 n代表了x有n維,x上標(biāo)j表示第j維的特征,下標(biāo)i表示該向量是第i個(gè)樣本 簇中心坐標(biāo)為:(當(dāng)然,這也是重新計(jì)算簇中心坐標(biāo)的方法?。。?向量 u i = ( u i ( 1 ) , u i ( 2 ) , ? ? ? , u i ( j ) , ? ? ? , u i ( n )

    2024年02月08日
    瀏覽(27)
  • python 實(shí)現(xiàn)k-means聚類算法 銀行客戶分組畫像實(shí)戰(zhàn)(超詳細(xì),附源碼)

    python 實(shí)現(xiàn)k-means聚類算法 銀行客戶分組畫像實(shí)戰(zhàn)(超詳細(xì),附源碼)

    想要數(shù)據(jù)集請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言留下QQ郵箱 k-means具體是什么這里就不再贅述,詳情可以參見我這篇博客 k-means 問題描述:銀行對(duì)客戶信息進(jìn)行采集,獲得了200位客戶的數(shù)據(jù),客戶特征包括以下四個(gè)1:社保號(hào)碼 2:姓名? 3:年齡 4:存款數(shù)量 使用k-means算法對(duì)客戶進(jìn)行

    2024年02月11日
    瀏覽(130)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包