度量二进制列表之间的相似性

2024-09-28 01:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个二进制列表要比较。要比较每个对应值相等时的总和,并将其转换为百分比:

import numpy as np

l1 = [1,0,1]
l2 = [1,1,1]

print(np.dot(l1 , l2) / len(l1) * 100)

打印66.666

所以在这个例子中,l1和l2的亲密度是61.666。由于每个列表不太相似,因此“接近度”值减小。在

例如,使用值:

^{2}$

返回0.0

如何绘制描述l1和{}之间关系的l1和{}?有没有用这种方法来衡量二进制值之间相似性的名称?在

使用散布:

import matplotlib.pyplot as plt

plt.scatter( 'x', 'y', data=pd.DataFrame({'x': l1, 'y': l2 }))

产生:

enter image description here

但这不合理吗?在

更新:

如果两个条目都为0,这将不会影响您的“相似性”

使用下面更新的代码来计算相似度,这个更新的相似性度量在计算最终分数时包含相应的0值。在

import numpy as np

l1 = [0,0,0]
l2 = [0,1,0]

print(len([a for a in np.isclose(l1 , l2) if(a)]) / len(l1) * 100)

返回:

66.66666666666666

或者,将下面的代码与度量值normalized_mutual_info_score一起使用,对于相同或不同的列表,返回1.0,因此{}不是合适的相似性度量?在

from sklearn.metrics.cluster import normalized_mutual_info_score

l1 = [1,0,1]
l2 = [0,1,0]

print(normalized_mutual_info_score(l1 , l2))

l1 = [0,0,0]
l2 = [0,0,0]

print(normalized_mutual_info_score(l1 , l2))

印刷品:

1.0
1.0

Tags: importinfol1列表len度量asnp
2条回答

不,情节没有意义。你所做的基本上是向量之间的内积。根据这个度量,l1和{}应该是3D(在这种情况下)空间中的向量,这将度量它们是否面向相同的方向,是否具有相似的长度。输出是一个标量值,因此没有什么可绘制的。在

如果您想显示每个组件的单独贡献,您可以执行以下操作

contributions = [a==b for a, b in zip(l1, l2)]
plt.plot(list(range(len(contributions)), contributions)

但我还是不确定这是否有意义。在

import numpy as np
import matplotlib.pyplot as plt

def unpackbits(a, n):
    ''' Unpacks an integer `a` to n-length binary list. ''' 
    return [a >> i & 1 for i in range(n-1,-1,-1)]


def similarity(a, b, n):
    ''' Similarity between n-length binary lists obtained from unpacking
    the integers a and b. '''
    a_unpacked = unpackbits(a, n)
    b_unpacked = unpackbits(b, n)
    return np.sum(np.isclose(a_unpacked, b_unpacked))/n


# Plot
n = 3
x = np.arange(2**n+1)
y = np.arange(2**n+1)
xx, yy = np.meshgrid(x, x)
z = np.vectorize(similarity)(yy[:-1,:-1], xx[:-1,:-1], n)

labels = [unpackbits(i, n) for i in x]
cmap = plt.cm.get_cmap('binary', n+1)

fig, ax = plt.subplots()
pc = ax.pcolor(x, y, z, cmap=cmap, edgecolor='k', vmin = 0, vmax=1)
ax.set_xticks(x + 0.5)
ax.set_yticks(y + 0.5)
ax.set_xlim(0, 2**n)
ax.set_ylim(0, 2**n)
ax.set_xticklabels(labels, rotation=45)
ax.set_yticklabels(labels)
cbar = fig.colorbar(pc, ax=ax, ticks=[i/n for i in range(n+1)])
cbar.ax.set_ylabel('similarity', fontsize=14)
ax.set_aspect('equal', adjustable='box')
plt.tight_layout()
plt.show()

enter image description here

相关问题 更多 >

    热门问题