前面幾篇講了機器學習中的分類,今天講一下聚類演算法–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...