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

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

這篇具有很好參考價(jià)值的文章主要介紹了K-Means聚類算法及其python實(shí)現(xiàn)(已附上代碼至本博客)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


覺得有用的,一腚要先點(diǎn)贊后收藏!!!氣死人了,40多個(gè)收藏0點(diǎn)贊!!

一、算法公式講解

對(duì)于kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
n代表了x有n維,x上標(biāo)j表示第j維的特征,下標(biāo)i表示該向量是第i個(gè)樣本
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
簇中心坐標(biāo)為:(當(dāng)然,這也是重新計(jì)算簇中心坐標(biāo)的方法!?。?br> 向量 u i = ( u i ( 1 ) , u i ( 2 ) , ? ? ? , u i ( j ) , ? ? ? , u i ( n ) ) u_i=(u_i^{(1)} ,u_i^{(2)}, ···, u_i^{(j)},···,u_i^{(n)}) ui?=(ui(1)?,ui(2)?,???,ui(j)?,???,ui(n)?),然后標(biāo)量
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
其中一個(gè)維度,這里比如說(shuō)是第2個(gè)樣本的第1維特征 u 2 1 u_{2}^{1} u21?,我就到這個(gè)第二個(gè)簇里面把這個(gè)簇所有點(diǎn)第一特征求和得到sum,然后把總和sum除以這個(gè)簇的大小| C 2 C_2{} C2?|(這個(gè)簇里面點(diǎn)的個(gè)數(shù)),然后就得到第2簇的簇中心的第1維的特征(坐標(biāo))
比如第一簇的簇中心坐標(biāo):

u 1 = ( u 1 ( 1 ) , u 1 ( 2 ) , u 1 ( 3 ) ) u_1=(u_1^{(1)} ,u_1^{(2)},u_1^{(3)}) u1?=(u1(1)?,u1(2)?,u1(3)?)

屬于第一簇的坐標(biāo)有
x 2 = ( 1 , 2 , 3 ) x_2=(1 ,2,3) x2?=(1,2,3)

x 3 = ( 4 , 5 , 6 ) x_3=(4 ,5,6) x3?=(4,5,6)

x 4 = ( 7 , 8 , 9 ) x_4=(7 ,8,9) x4?=(7,8,9)

u 1 = ( 1 + 4 + 7 3 , 2 + 5 + 8 3 , 3 + 6 + 9 3 ) = ( 4 , 5 , 6 ) u_1=(\frac{1+4+7}{3} ,\frac{2+5+8}{3},\frac{3+6+9}{3} )=(4,5,6) u1?=(31+4+7?,32+5+8?,33+6+9?)=(4,5,6)

kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans

二、算法流程

kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
K-means算法首先隨機(jī)分布簇中心,然后計(jì)算簇中心并重新分簇為一個(gè)周期進(jìn)行迭代,直到簇穩(wěn)定為止,

三、算法實(shí)現(xiàn)代碼

有Kmeans.py和kmeansSamples.txt兩個(gè)文件,kmeansSamples.txt記錄的是所有點(diǎn)的坐標(biāo),Kmeans.py描述算法實(shí)現(xiàn)
Kmeans.py文件如下

# -*- coding: utf-8 -*-


import numpy as np
import matplotlib.pyplot as plt

def L2(vecXi, vecXj):
    '''
    計(jì)算歐氏距離
    para vecXi:點(diǎn)坐標(biāo),向量
    para vecXj:點(diǎn)坐標(biāo),向量
    retrurn: 兩點(diǎn)之間的歐氏距離
    '''
    return np.sqrt(np.sum(np.power(vecXi - vecXj, 2)))

def kMeans(S, k, distMeas=L2):
    '''
    K均值聚類
    para S:樣本集,多維數(shù)組
    para k:簇個(gè)數(shù)
    para distMeas:距離度量函數(shù),默認(rèn)為歐氏距離計(jì)算函數(shù)
    return sampleTag:一維數(shù)組,存儲(chǔ)樣本對(duì)應(yīng)的簇標(biāo)記
    return clusterCents:一維數(shù)組,各簇中心
    retrun SSE:誤差平方和
    '''
    print('k = ' , k)
    m = np.shape(S)[0] # 樣本總數(shù)
    sampleTag = np.zeros(m)
    print('sampleTag.shape=',sampleTag)
    # 隨機(jī)產(chǎn)生k個(gè)初始簇中心
    n = np.shape(S)[1] # 樣本向量的特征數(shù)
    print('n = ' , n)
    clusterCents = np.mat([[-1.93964824,2.33260803],[7.79822795,6.72621783],[10.64183154,0.20088133]])
    #clusterCents = np.mat(np.zeros((k,n)))
    #for j in range(n):
    #    minJ = min(S[:,j]) 
    #    rangeJ = float(max(S[:,j]) - minJ)
    #    clusterCents[:,j] = np.mat(minJ + rangeJ * np.random.rand(k,1))
        
    sampleTagChanged = True
    SSE = 0.0
    while sampleTagChanged: # 如果沒有點(diǎn)發(fā)生分配結(jié)果改變,則結(jié)束
        sampleTagChanged = False
        SSE = 0.0
        
        # 計(jì)算每個(gè)樣本點(diǎn)到各簇中心的距離
        # m是樣本總數(shù)
        for i in range(m):
            minD = np.inf
            minIndex = -1
            # k是簇中心個(gè)數(shù)
            for j in range(k):
                # S樣本集,clusterCents樣本中心點(diǎn)
                d = distMeas(clusterCents[j,:],S[i,:])
                if d < minD:
                    minD = d
                    minIndex = j
            if sampleTag[i] != minIndex: 
                sampleTagChanged = True
            sampleTag[i] = minIndex
            SSE += minD**2
        print(clusterCents)
        plt.scatter(clusterCents[:,0].tolist(),clusterCents[:,1].tolist(),c='r',marker='^',linewidths=7)
        plt.scatter(S[:,0],S[:,1],c=sampleTag,linewidths=np.power(sampleTag+0.5, 2))
        plt.show()
        print(SSE)
        
        # 重新計(jì)算簇中心
        for i in range(k):
            ClustI = S[np.nonzero(sampleTag[:]==i)[0]]
            clusterCents[i,:] = np.mean(ClustI, axis=0)
    return clusterCents, sampleTag, SSE

if __name__=='__main__':
    samples = np.loadtxt("kmeansSamples.txt")
    clusterCents, sampleTag, SSE = kMeans(samples, 3)
    #plt.scatter(clusterCents[:,0].tolist(),clusterCents[:,1].tolist(),c='r',marker='^')
    #plt.scatter(samples[:,0],samples[:,1],c=sampleTag,linewidths=np.power(sampleTag+0.5, 2))
    plt.show()
    print(clusterCents)
    print(SSE)

kmeansSamples.txt文件如下

8.764743691132109049e+00 1.497536962729086341e+01
4.545778445909218313e+00 7.394332431706460262e+00
5.661841772908352333e+00 1.045327224311696668e+01
6.020055532521467967e+00 1.860759073162559929e+01
1.256729723000295529e+01 5.506569916803323750e+00
4.186942275051188211e+00 1.402615035721461290e+01
5.726706075832996845e+00 8.375613974148174989e+00
4.099899279500291094e+00 1.444273323355928795e+01
2.257178930021525254e+00 1.977895587652345855e+00
4.669135451288612515e+00 7.717803834787531070e-01
8.121947597697801058e+00 7.976212807755792555e-01
7.972277764807800260e-02 -1.938666197338206221e+00
8.370047062442882435e+00 1.077781799178707622e+01
6.680973199869320922e+00 1.553118858170866545e+01
5.991946943553537963e+00 1.657732863976965021e+01
5.641990155271871643e+00 1.554671013661827672e+01
-2.925147643580102041e+00 1.108844569740028163e+01
4.996949605297930752e+00 1.986732057663068707e+00
3.866584099986317025e+00 -1.752825909916766900e+00
2.626427441224858939e+00 2.208897582166075324e+01
5.656225833870900388e+00 1.477736974879376675e+01
-3.388227926726261607e-01 5.569311423852095544e+00
1.093574481611491223e+01 1.124487205516641275e+01
4.650235760178413003e+00 1.278869502885029341e+01
8.498485127403823114e+00 9.787697108749913610e+00
7.530467091751554598e+00 8.502325665434069535e+00
6.171183705302398792e+00 2.174394049079376856e+01
-9.333949569013078040e-01 1.594142490265068712e+00
-6.377004909329702542e+00 3.463894089865578341e+00
7.135980906743346175e+00 1.417794597480970609e+01

四、代碼結(jié)果分析

第一次迭代,簇中心分布不太合理(紅色三角形代表簇中心)
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
第二次迭代,簇中心重新計(jì)算,因此簇中心分布比第一次更合理
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
第3次迭代
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans
第四次迭代
kmeans聚類算法python代碼,機(jī)器學(xué)習(xí),聚類,算法,kmeans

五、K-Means庫(kù)函數(shù)

KMeans(n_clusters=8, *, init=‘k-means++’, n_init=‘k-means++’, n_init=10,max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm=‘a(chǎn)uto’)
鏈接??:??Sklearn關(guān)于K-Means的API介紹
相關(guān)輸人參數(shù)和返回值,在網(wǎng)站上有詳細(xì)介紹,建議 直接看原版文檔,這里僅介紹幾個(gè)重要參數(shù),其他內(nèi)容不再贅述。

  • init 參數(shù)提供了三種產(chǎn)生筷中心的方法:“K-means++”指定產(chǎn)生較大間距的筷中心(2.1.4節(jié));“random”指定隨機(jī)產(chǎn)生簇中心;由用戶通過(guò)一個(gè)ndarrav 數(shù)組指定初始筷中心。
  • n_init 參數(shù)指定了算法運(yùn)行次數(shù),它在不指定初始筷中心時(shí),通過(guò)多次運(yùn)行算法,最終選擇最好的結(jié)果作為輸出。
  • max iter 參數(shù)指定了一次運(yùn)行中的最大迭代次數(shù)。在大規(guī)模數(shù)據(jù)集中,算法往往要耗費(fèi)大量的時(shí)間,可通過(guò)指定迭代次數(shù)來(lái)折中耗時(shí)和效果。
  • tol 參數(shù)指定了算法收斂的國(guó)值。在大規(guī)模數(shù)據(jù)集中,算法往往難以完全收斂,即達(dá)到連續(xù)兩次相同的分筷需要耗費(fèi)很長(zhǎng)時(shí)間,可通過(guò)指定國(guó)值來(lái)折中耗時(shí)和最優(yōu)目標(biāo)。
  • algorithm 參數(shù)指定了是否采用elkan k-means 算法來(lái)簡(jiǎn)化距離計(jì)算。該算法比經(jīng)典的k-means 算法在迭代速度方面有很大的提高。但該算法不適用于稀疏的樣本數(shù)據(jù)。值“full”指定采用經(jīng)典k-means 算法。值“ellkan”指定采用 elkan k-means 算法。值“auto”自動(dòng)選擇,在稠密數(shù)據(jù)時(shí)采用 elkan k-means 算法,在稀疏數(shù)據(jù)時(shí)采用經(jīng)典k-means 算法。

六、K-Means算法時(shí)間復(fù)雜度

設(shè)樣本總數(shù)為 m,分簇?cái)?shù)為k。一次迭代過(guò)程中,以樣本與簇中心的距離計(jì)算為基本運(yùn)算,需要 m × k m \times k m×k。如果迭代次數(shù)為t(,則算法的時(shí)間復(fù)雜度是 O( m × k × t m \times k \times t m×k×t)。
算法運(yùn)行不需要增長(zhǎng)額外輔助空問(wèn),以樣本和簇中心存儲(chǔ)空間為基本空間,空間復(fù)雜度是0( m + k m+k m+k)。
由于m,k,t可認(rèn)為是常量,因此算法的時(shí)間復(fù)雜度和空間復(fù)雜度都可認(rèn)為是線性的 O ( N ) O(N) O(N) .文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-719139.html

到了這里,關(guān)于K-Means聚類算法及其python實(shí)現(xiàn)(已附上代碼至本博客)的文章就介紹完了。如果您還想了解更多內(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)文章

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

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

    Kmeans算法中,K值所決定的是在該聚類算法中,所要分配聚類的簇的多少。Kmeans算法對(duì)初始值是?較敏感的,對(duì)于同樣的k值,選取的點(diǎn)不同,會(huì)影響算法的聚類效果和迭代的次數(shù)。本文通過(guò)計(jì)算原始數(shù)據(jù)中的:手肘法、輪廓系數(shù)、CH值和DB值,四種指標(biāo)來(lái)衡量K-means的最佳聚類數(shù)

    2024年02月05日
    瀏覽(40)
  • 【聚類算法】帶你輕松搞懂K-means聚類(含代碼以及詳細(xì)解釋)

    【聚類算法】帶你輕松搞懂K-means聚類(含代碼以及詳細(xì)解釋)

    聚類是一個(gè)將數(shù)據(jù)集中 在某些方面相似的數(shù)據(jù)成員 進(jìn)行分類組織的過(guò)程,聚類就是一種發(fā)現(xiàn)這種內(nèi)在結(jié)構(gòu)的技術(shù),聚類技術(shù)經(jīng)常被稱為 無(wú)監(jiān)督學(xué)習(xí) 。 k均值聚類是最著名的劃分聚類算法,由于簡(jiǎn)潔和效率使得他成為所有聚類算法中最廣泛使用的。給定一個(gè)數(shù)據(jù)點(diǎn)集合和需要

    2024年02月01日
    瀏覽(23)
  • K-means++聚類算法(matlab實(shí)現(xiàn))

    K-means++聚類算法(matlab實(shí)現(xiàn))

    K-means++算法:K-means++算法是K-means算法的改進(jìn)版,其在選擇初始質(zhì)心時(shí)采用了一種更加聰明的方法,能夠有效地避免局部最優(yōu)解。具體來(lái)說(shuō),K-means++算法的初始質(zhì)心是根據(jù)距離數(shù)據(jù)點(diǎn)最遠(yuǎn)的原則來(lái)選擇的,這樣可以保證初始質(zhì)心的分布更加廣泛,從而使得算法更容易找到全局最

    2024年02月07日
    瀏覽(26)
  • K-means聚類算法原理及實(shí)現(xiàn)

    K-means聚類算法原理及實(shí)現(xiàn)

    1.1概念 聚類分析,也稱為分割分析或分類分析,可將樣本數(shù)據(jù)分成一個(gè)個(gè)組(即簇)。同一簇中的對(duì)象是相似的,不同簇中的對(duì)象則明顯不同。 Statistics and Machine Learning Toolbox? 提供了幾種聚類方法和相似性度量(也稱為距離度量)來(lái)創(chuàng)建簇。此外,簇計(jì)算可以按照不同的計(jì)

    2024年03月18日
    瀏覽(20)
  • Python實(shí)現(xiàn)簡(jiǎn)單k-means聚類

    Python實(shí)現(xiàn)簡(jiǎn)單k-means聚類

    目錄 1.導(dǎo)入原始數(shù)據(jù)集 ?2.首次計(jì)算中心點(diǎn) 3.進(jìn)行迭代循環(huán),不斷優(yōu)化樣本中心點(diǎn)和聚類結(jié)果 4.聚類可視化 通過(guò)手動(dòng)書寫k-means聚類算法的邏輯實(shí)現(xiàn)聚類(而非使用python內(nèi)置的sklearn) 不了解k-means聚類算法的話可以先去了解以下這種算法的原理,下面就直接進(jìn)入正題啦~ 首先我

    2024年02月03日
    瀏覽(22)
  • K-means聚類算法原理、步驟、評(píng)價(jià)指標(biāo)和實(shí)現(xiàn)

    K-means聚類算法原理、步驟、評(píng)價(jià)指標(biāo)和實(shí)現(xiàn)

    1、聚類 聚類與分類不同,聚類分析分通過(guò)分析大量含有一定規(guī)律但雜亂數(shù)據(jù),得到數(shù)據(jù)間內(nèi)在的邏輯,將雜亂的數(shù)據(jù)按照所得的數(shù)據(jù)規(guī)律劃分成不同的種類。K-measn、DBSCAN和層次是當(dāng)前廣泛使用的三種聚類方法。以下對(duì)三種方法進(jìn)行分析,選擇適合的聚類方法。 方法 K-means

    2024年02月07日
    瀏覽(52)
  • 計(jì)算機(jī)視覺:聚類算法(K-Means)實(shí)現(xiàn)圖像分割

    計(jì)算機(jī)視覺:聚類算法(K-Means)實(shí)現(xiàn)圖像分割

    什么是K-means聚類? K-means聚類是一種無(wú)監(jiān)督學(xué)習(xí)算法,用于將一組數(shù)據(jù)劃分為K個(gè)不同的類別或簇。它基于數(shù)據(jù)點(diǎn)之間的相似性度量,將數(shù)據(jù)點(diǎn)分配到最接近的聚類中心。K-means算法的目標(biāo)是最小化數(shù)據(jù)點(diǎn)與其所屬聚類中心之間的平方距離和。 K-means聚類在圖像分割中的應(yīng)用 在

    2024年02月02日
    瀏覽(27)
  • python k-means聚類算法 物流分配預(yù)測(cè)實(shí)戰(zhàn)(超詳細(xì),附源碼)

    python k-means聚類算法 物流分配預(yù)測(cè)實(shí)戰(zhàn)(超詳細(xì),附源碼)

    數(shù)據(jù)集和地圖可以點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留下QQ郵箱或者私信博主要 聚類是一類機(jī)器學(xué)習(xí)基礎(chǔ)算法的總稱。 聚類的核心計(jì)算過(guò)程是將數(shù)據(jù)對(duì)象集合按相似程度劃分成多個(gè)類,劃分得到的每個(gè)類稱為聚類的簇 聚類不等于分類,其主要區(qū)別在于聚類所面對(duì)的目標(biāo)類別是未知的

    2024年02月02日
    瀏覽(53)
  • 數(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日
    瀏覽(19)
  • 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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包