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...