欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用Numpy實(shí)現(xiàn)Kmeans算法的步驟詳解

 更新時(shí)間:2021年11月12日 10:35:00   作者:晴一千天  
將物理或抽象對(duì)象的集合分成由類(lèi)似的對(duì)象組成的多個(gè)類(lèi)的過(guò)程被稱(chēng)為聚類(lèi)。這篇文章主要介紹了Python使用Numpy實(shí)現(xiàn)Kmeans算法,需要的朋友可以參考下

Kmeans聚類(lèi)算法介紹:

1.聚類(lèi)概念:

將物理或抽象對(duì)象的集合分成由類(lèi)似的對(duì)象組成的多個(gè)類(lèi)的過(guò)程被稱(chēng)為聚類(lèi)。由聚類(lèi)所生成的簇是一組數(shù)據(jù)對(duì)象的集合,這些對(duì)象與同一個(gè)簇中的對(duì)象彼此相似,與其他簇中的對(duì)象相異。

2.Kmeans算法:

定義:

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

大概步驟:

  • 設(shè)置初始類(lèi)別中心和類(lèi)別數(shù)
  • 根據(jù)類(lèi)別中心對(duì)全部數(shù)據(jù)進(jìn)行類(lèi)別劃分:每個(gè)點(diǎn)分到離自己距離最小的那個(gè)類(lèi)
  • 重新計(jì)算當(dāng)前類(lèi)別劃分下每個(gè)類(lèi)的中心:例如可以取每個(gè)類(lèi)別里所有的點(diǎn)的平均值作為新的中心。如何求多個(gè)點(diǎn)的平均值? 分別計(jì)算X坐標(biāo)的平均值,y坐標(biāo)的平均值,從而得到新的點(diǎn)。注意:類(lèi)的中心可以不是真實(shí)的點(diǎn),虛擬的點(diǎn)也不影響。
  • 在新的類(lèi)別中心下繼續(xù)進(jìn)行類(lèi)別劃分;
  • 如果連續(xù)兩次的類(lèi)別劃分結(jié)果不變則停止算法; 否則循環(huán)2~5。例如當(dāng)類(lèi)的中心不再變化時(shí),跳出循環(huán)。

Kmeans距離測(cè)定方式:

歐式距離:

曼哈頓距離:

余弦相似度:

A與B表示向量(x1,y1),(x2,y2)
分子為A與B的點(diǎn)乘,分母為二者各自的L2相乘,即將所有維度值的平方相加后開(kāi)方。

3.如何確定最佳的k值(類(lèi)別數(shù)):

本文選取手肘法

手肘法:

對(duì)于每一個(gè)k值,計(jì)算它的誤差平方和(SSE):

其中N是點(diǎn)的個(gè)數(shù),Xi 是第i 個(gè)點(diǎn),ciXi 對(duì)應(yīng)的中心。

  • 隨著聚類(lèi)數(shù)k的增大,樣本劃分會(huì)更加精細(xì),每個(gè)簇的聚合程度會(huì)逐漸提高,那么誤差平方和SSE自然會(huì)逐漸變小。
  • 當(dāng)k小于真實(shí)聚類(lèi)數(shù)時(shí),由于k的增大會(huì)大幅增加每個(gè)簇的聚合程度,故SSE的下降幅度會(huì)很大,而當(dāng)k到達(dá)真實(shí)聚類(lèi)數(shù)時(shí),再增加k所得到的聚合程度回報(bào)會(huì)迅速變小,所以SSE的下降幅度會(huì)驟減,然后隨著k值的繼續(xù)增大而趨于平緩,也就是說(shuō)SSE和k的關(guān)系圖是一個(gè)手肘的形狀,而這個(gè)肘部對(duì)應(yīng)的k值就是數(shù)據(jù)的真實(shí)聚類(lèi)數(shù)

python實(shí)現(xiàn)Kmeans算法:

1.代碼如下:

import numpy as np
import matplotlib.pyplot as plt
import math
 
k = eval(input("請(qǐng)輸入想要?jiǎng)澐值念?lèi)別個(gè)數(shù)")) #規(guī)定類(lèi)別數(shù)
n = eval(input("請(qǐng)輸入要循環(huán)的次數(shù)"))#規(guī)定循環(huán)次數(shù)
sw = eval(input("請(qǐng)輸入想要查詢(xún)的元素在數(shù)據(jù)中的位置"))
 
def readdata():#獲取data數(shù)據(jù)中坐標(biāo)值
    data = np.loadtxt("E:\\Python\\Lab4\\Lab4.dat")#讀取dat數(shù)據(jù)
    x_data = data[:,0]#橫坐標(biāo)
    y_data = data[:,1]#縱坐標(biāo)
    return data,x_data,y_data
 
def init(k):#初始化生成k個(gè)隨機(jī)類(lèi)別中心
    data,x_data,y_data = readdata()
    class_center = []
    for i in range(k):
        #在數(shù)據(jù)的最大值與最小值間給出隨機(jī)值
        x = np.random.randint(np.min(x_data),np.max(x_data))
        y = np.random.randint(np.min(y_data),np.max(y_data))
        class_center.append(np.array([x,y]))#以數(shù)組方式添加,方便后面計(jì)算距離
    return class_center
 
def dist(a,b):#計(jì)算兩個(gè)坐標(biāo)間的歐氏距離
    dist = math.sqrt(math.pow((a[0] - b[0]),2) + math.pow((a[1] - b[1]),2))
    return dist
 
def dist_rank(center,data):#得到與類(lèi)中心最小距離的類(lèi)別位置索引
    tem = []
    for m in range(k):
        d = dist(data, center[m])
        tem.append(d)
    loc = tem.index(min(tem))
    return loc
 
def means(arr):#計(jì)算類(lèi)的平均值當(dāng)作類(lèi)的新中心
    sum_x,sum_y =0,0
    for n in arr:
        sum_x += n[0]
        sum_y += n[1]
    mean_x = sum_x / len(arr)
    mean_y = sum_y / len(arr)
    return [mean_x,mean_y]
 
def divide(center,data):#將每一個(gè)二維坐標(biāo)分到與之歐式距離最近的類(lèi)里
    cla_arr = [[]]
    for i in range(k-1):#創(chuàng)建與k值相同維度的空數(shù)組存取坐標(biāo)
        cla_arr.append([])
    for j in range(len(data)):
        loc = dist_rank(center,data[j])
        cla_arr[loc].append(list(data[j]))
    return cla_arr
 
def new_center(cla):#計(jì)算每類(lèi)平均值更新類(lèi)中心
    new_cen = []
    for g in range(k):
        new = means(cla[g])
        new_cen.append(new)
    return new_cen
 
def index_element(arr,data,sw):#索引第sw個(gè)元素對(duì)應(yīng)的類(lèi)別
    index = []
    for i in range(len(data)):#遍歷每一個(gè)數(shù)據(jù)
        for j in range(k):#遍歷每一個(gè)類(lèi)別
            tem = arr[j]
            for d in range(len(tem)):#遍歷類(lèi)別內(nèi)的每一個(gè)數(shù)據(jù)
                if data[i][0] == tem[d][0] and data[i][1] == tem[d][1]:#如果橫縱坐標(biāo)數(shù)值都相等
                    index.append((j + 1))#歸為j+1類(lèi)
                else:
                    continue
    return index[sw]
 
def Kmeans(n,sw):#獲取n次更新后類(lèi)別中心以及第sw個(gè)元素對(duì)應(yīng)的類(lèi)別
    data, x_data, y_data = readdata()#讀取數(shù)據(jù)
    center = init(k)  # 獲取初始類(lèi)別中心
    while n > 0:
        cla_arr = divide(center,data)# 將數(shù)據(jù)分到隨機(jī)選取的類(lèi)中心的里
        center = new_center(cla_arr)#更新類(lèi)別中心
        n -= 1
    sse1 = 0
    for j in range(k):
        for i in range(len(cla_arr[j])):  # 計(jì)算每個(gè)類(lèi)里的誤差平方
            # 計(jì)算每個(gè)類(lèi)里每個(gè)元素與元素中心的誤差平方
            dist1 = math.pow(dist(cla_arr[j][i], center[j]), 2)
            sse1 += dist1
    sse1 = sse1 / len(data)
    index = index_element(cla_arr,data,sw)
    return center,index,sse1,cla_arr
center_l, index,sse1, cla_arr = Kmeans(n,sw)
print("類(lèi)別中心為:",center_l)
print("所查元素屬于類(lèi)別:",index)
print('k值為{0}時(shí)的誤差平方和為{1}'.format(k,sse1))#format格式化占位輸出誤差平方和
 
def visualization(cla):#聚類(lèi)可視化展現(xiàn)
    cla_x = [[]]
    cla_y = [[]]
    for m in range(k-1):#創(chuàng)建與k值相同維度的空數(shù)組存取x坐標(biāo)和y坐標(biāo)
        cla_x.append([])
        cla_y.append([])
    for i in range(k):#遍歷k次讀取k個(gè)類(lèi)別
        for j in cla[i]:#遍歷每一類(lèi)存取橫縱坐標(biāo)
            cla_x[i].append(j[0])
            cla_y[i].append(j[1])
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.sans-serif']=['SimHei']#解決中文不能顯示的問(wèn)題
    plt.figure()
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title("聚類(lèi)圖")
    plt.scatter(cla_x[0],cla_y[0],c = 'r',marker = 'h')
    plt.scatter(cla_x[1], cla_y[1], c='y', marker='.')
    plt.scatter(cla_x[2], cla_y[2], c='g', marker='o')
    plt.scatter(cla_x[3], cla_y[3], c='b', marker=',')
    plt.scatter(cla_x[4], cla_y[4], c='k', marker='p')
    plt.show()
 
visualization(cla_arr)
 
def hand():#畫(huà)出手肘圖
    #sse列表是循環(huán)次數(shù)為3,改變k從2到8一個(gè)一個(gè)人工測(cè)得存入
    sse = [17.840272113687078,12.116153021227769,8.563862232332205,4.092534331364449,3.573312882789776,3.42794767600246,3.2880646083752185]
    x = np.linspace(2,8,7)#創(chuàng)建等間距大小為7的數(shù)組
    plt.xlabel("k值")#橫坐標(biāo)名稱(chēng)
    plt.ylabel("誤差平方和")#縱坐標(biāo)名稱(chēng)
    plt.title("手肘圖")#曲線(xiàn)名
    plt.plot(x,sse)#畫(huà)出曲線(xiàn)
    plt.show()
hand()

2.代碼結(jié)果展示:

聚類(lèi)可視化圖:

手肘圖:

運(yùn)行結(jié)果:

文章參考:

手肘法:K-means聚類(lèi)最優(yōu)k值的選取_qq_15738501的博客-CSDN博客_kmeans聚類(lèi)k的選取

matplotpb.pyplot.scatter散點(diǎn)圖的畫(huà)法:

PYthon——plt.scatter各參數(shù)詳解_yuanCruise-CSDN博客_plt.scatter

到此這篇關(guān)于Python使用Numpy實(shí)現(xiàn)Kmeans算法的文章就介紹到這了,更多相關(guān)Python Kmeans算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 高級(jí)變量之字典和字符串詳解

    Python 高級(jí)變量之字典和字符串詳解

    這篇文章主要為大家介紹了Python 字典和字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Python基于Socket實(shí)現(xiàn)的簡(jiǎn)單聊天程序示例

    Python基于Socket實(shí)現(xiàn)的簡(jiǎn)單聊天程序示例

    這篇文章主要介紹了Python基于Socket實(shí)現(xiàn)的簡(jiǎn)單聊天程序,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python聊天程序的客戶(hù)端與服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 基于python實(shí)現(xiàn)從尾到頭打印鏈表

    基于python實(shí)現(xiàn)從尾到頭打印鏈表

    這篇文章主要介紹了基于python實(shí)現(xiàn)從尾到頭打印鏈表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python樹(shù)的同構(gòu)學(xué)習(xí)筆記

    python樹(shù)的同構(gòu)學(xué)習(xí)筆記

    在本篇文章里小編給大家整理的是一篇關(guān)于python樹(shù)的同構(gòu)學(xué)習(xí)筆記以及相關(guān)實(shí)例代碼內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2019-09-09
  • 詳解Python中expandtabs()方法的使用

    詳解Python中expandtabs()方法的使用

    這篇文章主要介紹了詳解Python中expandtabs()方法的使用,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python利用FFT進(jìn)行簡(jiǎn)單濾波的實(shí)現(xiàn)

    Python利用FFT進(jìn)行簡(jiǎn)單濾波的實(shí)現(xiàn)

    今天小編就為大家分享一篇Python利用FFT進(jìn)行簡(jiǎn)單濾波的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python筆記之mean()函數(shù)實(shí)現(xiàn)求取均值的功能代碼

    python筆記之mean()函數(shù)實(shí)現(xiàn)求取均值的功能代碼

    這篇文章主要介紹了python筆記之mean()函數(shù)實(shí)現(xiàn)求取均值的功能代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python File readlines() 使用方法

    Python File readlines() 使用方法

    readlines() 方法用于讀取所有行(直到結(jié)束符 EOF)并返回列表,該列表可以由 Python 的 for... in ... 結(jié)構(gòu)進(jìn)行處理,如果碰到結(jié)束符 EOF 則返回空字符串,需要的朋友可以參考下
    2018-03-03
  • python logging日志模塊以及多進(jìn)程日志詳解

    python logging日志模塊以及多進(jìn)程日志詳解

    本篇文章主要介紹了python logging日志模塊以及多進(jìn)程日志詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Django跨域請(qǐng)求問(wèn)題的解決方法示例

    Django跨域請(qǐng)求問(wèn)題的解決方法示例

    這篇文章主要給大家介紹了關(guān)于Django跨域請(qǐng)求問(wèn)題解決的相關(guān)資料,文中介紹的實(shí)現(xiàn)方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里設(shè)置響應(yīng)頭,只能控制單個(gè)接口,需要的朋友可以參考下
    2018-06-06

最新評(píng)論