機器學習實戰 kmeans例項講解

2021-08-01 08:37:08 字數 1853 閱讀 2894

前面幾篇講了機器學習中的分類,今天講一下聚類演算法–kmeans,聚類通俗地說就是將一堆資料分成幾堆,屬性相似的在一起(物以類聚人以群分)。

kmeans的原理十分簡單,直接上步驟:

我們假定將資料分成k堆,先從資料裡面隨機選k個點作為初始質心

依次計算剩下的資料距每個質心的距離,為每個點選取距離最小的質心

這就完成了一次聚類,但是效果肯定不是很好,我們針對每個堆再計算質心,得到k個新的質心

再對所有的資料計算距每個新的質心的距離,再為每個點選取新的距離最小的質心

不停的迴圈這個過程,直到質心不再改變為止

from numpy import *

defloaddataset

(filename):

datamat=

fr=open(filename)

for line in fr.readlines():

curline=line.strip().split('\t')

fltline=map(float,curline)

return datamat

defdiseclud

(veca,vecb):

return sqrt(sum(pow(veca-vecb,2)))

defrandcent

(dataset,k):

n=shape(dataset)[1]

centroids=mat(zeros((k,n)))

for j in range(n):

l=[x[j] for x in dataset]

minj=min(l)

maxj=max(l)

rangej=float(maxj-minj)

centroids[:,j]=minj+rangej*random.rand(k,1)

return centroids

datamat=loaddataset("data/datingtestset2.txt")

centroids=randcent(datamat,4)

defkmeans

(dataset,k,distmeas=diseclud,createcent=randcent):

m=shape(dataset)[0]

clusterassment=mat(zeros((m,2)))

centroids=createcent(dataset,k)

clusterchanged=true

while clusterchanged:

clusterchanged=false

for i in range(m):

mindist=inf

minindex=-1

for j in range(k):

distji=distmeas(array(centroids[j]),dataset[i])

if distjiif clusterassment[i,0]!=minindex:

clusterchanged=true

clusterassment[i,:]=minindex,mindist**2

for cent in range(k):

l=for temp in range(m):

if clusterassment[temp,0]==cent:

print(type(l))

centroids[cent,:]=mean(l,axis=0)

return centroids,clusterassment

centroids,clusterassment=kmeans(datamat,5)

print(centroids)

機器學習實戰Kmeans

from numpy import import matplotlib.pyplot as plt import pandas as pd load dataset url names sepal length sepal width petal length petal width class d...

機器學習機器學習實戰 kmeans

簡介 聚類演算法是一種無監督學習,它將相似的物件歸類到同一簇中。聚類的方法可以應用所有的物件,簇內的物件越相似,聚類效果也就越好。聚類和分類的最大不同之處在於,分類的目標是已知的,聚類是完全無監督學習,類別沒有像分類那樣被預先定義出來,所以叫做無監督學習。kmeans演算法是實際中最常用的聚類演算法...

機器學習實戰之KMeans

from numpy import def loaddataset filename datamat fr open filename for line in fr.readlines curline line.strip split t fltline map float,curline retu...