Fraction of Same-Cell Type Transitions (FOSCTTM) 相同细胞类型转换的分数, 用于评估由一个空间(或者domain,域)转换到另一个空间的好坏程度。
例如用矩阵表示的两组点之间的相似性,一个常见的应用场景是用于细胞数据从源空间转换到目标空间后,评估转换结果的好坏。
该评估数值越小说明转换的结果越好!
原理
总体来说,对于每个域,我们计算一个固定的样本点和另一个域中的所有数据点之间的欧氏距离。接下来,我们使用这些距离来计算更接近固定样本比它的真实匹配的样本的比例。最后,我们对这两个域中的所有样本的这些值进行平均。为了完美对齐(转换),所有样本将最接近它们的真实匹配,产生的平均FOSCTTM为零。
从一个例子开始,我们有源数据:点集 A ∈ R n A \in \mathbb{R}^{n} A∈Rn, 目标数据:点集 B ∈ R n B \in \mathbb{R}^{n} B∈Rn。
我们通过一些算法,比如optimal transport(OT),将A转换到B所在的空间,得到转换后的 A ′ A^{'} A′。
然后FOSCTTM的原理是,最理想的转换下,A中的点应该与对应的目标B中的点的位置重合,即 转换后的点 A i ′ A^{'}_{i} Ai′ 和目标点 B i B_{i} Bi之间的距离 d i , i = 0 d_{i, i}=0 di,i=0,但往往我们达不到最理想的状态,即 d i , i > 0 d_{i, i} > 0 di,i>0,但如果这个距离相比于从 A ′ A^{'} A′中其他点到 B i B_{i} Bi的距离仍然是最小的,那我们也认为这是一个非常好的转换(因为这样 A ′ A^{'} A′的整体几何形状会与 B 相似。)。
那如果其他某些转换后的点 A j ′ A^{'}_{j} Aj′到 B i B_{i} Bi的距离比 d i , i d_{i, i} di,i 更近,那转换的结果就不够好了,而这样不好的点越多,转换的结果就越糟糕。 FOSCTTM就是计算有多少这样比真实匹配距离更近的错误的点的比例。
例如下图, d 1 , 1 d_{1,1} d1,1 应该是最短的,但如果 d 1 , 2 d_{1, 2} d1,2比 d 1 , 1 d_{1,1} d1,1还要小,那我们就计算 FOSCTTM=1/3。
代码实现
def foscttm(
x: np.ndarray,
y: np.ndarray,
) -> float:
d = scipy.spatial.distance_matrix(x, y) # 计算x,y之间的距离
foscttm_x = (d < np.expand_dims(np.diag(d), axis=1)).mean(axis=1) #计算对x来说有多少错误点
foscttm_y = (d < np.expand_dims(np.diag(d), axis=0)).mean(axis=0) #计算对y来说有多少错误点
fracs = []
# 下边都是给错误点数求平均
for i in range(len(foscttm_x)):
fracs.append((foscttm_x[i] + foscttm_y[i]) / 2)
return np.mean(fracs).round(4)