最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python機器學習算法之k均值聚類(k-means)

 更新時間:2021年09月10日 15:32:29   作者:飛羽喂馬  
這篇文章主要為大家詳細介紹了Python機器學習算法之k均值聚類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一開始的目的是學習十大挖掘算法(機器學習算法),并用編碼實現(xiàn)一遍,但越往后學習,越往后實現(xiàn)編碼,越發(fā)現(xiàn)自己的編碼水平低下,學習能力低。這一個k-means算法用Python實現(xiàn)竟用了三天時間,可見編碼水平之低,而且在編碼的過程中看了別人的編碼,才發(fā)現(xiàn)自己對numpy認識和運用的不足,在自己的代碼中有很多可以優(yōu)化的地方,比如求均值的地方可以用mean直接對數(shù)組求均值,再比如去最小值的下標,我用的是argsort排序再取列表第一個,但是有argmin可以直接用啊。下面的代碼中這些可以優(yōu)化的并沒有改,這么做的原因是希望做到拋磚引玉,歡迎大家丟玉,如果能給出優(yōu)化方法就更好了

一.k-means算法

人以類聚,物以群分,k-means聚類算法就是體現(xiàn)。數(shù)學公式不要,直接用白話描述的步驟就是:

1.隨機選取k個質(zhì)心(k值取決于你想聚成幾類)
2.計算樣本到質(zhì)心的距離,距離質(zhì)心距離近的歸為一類,分為k類
3.求出分類后的每類的新質(zhì)心
4.判斷新舊質(zhì)心是否相同,如果相同就代表已經(jīng)聚類成功,如果沒有就循環(huán)2-3直到相同

用程序的語言描述就是:

1.輸入樣本
2.隨機去k個質(zhì)心
3.重復下面過程知道算法收斂:

計算樣本到質(zhì)心距離(歐幾里得距離)
樣本距離哪個質(zhì)心近,就記為那一類
計算每個類別的新質(zhì)心(平均值)

二.需求分析

數(shù)據(jù)來源:從國際統(tǒng)計局down的數(shù)據(jù),數(shù)據(jù)為城鄉(xiāng)居民家庭人均收入及恩格爾系數(shù)(點擊這里下載)

數(shù)據(jù)描述:

1.橫軸:城鎮(zhèn)居民家庭人均可支配收入和農(nóng)村居民家庭人均純收入,
2.縱軸:1996-2012年。
3.數(shù)據(jù)為年度數(shù)據(jù)

需求說明:我想把這數(shù)據(jù)做個聚類分析,看人民的收入大概經(jīng)歷幾個階段(感覺我好高大上?。?/p>

需求分析:

1.由于樣本數(shù)據(jù)有限,就兩列,用k-means聚類有很大的準確性
2.用文本的形式導入數(shù)據(jù),結果輸出聚類后的質(zhì)心,這樣就能看出人民的收入經(jīng)歷了哪幾個階段

三.Python實現(xiàn)

引入numpy模塊,借用其中的一些方法進行數(shù)據(jù)處理,上代碼:

# -*- coding=utf-8 -*-

"""
authon:xuwf
created:2017-02-07
purpose:實現(xiàn)k-means算法
"""

import numpy as np
import random

'''裝載數(shù)據(jù)'''
def load():
 data=np.loadtxt('data\k-means.csv',delimiter=',')
 return data

'''計算距離'''
def calcDis(data,clu,k):
 clalist=[] #存放計算距離后的list
 data=data.tolist() #轉(zhuǎn)化為列表
 clu=clu.tolist()
 for i in range(len(data)):
  clalist.append([])
  for j in range(k):
   dist=round(((data[i][1]-clu[j][0])**2+(data[i][2]-clu[j][1])**2)*0.05,1)
   clalist[i].append(dist)
 clalist=np.array(clalist) #轉(zhuǎn)化為數(shù)組
 return clalist

'''分組'''
def group(data,clalist,k):
 grouplist=[] #存放分組后的集群
 claList=clalist.tolist()
 data=data.tolist()
 for i in range(k):
  #確定要分組的個數(shù),以空列表的形式,方便下面進行數(shù)據(jù)的插入
  grouplist.append([])
 for j in range(len(clalist)):
  sortNum=np.argsort(clalist[j])
  grouplist[sortNum[0]].append(data[j][1:])
 grouplist=np.array(grouplist)
 return grouplist

'''計算質(zhì)心'''
def calcCen(data,grouplist,k):
 clunew=[]
 data=data.tolist()
 grouplist=grouplist.tolist()
 templist=[]
 #templist=np.array(templist)
 for i in range(k):
  #計算每個組的新質(zhì)心
  sumx=0
  sumy=0
  for j in range(len(grouplist[i])):
   sumx+=grouplist[i][j][0]
   sumy+=grouplist[i][j][1]
  clunew.append([round(sumx/len(grouplist[i]),1),round(sumy/len(grouplist[i]),1)])
 clunew=np.array(clunew)
 #clunew=np.mean(grouplist,axis=1)
 return clunew

'''優(yōu)化質(zhì)心'''
def classify(data,clu,k):
 clalist=calcDis(data,clu,k) #計算樣本到質(zhì)心的距離
 grouplist=group(data,clalist,k) #分組
 for i in range(k):
  #替換空值
  if grouplist[i]==[]:
   grouplist[i]=[4838.9,1926.1]
 clunew=calcCen(data,grouplist,k)
 sse=clunew-clu
 #print "the clu is :%r\nthe group is :%r\nthe clunew is :%r\nthe sse is :%r" %(clu,grouplist,clunew,sse)
 return sse,clunew,data,k 

if __name__=='__main__':
 k=3 #給出要分類的個數(shù)的k值
 data=load() #裝載數(shù)據(jù)
 clu=random.sample(data[:,1:].tolist(),k) #隨機取質(zhì)心
 clu=np.array(clu)
 sse,clunew,data,k=classify(data,clu,k)
 while np.any(sse!=0):
  sse,clunew,data,k=classify(data,clunew,k)
 clunew=np.sort(clunew,axis=0)
 print "the best cluster is %r" %clunew


四.測試

直接運行程序就可以,k值可以自己設置,會發(fā)現(xiàn)k=3的時候結果數(shù)據(jù)是最穩(wěn)定的,這里我就不貼圖了
需要注意的是上面的代碼里面主函數(shù)里的數(shù)據(jù)結構都是array,但是在每個小函數(shù)里就有可能轉(zhuǎn)化成了list,主要原因是需要進行array的一下方法進行計算,而轉(zhuǎn)化為list的原因是需要向數(shù)組中插入數(shù)據(jù),但是array做不到?。ㄖ辽傥覜]找到怎么做)。于是這里就出現(xiàn)了一個問題,那就是數(shù)據(jù)結構混亂,到最后我調(diào)試了半天,干脆將主函數(shù)的數(shù)據(jù)結構都轉(zhuǎn)化成array,在小函數(shù)中輸入的array,輸出的時候也轉(zhuǎn)化成了array,這樣就清晰多了

五.算法分析

單看這個算法還是較好理解的,但是算法的目的是聚類,那就要考慮到聚類的準確性,這里聚類的準確性取決于k值、初始質(zhì)心和距離的計算方式。

  • k值就要看個人經(jīng)驗和多次試驗了,算法結果在哪個k值的時候更穩(wěn)定就證明這個分類更加具有可信度,其中算法結果的穩(wěn)定也取決于初始質(zhì)心的選擇
  • 初始質(zhì)心一般都是隨機選取的,怎么更準確的選擇初始質(zhì)心呢?有種較難實現(xiàn)的方法是將樣本中所有點組合起來都取一遍,然后計算算法收斂后的所有質(zhì)心到樣本的距離之和,哪個距離最小,哪個的聚類就最為成功,相對應的初始質(zhì)心就選取的最為準確。但是這種方法有很大的計算量,如果樣本很大,維度很多,那就是讓電腦干到死的節(jié)奏
  • 距離的計算方式取決于樣本的特征,有很多的選擇,入歐式距離,夾角余弦距離,曼哈頓距離等,具體的數(shù)據(jù)特性用具體的距離計算方式

六.項目評測

1.項目總結數(shù)據(jù)源的數(shù)據(jù)很干凈,不需要進行過多的數(shù)據(jù)清洗和數(shù)據(jù)降噪,數(shù)據(jù)預處理的工作成本接近為0。需求基本實現(xiàn)
2.還能做什么:可以用計算最小距離之和的方法求出最佳k值,這樣就可以得到穩(wěn)定的收入階梯;可以引入畫圖模塊,將數(shù)據(jù)結果進行數(shù)據(jù)可視化,顯得更加直觀;如果可能應該引入更多的維度或更多的數(shù)據(jù),這樣得到的聚類才更有說服力。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python操作MySQL數(shù)據(jù)庫的兩種方式實例分析【pymysql和pandas】

    Python操作MySQL數(shù)據(jù)庫的兩種方式實例分析【pymysql和pandas】

    這篇文章主要介紹了Python操作MySQL數(shù)據(jù)庫的兩種方式,結合實例形式分析了Python使用pymysql和pandas模塊進行mysql數(shù)據(jù)庫的連接、增刪改查等操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • python滑塊驗證碼的破解實現(xiàn)

    python滑塊驗證碼的破解實現(xiàn)

    這篇文章主要介紹了python滑塊驗證碼的破解實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • windows系統(tǒng)上通過whl文件安裝triton模塊的簡單步驟

    windows系統(tǒng)上通過whl文件安裝triton模塊的簡單步驟

    這篇文章主要介紹了在Windows系統(tǒng)中通過.whl文件安裝Triton的步驟,包括確認系統(tǒng)環(huán)境、下載合適的.whl文件、使用pip安裝、驗證安裝、使用Triton以及解決潛在問題,需要的朋友可以參考下
    2025-01-01
  • Python實現(xiàn)掃描局域網(wǎng)活動ip(掃描在線電腦)

    Python實現(xiàn)掃描局域網(wǎng)活動ip(掃描在線電腦)

    這篇文章主要介紹了Python實現(xiàn)掃描局域網(wǎng)活動ip(掃描在線電腦),本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • Python中的字符串類型基本知識學習教程

    Python中的字符串類型基本知識學習教程

    這篇文章主要介紹了Python中的字符串類型基本知識學習教程,包括轉(zhuǎn)義符和字符串拼接以及原始字符串等基礎知識講解,需要的朋友可以參考下
    2016-02-02
  • Pandas的Apply函數(shù)具體使用

    Pandas的Apply函數(shù)具體使用

    這篇文章主要介紹了Pandas的Apply函數(shù)具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Python中用max()方法求最大值的介紹

    Python中用max()方法求最大值的介紹

    這篇文章主要介紹了Python中用max()方法求最大值的介紹,是Python入門中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • python入門學習之自帶help功能初步使用示例

    python入門學習之自帶help功能初步使用示例

    這篇文章主要為大家介紹了python入門學習自帶help功能初步使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • python實時監(jiān)控cpu小工具

    python實時監(jiān)控cpu小工具

    這篇文章主要為大家詳細介紹了python實時監(jiān)控cpu的小工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 基于PyQT5制作一個桌面摸魚工具

    基于PyQT5制作一個桌面摸魚工具

    這篇文章主要介紹了如何利用PyQT5制作一個桌面摸魚工具,利用摸魚,打開小說,可實行完美摸魚,實時保存進度,快來跟隨小編一起動手試一試吧
    2022-02-02

最新評論

澄城县| 合作市| 噶尔县| 平陆县| 九寨沟县| 延庆县| 扎兰屯市| 商水县| 惠东县| 东阿县| 当阳市| 定南县| 神农架林区| 烟台市| 客服| 达孜县| 德保县| 雷州市| 奉节县| 灌云县| 衡水市| 乐至县| 孝义市| 万宁市| 黑山县| 电白县| 阿坝县| 宁南县| 徐闻县| 连平县| 灵宝市| 沿河| 贺州市| 珠海市| 航空| 浦城县| 广南县| 霸州市| 额济纳旗| 建湖县| 磴口县|