K 均值聚類演算法

2021-08-09 19:47:58 字數 2534 閱讀 9587

from numpy import *

#建立元組

dataset =

#與我們所熟悉的矩陣類似,最終我們將獲得n*2的矩陣,

filein = open("/home/zengxl/pycharmprojects/test3/機器學習實戰**/ch10/testset.txt") #是正斜槓

for line in filein.readlines():

temp=

linearr = line.strip().split('\t') #line.strip()把末尾的'\n'去掉

filein.close()

dataset = mat(dataset) #mat()函式是numpy中的庫函式,將陣列轉化為矩陣

#函式eucldistance()計算兩個向量的歐式距離

def eucldistance(vector1, vector2):

return sqrt(sum(power(vector2 - vector1, 2))) #使用了sqrt。

#在樣本集中隨機選取k個樣本點作為初始質心

def initcentroids(dataset, k):

numsamples, dim = dataset.shape #矩陣的行數、列數

centroids = mat(zeros((k, dim))) #mat函式建立k行n列的矩陣,centroids存放簇中心

for i in range(k):

index = int(random.uniform(0, numsamples)) #uniform()隨機生成乙個[x, y)範圍內實數,然後將其轉化為int型

centroids[i, :] = dataset[index, :]

return centroids

#k為將dataset矩陣中的樣本分成k個類,資料集及簇的數目是必選引數。

def kmeans(dataset, k):

numsamples = dataset.shape[0] #讀取矩陣dataset的第一維度的長度,即獲得有多少個樣本資料

# clusterassment建立乙個m行2列的矩陣,第一列存放索引值,第二列存放誤差,誤差用來評價聚類效果

clusterassment = mat(zeros((numsamples, 2))) #得到乙個n*2的零矩陣

#標誌變數clusterchanged,如果該值為true,則繼續迭代。

clusterchanged = true

## step 1: init centroids

centroids = initcentroids(dataset, k) #樣本集中隨機選取k個樣本點作為初始質心

while clusterchanged:

clusterchanged = false

## for each sample

for i in range(numsamples): #range

mindist = 100000.0#或者inf為正無窮大

minindex = 0 #建立索引

#計算每個樣本點與質點之間的距離,將其歸內到距離最小的那一簇

for j in range(k):

# 尋找最近的質心

distance = eucldistance(centroids[j, :], dataset[i, :])#計算每個點到質心的歐氏距離

if distance < mindist:

mindist = distance

minindex = j

#如果任一點的簇分配結果發生改變,則更新clusterchanged標誌。

if clusterassment[i, 0] != minindex:

clusterchanged = true

clusterassment[i, :] = minindex, mindist**2 #兩個**表示的是mindist的平方

## 更新質心的位置

for j in range(k):

#clusterassment[:,0].a==j是找出矩陣clusterassment中第一列元素中等於j的行的下標,返回的是乙個以array的列表,第乙個array為等於j的下標

pointsincluster = dataset[nonzero(clusterassment[:, 0].a == j)[0]] #將dataset矩陣中相對應的樣本提取出來

centroids[j, :] = mean(pointsincluster, axis = 0) #計算標註為j的所有樣本的平均值

print ('congratulations, cluster complete!')

return centroids, clusterassment

mycentroids, clustassing = kmeans(dataset, 4)

print("mycentroids:", mycentroids)

print("clustassing", clustassing)

k均值聚類演算法

輸入 簇的數目k和包含n個物件的資料庫。輸出 k個簇,使平方誤差準則最小。演算法步驟 1.為每個聚類確定乙個初始聚類中心,這樣就有k 個初始聚類中心。2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類 3.使用每個聚類中的樣本均值作為新的聚類中心。4.重複步驟2.3直到聚類中心不再變化。5.結束,...

K 均值聚類演算法

k means演算法是最簡單的一種聚類演算法。演算法的目的是使各個樣本與所在類均值的誤差平方和達到最小 這也是評價k means演算法最後聚類效果的評價標準 k means聚類演算法的一般步驟 初始化。輸入基因表達矩陣作為物件集x,輸入指定聚類類數n,並在x中隨機選取n個物件作為初始聚類中心。設定迭...

聚類,K 均值演算法

聚類是將資料集中的樣本劃分為若干個不相交的子集,每個子集稱為乙個 簇 通過這樣的劃分可能對應於一些潛在的類別。聚類即能作為乙個單獨過程,用於尋找資料內在的分布結構,也可作為分類等學習任務的前驅過程。聚類的過程通常會把一些具有相似特徵或者潛在聯絡的樣本劃分為乙個簇,那麼應該怎樣劃分簇呢,k means...