time is always too short for those who need it, but for those who love, it lasts forever. —dracula untold
近鄰聚類法同樣是一種基於距離閾值的聚類演算法。
# coding=utf-8
# 近鄰聚類演算法的python實現
# 資料集形式data=[,,...,]
# 聚類結果形式result=[[,,...],[,,...],...]
# 其中為乙個模式樣本,[,,...]為乙個聚類
from max_min_cluster import get_distance, classify
defknn_cluster
(data, t):
# data:資料集,t:距離閾值
# 演算法描述中的介紹的是在尋找聚類中心的同時進行聚類,本次實現中並未採取這種方式,
# 原因是同時進行的話要既要考慮聚類中心,又要考慮某個類,實現較為麻煩,
# 此次採取與上次最大最小距離演算法相同的方式,先尋找聚類中心,再根據最近鄰原則分類,
# 兩種方式實現效果是相同的,同時又可以直接利用最大最小距離聚類演算法中寫好的classify()分類方法
zs = [data[0]] # 聚類中心集,選取第乙個模式樣本作為第乙個聚類中心z1
# 計算聚類中心
get_clusters(data, zs, t)
# 分類
result = classify(data, zs, t)
return result
defget_clusters
(data, zs, t):
for adata in data:
min_distance = get_distance(adata, zs[0])
for i in range(0, len(zs)):
distance = get_distance(adata, zs[i])
if distance < min_distance:
min_distance = distance
if min_distance > t:
# data = [[0, 0], [3, 8], [1, 1], [2, 2], [5, 3], [4, 8], [6, 3], [5, 4], [6, 4], [7, 5]]
# t = 4.5
# result = knn_cluster(data, t)
# for i in range(len(result)):
# print "----------第" + str(i+1) + "個聚類----------"
# print result[i]
# 列印結果:
# ----------第1個聚類----------
# [[0, 0], [1, 1], [2, 2]]
# ----------第2個聚類----------
# [[3, 8], [4, 8]]
# ----------第3個聚類----------
# [[5, 3], [6, 3], [5, 4], [6, 4], [7, 5]]
注:演算法描述中的介紹的是在尋找聚類中心的同時進行聚類,本次實現中並未採取這種方式,原因是若同時進行的話要既要考慮聚類中心集合的表現形式,又要考慮某個聚類的表現形式,總體來說,資料表示形式較為麻煩。此次實現採取與上次最大最小距離聚類演算法相同的方式:先尋找聚類中心,再根據最近鄰原則分類,兩種方式實現效果是相同的,同時又可以直接利用最大最小距離聚類演算法中寫好的classify()分類方法。 K近鄰聚類演算法
隨機選擇k個聚類中心,在每一次迭代中,先為每個點確定其最近的聚類中心,這一步稱為集群分配 cluster assignment 然後計算每個類中所有點的中心點,將該類的聚類中心移動到中心點,這一步稱為中心移動 move centroid 得到這k個聚類中心的新位置,進行下一次迭代,直到每個聚類中心點...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...
聚類演算法 什麼是聚類
聚類分析或聚類演算法就是通過一些方法或手段使資料集集聚成不同的類別,或者叫 簇。簇內部每乙個單位都是相似的。簇與簇之間都是不相似的。但是聚類其實是一種思想,它不是一種具體的方法。這裡千萬不要搞混。但是可以實現聚類的演算法有很多種。我們通常就使用這些演算法來實現聚類的。比如 k means就是最為經典...