機器學習實戰Kmeans

2021-08-30 14:01:35 字數 4598 閱讀 6270

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']

dataset = pd.read_csv(url, names=names)

dataset['class'][dataset['class']=='iris-setosa']=0

dataset['class'][dataset['class']=='iris-versicolor']=1

dataset['class'][dataset['class']=='iris-virginica']=2

#算距離

def disteclud(veca, vecb): #兩個向量間歐式距離

return sqrt(sum(power(veca - vecb, 2))) #la.norm(veca-vecb)

def randchosencent(dataset,k):

# 樣本數

m=shape(dataset)[0]

# 初始化列表

centroidsindex=

#生成類似於樣本索引的列表

dataindex=list(range(m))

for i in range(k):

#生成隨機數

randindex=random.randint(0,len(dataindex))

#將隨機產生的樣本的索引放入centroidsindex

#刪除已經被抽中的樣本

del dataindex[randindex]

#根據索引獲取樣本

centroids = dataset.iloc[centroidsindex]

return mat(centroids)

def kmeans(dataset, k):

# 樣本總數

m = shape(dataset)[0]

# 分配樣本到最近的簇:存[簇序號,距離的平方]

# m行 2 列

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

# step1:

# 通過隨機產生的樣本點初始化聚類中心

centroids = randchosencent(dataset, k)

print('最初的中心=', centroids)

# 標誌位,如果迭代前後樣本分類發生變化值為tree,否則為false

clusterchanged = true

# 檢視迭代次數

itertime = 0

# 所有樣本分配結果不再改變,迭代終止

while clusterchanged:

clusterchanged = false

# step2:分配到最近的聚類中心對應的簇中

for i in range(m):

# 初始定義距離為無窮大

mindist = inf

# 初始化索引值

minindex = -1

# 計算每個樣本與k個中心點距離

for j in range(k):

# 計算第i個樣本到第j個中心點的距離

distji = disteclud(centroids[j, :], dataset.values[i, :])

# 判斷距離是否為最小

if distji < mindist:

# 更新獲取到最小距離

mindist = distji

# 獲取對應的簇序號

minindex = j

# 樣本上次分配結果跟本次不一樣,標誌位clusterchanged置true

if clusterassment[i, 0] != minindex:

clusterchanged = true

clusterassment[i, :] = minindex, mindist ** 2 # 分配樣本到最近的簇

itertime += 1

sse = sum(clusterassment[:, 1])

print('the sse of %d' % itertime + 'th iteration is %f' % sse)

# step3:更新聚類中心

for cent in range(k): # 樣本分配結束後,重新計算聚類中心

# 獲取該簇所有的樣本點

ptsinclust = dataset.iloc[nonzero(clusterassment[:, 0].a == cent)[0]]

# 更新聚類中心:axis=0沿列方向求均值。

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

return centroids, clusterassment

def kmeanssse(dataset,k,distmeas=disteclud, createcent=randchosencent):

m = shape(dataset)[0]

#分配樣本到最近的簇:存[簇序號,距離的平方]

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

#step1:#初始化聚類中心

centroids = createcent(dataset, k)

print('initial centroids=',centroids)

sseold=0

ssenew=inf

itertime=0 #檢視迭代次數

while(abs(ssenew-sseold)>0.0001):

sseold=ssenew

#step2:將樣本分配到最近的質心對應的簇中

for i in range(m):

mindist=inf;minindex=-1

for j in range(k):

#計算第i個樣本與第j個質心之間的距離

distji=distmeas(centroids[j,:],dataset.values[i,:])

#獲取到第i樣本最近的質心的距離,及對應簇序號

if distjilen(marksamples):

print('sorry,your k is too large,please add length of the marksample!')

return 1

# 繪所有樣本

for i in range(num):

markindex =int(clusterassment[i, 0]) # 矩陣形式轉為int值, 簇序號

# 特徵維對應座標軸x,y;樣本圖形標記及大小

plt.plot(dataset.iat[i, 0], dataset.iat[i, 1], marksamples[markindex], markersize=6)

# 繪中心點

markcentroids = ['o', '*', '^'] # 聚類中心圖形標記

label = ['0', '1', '2']

c = ['yellow', 'pink', 'red']

for i in range(k):

plt.plot(centroids[i, 0], centroids[i, 1], markcentroids[i], markersize=15, label=label[i], c=c[i])

plt.legend(loc='upper left')

plt.xlabel('sepal length')

plt.ylabel('sepal width')

plt.title('k-means cluster result') # 標題

plt.show()

if __name__=='__main__':

#*****kmeans聚類

# # #獲取樣本資料

datamat=dataset.loc[:, ['sepal-length','sepal-width']]

#真實的標籤

labels=dataset.loc[:, ['class']]

# #原始資料顯示

originaldatashow(datamat)

# #*****kmeans聚類

k=3 #使用者定義聚類數

# mycentroids,clusterassment=kmeans(datamat,k)

# 樣本

# mycentroids,clusterassment=kmeanssse(datamat,k)

mycentroids, clusterassment =bikmeans(datamat, k)

# 繪圖顯示

datashow(datamat,k,mycentroids,clusterassment)

trgartshow(datamat, 3, labels)

本文包括kmean,以及改進的二分法kmean對鳶尾花資料集的劃分

參考:

機器學習機器學習實戰 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...

學習筆記 機器學習實戰 Kmeans

kmeans演算法注釋版,新手小白,如有錯誤,還請不吝指教 kmeans演算法 def kmeans dataset,k dataset mat dataset 轉換成mat型別 m shape dataset 0 獲取資料集的行數 第一列記錄資料集的類別,第二列記錄資料集到聚類中心的距離 clus...