Similarity calculation¶
Calculate k-mer, fingerprint, and sketch similarities between DNA sequences and generate batch similarity matrices and reference library similarity results.
1) k-mer similarity¶
- Purpose: Convert sequences into k-mer sets or count vectors to calculate Jaccard, Containment, or Cosine similarity; collections can also be compared by their mean similarity.
-
Method: For one sequence on each side, compute set Jaccard/containment or cosine similarity of k-mer count vectors. For collections, compare each query with every reference;
valueis the arithmetic mean of all pair scores:sum(sim(query, reference)) / (query count × reference count). This is not the mean nearest-neighbor score. -
API:
dnakit.similarity.kmer_similarity(left[required], right[required], k[required], metric[optional], mode[optional], canonical[optional], overlapping[optional], zero_vector_policy[optional], max_pairwise_comparisons[optional]),dnakit.similarity.kmer_vector_similarity(left[required], right[required], metric[optional], mode[optional], zero_vector_policy[optional]). -
Input:
leftholds queries andrightholds references. Either side accepts a singleDNASequence/DNARecord,DNA([...]),DNASet, or a list ofDNASequence/DNARecordobjects. Collections must be nonempty.kis required; metric, set/count, canonical, overlap, and zero-vector policy are optional. At most 1,000,000 pairs are compared by default; adjustmax_pairwise_comparisonsif needed. -
Output: Returns
SimilarityResult. A single pair retains fields such ascomponents["shared_weight"]; for collections,valueis the overall mean andcomponents["query_means"]gives each query's mean against all references in input order, together withquery_count,reference_count, andpair_count. -
Example code:
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"])
- Example output:
- Collection example:
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) Fingerprint similarity¶
- Purpose: Compare two DNA fingerprints or numerical vectors with consistent schema, calculate Tanimoto, Jaccard, Cosine or numerical distance, and return scores that can be used for sorting, clustering and threshold judgment.
-
Method: Validate matching schemas, then compare bit sets or numeric vectors with the chosen metric.
-
API:
dnakit.similarity.fingerprint_similarity(left[required], right[required], metric[optional], weights[optional], zero_vector_policy[optional]). -
Input: Two isomorphic fingerprints/vectors are required; metric, feature weight and zero vector strategy are optional.
-
Output: Returns
SimilarityResultwith similarityvalueand comparisonmethod. -
Example code:
from dnakit.similarity import fingerprint_similarity
result = fingerprint_similarity((1.0, 1.0), (1.0, 0.0), metric="tanimoto")
print(result.value)
- Example output:
3) Sketch similarity¶
- Purpose: Compare the hash values retained in two MinHash/FracMinHash Sketch, approximately estimate Jaccard or Containment, and report compatibility parameters, suitable for fast comparison of large sequences.
-
Method: Check k, seed and sampling compatibility, then estimate overlap from shared hashes.
-
API:
dnakit.fingerprints.minhash(value[required], k[required], num_hashes[optional], canonical[optional], seed[optional], max_hashes[optional], max_unique_hashes[optional]),dnakit.fingerprints.fracminhash(value[required], k[required], scaled[optional], canonical[optional], seed[optional], max_hashes[optional], max_unique_hashes[optional]), anddnakit.similarity.sketch_similarity(left[required], right[required], metric[optional], min_shared_hashes[optional]). -
Input: Two compatible sketches are required; optional metric and minimum number of shared hashes.
-
Output:
minhash/fracminhashreturnSketchResult;sketch_similarityreturnsSketchSimilarityResultwith similarityvalueand shared-hash count. -
Example code:
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)
- Example output:
4) Dashing sketch similarity¶
- Purpose: Call external Dashing to build high-performance Sketch for multiple sequences and calculate approximate Jaccard matrices or Top-k neighbors, which is suitable for data scale that is unbearable for native exhaustive calculations.
-
Method: Run the explicitly configured Dashing executable and parse the sketch matrix or Top-k results.
-
API:
dnakit.similarity.DashingAdapter(executable_path[required]),dnakit.similarity.DashingAdapter.matrix(inputs[required], k[optional], mode[optional], sketch_size_log2[optional], canonical[optional], threads[optional], temp_dir[optional], output_path[optional], overwrite[optional], timeout_seconds[optional], max_items[optional], max_input_bytes[optional], max_output_bytes[optional], max_capture_bytes[optional], max_sketch_memory_bytes[optional]),dnakit.similarity.DashingAdapter.top_k(inputs[required], top_k[required], k[optional], mode[optional], sketch_size_log2[optional], canonical[optional], threads[optional], temp_dir[optional], output_path[optional], overwrite[optional], timeout_seconds[optional], max_items[optional], max_input_bytes[optional], max_output_bytes[optional], max_capture_bytes[optional], max_sketch_memory_bytes[optional]). -
Input: Required executable and sequence/FASTA/FASTQ explicitly configured by the caller; optional k, mode, sketch size, canonical, threads, temporary directory and output path.
-
Output: Returns similarity results from the Dashing sketch comparison.
-
Example code:
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("Skipped: configure DNAKIT_DASHING_EXECUTABLE explicitly first")
else:
result = DashingAdapter(Path(configured)).matrix(
(DNASequence("AACCGG"), DNASequence("AACCTT")), k=2, mode="exact"
)
print(result.values)
- Example output:
5) Reference similarity¶
- Purpose: Find the most similar record in the versioned reference library for each query sequence, and return the reference ID, similarity, coverage and ranking for reference attribution and novelty analysis.
- Method: Search the reference library with the chosen metric, then filter and rank by score and coverage.
- API:
dnakit.evaluation.evaluate_reference_similarity(queries[required], reference[required], config[optional]);configusesdnakit.evaluation.ReferenceSearchConfig. - Input: query and
ReferenceLibrary; optional similarity and coverage configuration. - Output: Returns
EvaluationReportwith aggregatemetricsand per-recordentries. - Example code: First construct
queriesandreferenceusing the reference library example, and then run the following code.
from dnakit.evaluation import evaluate_reference_similarity
report = evaluate_reference_similarity(queries, reference)
print(report.metrics["mean_nearest_similarity"])
- Example output: