相似度计算¶
计算 DNA 序列之间的 k-mer、指纹和 sketch 相似度,并生成批量相似度矩阵及参考库相似度结果。
1) k-mer相似度¶
- 作用: 把序列转换为 k-mer 集合或计数向量,计算 Jaccard、Containment 或 Cosine 相似度,用于量化局部组成的重合程度;也可比较两组序列的平均相似度。
-
计算方法: 单条对单条时,对 k-mer 集合计算交并比/包含率,或对计数向量计算余弦相似度。输入多条序列时,逐条比较左侧每条序列与右侧所有序列,
value为全部配对分数的算术平均:sum(sim(query, reference)) / (查询数 × 参考数)。这不是每条查询的最近邻分数。 -
API:
dnakit.similarity.kmer_similarity(left[必须], right[必须], k[必须], metric[可选], mode[可选], canonical[可选], overlapping[可选], zero_vector_policy[可选], max_pairwise_comparisons[可选])、dnakit.similarity.kmer_vector_similarity(left[必须], right[必须], metric[可选], mode[可选], zero_vector_policy[可选])。 -
输入:
left为查询序列,right为参考序列;两侧均可用单条DNASequence/DNARecord、DNA([...])、DNASet或由DNASequence/DNARecord组成的列表。集合不能为空。必填k;可选 metric、set/count、canonical、重叠及零向量策略。默认最多计算 1,000,000 对,可用max_pairwise_comparisons调整。 -
输出: 返回
SimilarityResult。单条对单条时保留原有components["shared_weight"]等字段;多序列时value为整体平均,components["query_means"]按查询顺序给出各自与全部参考序列的平均分,并包含query_count、reference_count、pair_count。 -
示例代码:
from dnakit import DNASequence
from dnakit.similarity import kmer_similarity
result = kmer_similarity(DNASequence("AAA"), DNASequence("AAC"), k=1)
print(result.value, result.components["shared_weight"])
- 示例结果:
- 多序列示例:
from dnakit import DNA
from dnakit.similarity import kmer_similarity
queries = DNA(["AAAA", "GGGG"])
references = DNA(["AAAA", "AAAT"])
result = kmer_similarity(queries, references, k=2)
print(result.value, result.components["query_means"])
2) 指纹相似度¶
- 作用: 比较两个 schema 一致的 DNA 指纹或数值向量,计算 Tanimoto、Jaccard、Cosine 或数值距离,返回可用于排序、聚类和阈值判断的分数。
-
计算方法: 先校验两侧 schema 相同,再按所选位集合或数值向量公式比较。
-
API:
dnakit.similarity.fingerprint_similarity(left[必须], right[必须], metric[可选], weights[可选], zero_vector_policy[可选])。 -
输入: 必填两个同构指纹/向量;可选 metric、特征权重和零向量策略。
-
输出: 返回
SimilarityResult,包含相似度数值value和比较方法method。 -
示例代码:
from dnakit.similarity import fingerprint_similarity
result = fingerprint_similarity((1.0, 1.0), (1.0, 0.0), metric="tanimoto")
print(result.value)
- 示例结果:
3) Sketch相似度¶
- 作用: 比较两个 MinHash/FracMinHash Sketch 中保留的哈希值,近似估计 Jaccard 或 Containment,并报告兼容性参数,适合大序列快速比较。
-
计算方法: 先检查 k、seed 和抽样参数兼容,再用共享哈希估计集合交并比或包含率。
-
API:
dnakit.fingerprints.minhash(value[必须], k[必须], num_hashes[可选], canonical[可选], seed[可选], max_hashes[可选], max_unique_hashes[可选])、dnakit.fingerprints.fracminhash(value[必须], k[必须], scaled[可选], canonical[可选], seed[可选], max_hashes[可选], max_unique_hashes[可选]),以及dnakit.similarity.sketch_similarity(left[必须], right[必须], metric[可选], min_shared_hashes[可选])。 -
输入: 必填两个兼容 sketch;可选 metric 和最少共享 hash 数。
-
输出:
minhash/fracminhash返回SketchResult;sketch_similarity返回SketchSimilarityResult,包含相似度value和共享哈希数。 -
示例代码:
from dnakit import DNASequence
from dnakit.fingerprints import minhash
from dnakit.similarity import sketch_similarity
left = minhash(DNASequence("ACGTAC"), k=2, num_hashes=100)
right = minhash(DNASequence("ACGTTC"), k=2, num_hashes=100)
result = sketch_similarity(left, right, min_shared_hashes=1)
print(result.value, result.shared_hash_count)
- 示例结果:
4) Dashing sketch相似度¶
- 作用: 调用外部 Dashing 为多条序列构建高性能 Sketch,计算近似 Jaccard 矩阵或 Top-k 邻居,适合原生穷举计算难以承受的数据规模。
-
计算方法: 调用显式配置的 Dashing 可执行程序生成 sketch,并解析矩阵或 Top-k 结果。
-
API:
dnakit.similarity.DashingAdapter(executable_path[必须])、dnakit.similarity.DashingAdapter.matrix(inputs[必须], k[可选], mode[可选], sketch_size_log2[可选], canonical[可选], threads[可选], temp_dir[可选], output_path[可选], overwrite[可选], timeout_seconds[可选], max_items[可选], max_input_bytes[可选], max_output_bytes[可选], max_capture_bytes[可选], max_sketch_memory_bytes[可选])、dnakit.similarity.DashingAdapter.top_k(inputs[必须], top_k[必须], k[可选], mode[可选], sketch_size_log2[可选], canonical[可选], threads[可选], temp_dir[可选], output_path[可选], overwrite[可选], timeout_seconds[可选], max_items[可选], max_input_bytes[可选], max_output_bytes[可选], max_capture_bytes[可选], max_sketch_memory_bytes[可选])。 -
输入: 必填调用方显式配置的可执行文件和序列/FASTA/FASTQ;可选 k、模式、sketch 大小、canonical、线程、临时目录和输出路径。
-
输出: 返回 Dashing sketch 比较的相似度结果。
-
示例代码:
import os
from pathlib import Path
from dnakit import DNASequence
from dnakit.similarity import DashingAdapter
configured = os.environ.get("DNAKIT_DASHING_EXECUTABLE")
if configured is None:
print("跳过:请先显式配置 DNAKIT_DASHING_EXECUTABLE")
else:
result = DashingAdapter(Path(configured)).matrix(
(DNASequence("AACCGG"), DNASequence("AACCTT")), k=2, mode="exact"
)
print(result.values)
- 示例结果:
5) Reference similarity¶
- 作用: 为每条查询序列在版本化参考库中找到最相似记录,返回参考 ID、相似度、覆盖度和排名,用于参考归属及新颖性分析。
- 计算方法: 按指定相似度方法逐条检索参考库,并按分数与覆盖度筛选和排序。
- API:
dnakit.evaluation.evaluate_reference_similarity(queries[必须], reference[必须], config[可选]);config使用dnakit.evaluation.ReferenceSearchConfig。 - 输入: query 和
ReferenceLibrary;可选相似度与 coverage 配置。 - 输出: 返回
EvaluationReport,整体指标在metrics,逐条结果在entries。 - 示例代码: 先按参考库示例准备构造
queries和reference,再运行下面代码。
from dnakit.evaluation import evaluate_reference_similarity
report = evaluate_reference_similarity(queries, reference)
print(report.metrics["mean_nearest_similarity"])
- 示例结果: