首先从数组中获取集合,注意集合是无序的,映射出来的类别标号可能并不是0,1,2,3,4,这样但是并不影响acc率,其次将集合转化为字典即映射列表,最后再对数据进行映射,代码如下:
def map(data):
# 获取数组中的所有值的集合
values = set(data)
# 将集合中的每个元素映射为数字
mapping_dict = {element: index for index, element in enumerate(values)}
#真实数据映射
data = [mapping_dict[element] for element in data]
return data
再给一个利用匈牙利进行对真实标签和预测标签进行映射求准确率的程序:
def cluster_acc(y_true, y_pred):
y_true = y_true.astype(np.int64)
assert y_pred.size == y_true.size
D = max(y_pred.max(), y_true.max()) + 1
w = np.zeros((D, D), dtype=np.int64)
for i in range(y_pred.size):
w[y_pred[i], y_true[i]] += 1
from scipy.optimize import linear_sum_assignment
# 匈牙利算法调整标签
ind = linear_assignment(w.max() - w)
return sum([w[i, j] for i, j in ind]) * 1.0 / y_pred.size
- linear_assignment:这个函数实际上是
linear_sum_assignment
的一个别名,在较新版本的SciPy中可能被弃用或不再直接提供。其功能与linear_sum_assignment
完全相同,都是用来处理指派问题,搞了半天才发现库更新了