機器學習 人像識別(三) K Means聚類

2021-07-26 17:35:36 字數 3778 閱讀 7585

k-means聚類是一種非監督的聚類方式,原理參看資料探勘十大演算法 | k-means。

import sys

import random

import numpy as np

from sklearn.decomposition import incrementalpca

imgnum = 10

# 幾張

knum = 2

# 分成幾類

n = 2

# 每張都是n×n

dimension = 2016

# 每張的維數

dst_dimension = 10

# 想降到的維數

bound = 10

# 前後兩次迭代結果之差小於這個時可以停止

maxrecursetime = 10

# 最多迭代次數

centroids = # 存放knum個質心的n維座標向量

last_centroids = # 上一次遞迴得到的質心座標們

ori_dots = # 存放每個點的n維座標向量

dots = # 降維之後的點的座標

clusters = # 存放每個類中有哪些點, clusters[i]中存放的是第i類中的點的下標,第i類的中心是centroids[i]

selected =

distance = lambda v: np.linalg.norm(v)

# 初始化點的座標,並進行降維,返回降維後的向量集

definitdots

():# 讀入imgnum個點的座標,存放在dots當中

for i in range(imgnum):

# 讀入向量集並降維

readfiles(ori_dots)

return pca(ori_dots)

# 初始化質心資訊

definitcentroids

():# 初始化質心資訊

for i in range(knum):

centroids[i] = np.array([float(0)] * dimension) # 初始化為全零

# 隨機挑選初始時的『質心』座標

for i in range(knum):

_ = random.randrange(imgnum)

while _ in selected:

_ = random.randrange(imgnum)

selected.sort()

print('selected:' , selected)

for i in range(knum):

centroids[i] = dots[selected[i]]

print('centroids 0:', centroids)

# 讀入imgnum個圖的座標向量

defreadfiles

(dots):

path = r'c:\users\owner\documents\visual studio 2015\projects\python\k-means\k-means\\'

fd = open(path + 'input.txt', 'r')

_ = fd.read() # 一次讀進所有

fd.close()

_ = _.split()

for i in range(len(_)):

tmp = [2, 5]

for i in tmp:

for j in range(len(dots[i])):

dots[i][j] *= 0.9

# 降維操作

defpca

(dots):

x = np.array(dots)

ipca = incrementalpca(n_components = dst_dimension)

ipca.fit(x)

y = ipca.transform(x)

print('y = ', y, '\n')

for i in range(len(y)):

y[i] = np.array(y[i])

return y

# 對於每個cluster,計算質心

defcalccentroids

(knum, dimension, centroids, dots, clusters):

# 先把上一次得到的質心存放到last_centroids當中

last_centroids = centroids

# centroids = 這會導致傳不回去

for i in range(knum):

v = np.array([float(0)] * dst_dimension)

for _ in clusters[i]:

v += dots[_]

l = len(clusters[i])

centroids[i] = (v / l)

# 聚類,判斷每個點屬於哪個類

defcluster

(imgnum, knum, dots, clusters):

# 清空原有資料

for i in range(knum):

clusters[i] =

# 計算每個點到每個質心的距離,並將他們放到相應的cluster中

for i in range(imgnum):

store = # 存放當前的點到每個質心的距離

for j in range(knum):

cluster_index = store.index(min(store)) # store中最小的數是min(store),找這個最小數的下標用store.index()

dots = initdots()

initcentroids()

temp = sys.stdout

log_root = r'c:\users\owner\documents\visual studio 2015\projects\python\k-means\k-means\log_'+str(dst_dimension)+'\\'

sys.stdout = open(log_root + str(selected) + '.txt','w')

for i in range(bound):

print('round ' + str(i) + ': ')

print('centroids: ', centroids)

cluster(imgnum, knum, dots, clusters)

print('clusters', clusters, '\n')

calccentroids(knum, dimension, centroids, dots, clusters)

print('centroids: ', centroids)

print('clusters: ', clusters)

sys.stdout = temp

計算兩點之間的歐氏距離可以用numpy庫中的函式:

dist = numpy.linalg.norm(vec1 - vec2)

經常發現round 2之後,質心就不再變了。對此,我心中不太踏實,踟躕於聚類速度是否當真如此之快。不過資料集這樣小,結果也正確,姑且將此歸功於k-means的有效性吧。

在閱讀log文件時,發現編號為2和5的圖總是被歸到一組,然而恢復出灰度圖後,發現這兩張圖並不是乙個人,但有乙個共同點——色調較暗。因此在讀入資料後,將這兩張圖的灰度值乘了係數0.9,之後聚類結果就基本穩定了。

機器學習 kmeans

1 手寫kemeans 流程 手寫 f 桌面 rna seq1 leetcode 10 面試真題 6 位元組跳動 手寫kmeans.py 2 k 如何確定 t sne視覺化和手肘法,k值所決定的是在該聚類演算法中,所要分配聚類的簇的多少,kmeans 演算法對初始值敏感,相同的k,選的點不同,會影響...

機器學習 K means

這個演算法主要是乙個迭代的過程 1.在乙個資料集中隨機選擇k個聚類中心 2.按照離各個聚類中心的遠近來將資料集中的資料劃分到各個分類中。3.將各個分類中資料點的平均座標來作為新的聚類中心 一直重複2 3過程直到各個分類中的資料點的平均座標正好等於聚類中心的座標為止。k means演算法也有可能會出現...

機器學習 K means實踐

這兩天跟著 機器學習實戰 那本書學習了一下聚類方法中的k means演算法。在本篇文章中主要介紹下實踐中遇到的問題以及演算法的主要思想。ok,here we go!k means演算法思想 我們在日常生活中經常會遇到將某些相似的事物進行聚類,而如何讓計算機幫助我們進行自動的分類呢?k means是經...