Multi-Source Intelligence Fusion
A satellite image is one input. Intelligence comes from fusing multiple sources — imagery, signals, open sources, human reporting — into an assessment that is greater than the sum of its parts. This note covers the analytical methodology: how to combine sources, manage uncertainty, express confidence, and avoid the cognitive traps that mislead analysts.
See Pattern 2: The Ground Truth Is Never in the Image Alone.
The Intelligence Cycle
Requirements → Collection → Processing → Analysis → Dissemination
↑ │
└────────────────── Feedback ─────────────────────────┘
As a GEOINT analyst, you primarily operate in Processing (turning raw imagery into exploitable products) and Analysis (interpreting those products in context). But understanding the full cycle matters — your analysis feeds decisions that drive new collection requirements.
Intelligence Source Types
Each source type provides different information. No single source is complete.
IMINT (Imagery Intelligence)
What you’re learning in this course. Strengths:
- Physical evidence: structures, vehicles, equipment, activity
- Spatial precision: exact coordinates of objects
- Temporal snapshots: before/after comparison
- Non-cooperative: target doesn’t need to transmit or communicate
Limitations:
- Shows what’s visible on the surface, not intent
- Temporal gaps between revisits
- Weather/cloud dependency (optical)
- Interpretation requires context
SIGINT (Signals Intelligence)
Intercepted communications and electronic emissions. From your EW-Recon course.
- Radio communications: content (if decryptable) or metadata (who talks to whom, when)
- Radar emissions: type of radar = type of platform = capability
- Satellite communications: ship/aircraft positions, data traffic patterns
- Electronic Order of Battle: what emitters are where
OSINT (Open Source Intelligence)
Publicly available information. From your Security OSINT course.
- Social media: soldiers posting photos, locals reporting troop movements
- AIS (Automatic Identification System): ship positions and metadata
- ADS-B: aircraft positions and flight data
- News media: official statements, local reporting
- Commercial satellite imagery providers: Planet Explorer, Google Earth historical
- Shipping databases, corporate registries, government publications
HUMINT (Human Intelligence)
Information from human sources.
- Provides context, intent, plans — things no sensor can detect
- Least reliable for facts, most valuable for motivation and future actions
- Cannot be collected by technical means
MASINT (Measurement and Signature Intelligence)
Technical measurements beyond traditional imagery.
- Radar signatures, acoustic signatures, nuclear detection
- Seismic monitoring (underground nuclear tests)
- Chemical/biological sampling
Analysis of Competing Hypotheses (ACH)
Developed by Richards Heuer (CIA), ACH is the most widely used structured analytic technique. Instead of collecting evidence FOR your preferred hypothesis, ACH forces you to evaluate evidence AGAINST all hypotheses.
The Method
- Identify hypotheses — list all plausible explanations (minimum 3)
- List evidence — all relevant evidence from all sources
- Build a matrix — for each evidence-hypothesis pair: consistent (+), inconsistent (-), or neutral (0)
- Evaluate — the hypothesis with the FEWEST inconsistencies is most likely
- Assess sensitivity — which evidence items are most diagnostic? If removed, would the conclusion change?
- Report — state conclusion with confidence level and key assumptions
import numpy as np
def ach_analysis(hypotheses, evidence, matrix):
"""
Analysis of Competing Hypotheses.
hypotheses: list of hypothesis strings
evidence: list of (description, source, reliability) tuples
matrix: 2D array, shape (n_evidence, n_hypotheses)
values: 1 = consistent, -1 = inconsistent, 0 = neutral
Returns: ranked hypotheses with scores.
"""
matrix = np.array(matrix, dtype=float)
n_evidence, n_hyp = matrix.shape
# Weight by source reliability (1-5 scale)
reliability = np.array([e[2] for e in evidence], dtype=float)
reliability_norm = reliability / reliability.max()
# Weighted inconsistency count (lower = better)
weighted_matrix = matrix * reliability_norm[:, np.newaxis]
inconsistency_score = np.sum(np.minimum(weighted_matrix, 0), axis=0)
consistency_score = np.sum(np.maximum(weighted_matrix, 0), axis=0)
# Combined score: high consistency + low inconsistency
combined = consistency_score + inconsistency_score # inconsistency is negative
# Rank
ranking = np.argsort(-combined) # highest combined score first
results = []
for rank, idx in enumerate(ranking):
n_consistent = np.sum(matrix[:, idx] > 0)
n_inconsistent = np.sum(matrix[:, idx] < 0)
n_neutral = np.sum(matrix[:, idx] == 0)
results.append({
"rank": rank + 1,
"hypothesis": hypotheses[idx],
"score": combined[idx],
"consistent": n_consistent,
"inconsistent": n_inconsistent,
"neutral": n_neutral,
})
return results
def display_ach_matrix(hypotheses, evidence, matrix, results):
"""Display ACH matrix as formatted text."""
# Print matrix
print("\n" + "=" * 80)
print("ANALYSIS OF COMPETING HYPOTHESES")
print("=" * 80)
# Header
hyp_short = [f"H{i+1}" for i in range(len(hypotheses))]
header = f"{'Evidence':<50} " + " ".join(f"{h:>5}" for h in hyp_short)
print(header)
print("-" * len(header))
symbols = {1: " +", -1: " -", 0: " 0"}
for i, (desc, source, rel) in enumerate(evidence):
row = f"[{source}] {desc[:44]:<44} "
row += " ".join(f"{symbols[int(matrix[i][j])]:>5}" for j in range(len(hypotheses)))
print(row)
print("-" * len(header))
print("\nHypotheses:")
for i, h in enumerate(hypotheses):
print(f" H{i+1}: {h}")
print("\nRanking:")
for r in results:
print(f" #{r['rank']}: {r['hypothesis']}")
print(f" Score: {r['score']:.1f} | "
f"+{r['consistent']} consistent, "
f"-{r['inconsistent']} inconsistent, "
f"{r['neutral']} neutral")
print()
# === EXAMPLE: Assess activity at a military facility ===
hypotheses = [
"H1: Routine training exercise",
"H2: Increased operational readiness / mobilization",
"H3: Facility expansion / infrastructure upgrade",
]
evidence = [
# (description, source, reliability 1-5)
("20+ new vehicles in motor pool (vs baseline of 5)", "IMINT", 5),
("New earthworks along perimeter fence", "IMINT", 4),
("Increased radio traffic on military frequencies", "SIGINT", 3),
("Local news reports annual military exercise scheduled", "OSINT", 4),
("Satellite shows new construction materials on site", "IMINT", 5),
("Social media: soldiers complain about extended deployment", "OSINT", 2),
("No increase in logistics truck traffic to base", "IMINT", 3),
("Exercise was scheduled to end 2 weeks ago", "OSINT", 4),
]
# Matrix: rows=evidence, columns=hypotheses
# +1 = consistent, -1 = inconsistent, 0 = neutral
matrix = [
# H1 H2 H3
[ 1, 1, 0], # vehicles: consistent with exercise or readiness
[ 0, 1, -1], # earthworks: not typical for exercise, suggests defense
[ 1, 1, 0], # radio: consistent with exercise or ops
[ 1, 0, 0], # news: supports exercise
[-1, 0, 1], # construction materials: not exercise, maybe construction
[ 0, 1, 0], # social media: extended deployment suggests more than exercise
[-1, -1, 0], # no logistics: inconsistent with sustained operation
[-1, 1, 0], # exercise should be over: inconsistent with exercise
]
results = ach_analysis(hypotheses, evidence, matrix)
display_ach_matrix(hypotheses, evidence, matrix, results)Confidence Levels
Intelligence assessments must express confidence. The US Intelligence Community (ODNI ICD 203) uses:
| Confidence Level | Meaning |
|---|---|
| Low | Information is fragmentary, poorly corroborated, comes from sources of questionable reliability. Analysis may be based on logic alone without direct evidence. |
| Moderate | Information is adequate, somewhat corroborated, from generally reliable sources. Plausible alternative interpretations exist. |
| High | Information is strong, well-corroborated, from reliable and independent sources. Assessment is robust even if some evidence changes. |
Probability language (ODNI):
| Term | Probability Range |
|---|---|
| Almost no chance | <5% |
| Very unlikely | 5-20% |
| Unlikely | 20-45% |
| Roughly even chance | 45-55% |
| Likely | 55-80% |
| Very likely | 80-95% |
| Almost certain | >95% |
Example assessment:
“We assess with moderate confidence that the observed activity at Facility X represents increased operational readiness rather than routine training. This assessment is based on imagery showing 20+ new vehicles (high reliability), extended deployment beyond the announced exercise period (moderate reliability), and new earthworks not consistent with previous exercises (moderate reliability). The main alternative — ongoing routine exercise — is inconsistent with the expired exercise timeline but cannot be ruled out pending additional SIGINT analysis.”
Cognitive Biases in Intelligence Analysis
Mirror Imaging
Assuming the adversary thinks like you. “We would never deploy troops in winter, so they won’t either.” Russians have extensive cold-weather doctrine.
Anchoring
Over-relying on the first piece of information. If the first report says “exercise,” subsequent indicators of mobilization get reinterpreted to fit the exercise narrative.
Confirmation Bias
Seeking evidence that supports your existing hypothesis and dismissing evidence that contradicts it. ACH is specifically designed to counter this.
Vividness Bias
A dramatic satellite image (tanks in a row) has more psychological impact than statistical data (logistics throughput numbers), even if the statistics are more diagnostic.
Satisficing
Stopping analysis at the first plausible explanation instead of considering alternatives. “It looks like an exercise” → stop. ACH forces you to keep going.
def bias_check(assessment):
"""
Structured bias check for intelligence assessments.
Returns a checklist of questions the analyst should answer.
"""
checks = [
"Have you considered at least 3 alternative explanations?",
"Is there evidence that CONTRADICTS your preferred hypothesis?",
"If you remove the single strongest piece of evidence, "
"does your conclusion still hold?",
"Would an analyst from a different cultural background "
"reach the same conclusion?",
"Are you relying on absence of evidence as evidence of absence?",
"Have you weighted each source by reliability, "
"not by how dramatic it is?",
"Is your confidence level justified by the quantity and quality "
"of corroborating sources?",
"What would change your mind? If nothing would, "
"you're not analyzing — you're advocating.",
]
return checksPractical Fusion: Facility Assessment Template
def generate_assessment_template(facility_name, date_range):
"""Generate a structured multi-source assessment template."""
template = f"""
MULTI-SOURCE INTELLIGENCE ASSESSMENT
=====================================
Facility: {facility_name}
Period: {date_range}
Classification: UNCLASSIFIED (training exercise)
1. KEY FINDINGS
-
-
-
2. IMAGERY ANALYSIS (IMINT)
Collection dates:
Sensor(s) used:
Observations:
- Permanent structures:
- Temporary structures/changes:
- Vehicle count (vs baseline):
- Equipment/activity:
Limitations:
3. SIGNALS ANALYSIS (SIGINT)
Observations:
- Communications activity:
- Emitter activity:
Limitations:
4. OPEN SOURCE ANALYSIS (OSINT)
Sources checked:
- Social media:
- News/media:
- AIS/ADS-B data:
- Government/military announcements:
Observations:
Limitations:
5. ANALYSIS OF COMPETING HYPOTHESES
H1:
H2:
H3:
[ACH matrix]
Most likely:
Key assumptions:
6. CONFIDENCE ASSESSMENT
Overall confidence: [LOW / MODERATE / HIGH]
Key drivers of confidence:
Key gaps / collection requirements:
7. ALTERNATIVE EXPLANATIONS
-
8. INDICATORS TO WATCH
- If H1 is correct, we should see:
- If H2 is correct, we should see:
"""
return templateConnection to Cognitive Warfare
Adversaries know how intelligence analysts think. They exploit cognitive biases through:
- Denial: preventing collection (camouflage, underground facilities, timing activity to collection gaps)
- Deception: planting false indicators (inflatable decoy vehicles, fake radio traffic, false social media accounts)
- A critical thinking skill: when evidence is “too clean” or “too obvious,” consider whether it was placed for you to find
Exercises
Exercise 1: ACH Assessment
A naval port shows the following changes over 3 months:
- IMINT: 3 new submarines appeared (baseline: 0 submarines at this port)
- IMINT: new pier construction at the east end
- SIGINT: new sonar test transmissions detected offshore
- OSINT: defense ministry announced “routine maintenance rotation”
- OSINT: local fishermen report restricted area expanded
Formulate 3 hypotheses and apply ACH. What is your assessment and at what confidence?
Exercise 2: Fuse IMINT + OSINT
Choose a real military facility visible on Google Earth. Combine:
- Imagery observations (structures, vehicles, activity)
- OSINT research (what unit is based there, recent news, social media)
- Write a 1-page assessment with confidence level
Exercise 3: Identify Cognitive Biases
Read the following analyst’s report and identify 3 cognitive biases:
“The new road construction at the facility clearly indicates offensive preparation. We’ve seen similar road building before Russian exercises, and Russia has a history of using exercises as cover for operations. The defense ministry denies any unusual activity, which is exactly what they would say if something was happening. We assess with high confidence that this is preparation for military action.”
Self-Test Questions
- Why does ACH focus on inconsistent evidence rather than consistent evidence?
- What is the difference between “likely” and “probable” in intelligence assessment language?
- Name three cognitive biases that specifically affect imagery analysis.
- Why is OSINT corroboration of IMINT findings important even when the imagery is clear?
- An analyst has a single high-reliability source supporting their conclusion. Is “high confidence” justified?
See also: Change Detection | Case Study - Monitoring Military Installations | Case Study - Maritime Domain Awareness Next: SATCOM and Space Segment