一、写此篇的背景
有个同学给我两篇论文
《基于聚类集成的特征选择方法研究_李玥》
《基于基聚类器对齐的聚类集成方法研究_杨康》,
基于相似度的方法跟他讲了一遍他自己复现好了,但是他觉得他的数据集有几万条,时间和空间复杂度太高,就让我帮他实现一下重标记法
二、基于重标记法聚类集成的原理与实现
原理参见这篇写的很好的博文《学习笔记2-聚类集成方法》
这里实现的的是其中的7.4.2硬标记对应法
import numpy as np
from copy import deepcopy
import pandas as pd
K = 3
sample_nums = 7
model1 = np.array([1,1,2,2,3,3,1])
model1 -= 1
model2 = np.array([2,2,3,3,1,1,2]) - 1
model3 = np.array([1,1,2,2,2,3,3]) - 1
model4 = np.array([2,3,3,2,2,1,1]) - 1
model_to_do_list = [model2, model3, model4]
model_done_list = deepcopy(model_to_do_list)
O_mat = np.zeros((K, K))
model_i = model1
for model_idx in range(len(model_to_do_list)):
for i_cls in range(K):
for j_cls in range(K):
model1_set = set(np.argwhere(model_i==i_cls).flatten())
model2_set = set(np.argwhere(model_to_do_list[model_idx]==j_cls).flatten())
O_mat[i_cls][j_cls] = len(model1_set & model2_set)
print(f"初始O_mat = \n{O_mat}")
while (O_mat == np.zeros((K, K))).sum() != K*K:
u, v = np.unravel_index(np.argmax(O_mat), O_mat.shape)
print(f"O_mat = \n{O_mat}\n, 现在的argmax坐标为(u,v)=({u},{v})")
to_modify_idx = np.argwhere(model_to_do_list[model_idx]==v)
model_done_list[model_idx][to_modify_idx] = u
O_mat[u] = 0
O_mat[:, v] = 0
bagging_mat = pd.DataFrame(data=np.array([model1, *model_done_list]))
classify_group = bagging_mat.mode().values[0]
print(classify_group)
参考:
Numpy中返回下标操作函数
TODO:留个坑,有时间把基于相似度的实现掉
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)