Python: 验证 k 均值聚类
Python: validation k-means clustering
我想比较使用 sklearn
.
的 k-means 库计算的两个不同集群
from sklearn.cluster import KMeans
ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)
哪里
ya
array([0, 2, 1, 1, 2, 2, 0, 2, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 2, 2, 2,
2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2,
2, 0, 1, 0, 2, 2, 2], dtype=int32)
和
yb
array([1, 2, 0, 0, 2, 2, 1, 2, 2, 0, 1, 1, 0, 2, 1, 0, 1, 1, 1, 1, 2, 2, 2,
2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2,
2, 1, 0, 1, 2, 2, 2], dtype=int32)
集群相同,但标签不同。为了计算我所做的差异:
sm = difflib.SequenceMatcher(None,list(ya),list(yb))
sm.ratio()
但是由于标签的原因,它当然不起作用。有什么方法可以比较两个集群吗?
通常,使用 confusion matrix 评估具有已知目标的聚类。你可以在你的情况下使用它,即使它们都不是真正的目标。
如果您只想直接比较数组,您可以将一个数组的值映射到另一个数组:
ya = np.array([{0:1, 2:2, 1:0}[a] for a in ya])
我是这样解决的,可能不是很优雅,但是很管用
ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)
ya= KMeans(n_clusters=3).fit_predict(Xa)
cla = list()
m = 0
for i in range(0,3):
tmp = np.where(ya == i)
cla.append(list(tmp[0]))
cla = sort(cla)
yb= KMeans(n_clusters=3).fit_predict(Xb)
clb = list()
m = 0
for i in range(0,3):
tmp = np.where(yb == i)
clb.append(list(tmp[0]))
clb = sort(clb)
e = 0
for i in range(0,3):
sm = difflib.SequenceMatcher(None,list(cla[i]),list(clb[i]))
e += 1 - sm.ratio()
比较聚类(或聚类和 类!)的常用方法是 调整后的随机指数 (ARI)。
正好解决了簇号变化的问题
我想比较使用 sklearn
.
from sklearn.cluster import KMeans
ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)
哪里
ya
array([0, 2, 1, 1, 2, 2, 0, 2, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 2, 2, 2,
2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2,
2, 0, 1, 0, 2, 2, 2], dtype=int32)
和
yb
array([1, 2, 0, 0, 2, 2, 1, 2, 2, 0, 1, 1, 0, 2, 1, 0, 1, 1, 1, 1, 2, 2, 2,
2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2,
2, 1, 0, 1, 2, 2, 2], dtype=int32)
集群相同,但标签不同。为了计算我所做的差异:
sm = difflib.SequenceMatcher(None,list(ya),list(yb))
sm.ratio()
但是由于标签的原因,它当然不起作用。有什么方法可以比较两个集群吗?
通常,使用 confusion matrix 评估具有已知目标的聚类。你可以在你的情况下使用它,即使它们都不是真正的目标。
如果您只想直接比较数组,您可以将一个数组的值映射到另一个数组:
ya = np.array([{0:1, 2:2, 1:0}[a] for a in ya])
我是这样解决的,可能不是很优雅,但是很管用
ya = KMeans(n_clusters=3).fit_predict(Xa)
yb = KMeans(n_clusters=3).fit_predict(Xb)
ya= KMeans(n_clusters=3).fit_predict(Xa)
cla = list()
m = 0
for i in range(0,3):
tmp = np.where(ya == i)
cla.append(list(tmp[0]))
cla = sort(cla)
yb= KMeans(n_clusters=3).fit_predict(Xb)
clb = list()
m = 0
for i in range(0,3):
tmp = np.where(yb == i)
clb.append(list(tmp[0]))
clb = sort(clb)
e = 0
for i in range(0,3):
sm = difflib.SequenceMatcher(None,list(cla[i]),list(clb[i]))
e += 1 - sm.ratio()
比较聚类(或聚类和 类!)的常用方法是 调整后的随机指数 (ARI)。
正好解决了簇号变化的问题