<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Todd Schiller - analysis</title><link href="https://toddschiller.com/" rel="alternate"></link><link href="https://toddschiller.com/feeds/tag/analysis.atom.xml" rel="self"></link><id>https://toddschiller.com/</id><updated>2026-05-24T00:00:00-04:00</updated><subtitle>Human ✘ Artificial Intelligence</subtitle><entry><title>ACH as Bayesian reasoning in disguise</title><link href="https://toddschiller.com/blog/ach-bayesian-reasoning.html" rel="alternate"></link><published>2026-05-24T00:00:00-04:00</published><updated>2026-05-24T00:00:00-04:00</updated><author><name>Todd Schiller</name></author><id>tag:toddschiller.com,2026-05-24:/blog/ach-bayesian-reasoning.html</id><summary type="html">The Analysis of Competing Hypotheses worksheet is naive Bayes with a friendlier UI. An interactive artifact to explore.</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on format.&lt;/strong&gt; I'm experimenting with shorter, more frequent posts to
work through a backlog of ideas and observations. Some of them will come with
an &lt;a href="/pages/artifacts.html"&gt;artifact/tool&lt;/a&gt;. With AI code generation,
it's often faster and more fun for me to build an explanation tool than to
write a long-form post.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A couple of inverse concepts that I've been interested in are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operationalization: methods that encode human intuition or concepts, so can be
applied at scale. For example, measures of &amp;quot;disagreement&amp;quot;&lt;/li&gt;
&lt;li&gt;Fast and Frugal Heuristics: simple rules of thumb that work well in practice,
with a mathematical/statistical correspondence that explains their
effectiveness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One Fast and Frugal tool that's simple and surprisingly effective is the
Analysis of Competing Hypotheses (ACH),
a CIA tradecraft method from Richards Heuer's &lt;a href="https://www.cia.gov/resources/csi/static/Pyschology-of-Intelligence-Analysis.pdf"&gt;&lt;em&gt;Psychology of Intelligence
Analysis&lt;/em&gt;&lt;/a&gt;. To perform ACH, you list
candidate hypotheses across the top of a table, evidence down the side, and
rate each cell as &lt;strong&gt;strongly consistent / consistent / neutral / inconsistent /
strongly inconsistent&lt;/strong&gt; with the hypothesis.&lt;/p&gt;
&lt;!-- markdownlint-disable MD013 --&gt;
&lt;figure&gt;
  &lt;img loading="lazy" decoding="async" src="https://toddschiller.com/assets/images/ach-bayesian/ach-example.png" alt="Example ACH board generated by Google Gemini / Nano Banana"&gt;
  &lt;figcaption&gt;Google Gemini / Nano Banana is surprisingly decent at one-shotting ACH boards from a question.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;!-- markdownlint-enable MD013 --&gt;
&lt;p&gt;You can get fancy with the analysis. As a pre-LLM side project, I built &lt;a href="https://www.opensynthesis.org/"&gt;a tool
to collaborate on ACH&lt;/a&gt;. By tracking individual
assessments and evidence source quality, the tool makes it possible to observe
how disagreement and
provenance influence the conclusion.&lt;/p&gt;
&lt;p&gt;The most commonly cited reason for ACH's effectiveness is that it forces you to
consider
evidence against each hypothesis simultaneously. That combats multiple cognitive
biases, e.g., anchoring, confirmation bias, and availability bias.&lt;/p&gt;
&lt;p&gt;But the deeper reason for ACH's effectiveness is that it's Bayesian reasoning in
disguise. In the Bayesian formulation, each
consistency rating encodes the likelihood of the evidence given the hypothesis
is true:
&lt;span class="math"&gt;P(E&lt;sub&gt;i&lt;/sub&gt; | H&lt;sub&gt;j&lt;/sub&gt;)&lt;/span&gt;. &lt;em&gt;IMPORTANT:
consistency is the
likelihood of the evidence given the hypothesis, not the joint probability of
the evidence and the hypothesis, or
the likelihood of the hypothesis given the evidence.&lt;/em&gt; If you assume the evidence
is conditionally
independent given the hypothesis (the Naive Bayes assumption), you can combine
the rows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;P(H | E₁, …, Eₙ)  ∝  P(H) · P(E₁ | H) · P(E₂ | H) · … · P(Eₙ | H)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now comes board evaluation. If performing evaluation by hand, you might simply
count and select the hypothesis with the fewest inconsistencies.
That's a simple approach, and operationalizes the Popperian principle of
falsification. However, it doesn't operationalize
the concept of &amp;quot;the most likely hypothesis given the evidence.&amp;quot; In the Bayesian
formulation, you'd select
the MAP hypothesis, the hypothesis with the highest posterior probability. You
can reconcile the two through model choice:
deciding if consistency should contribute ~0 to log-likelihood, or if it should
contribute positively.&lt;/p&gt;
&lt;p&gt;Once you make the mapping explicit, the Bayesian formulation makes explicit what
ACH leaves implicit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Priors: ACH treats hypotheses as equally likely going in. Bayes lets you
encode variation, which is especially important when evidence is weak&lt;/li&gt;
&lt;li&gt;Diagnosticity: ACH calls evidence with similar ratings
across hypotheses &amp;quot;non-diagnostic.&amp;quot; In the Bayes formulation, diagnosticity is
the variance
of likelihoods across hypotheses.&lt;/li&gt;
&lt;li&gt;Magnitude, not just direction: Two &amp;quot;++&amp;quot; ratings aren't twice as strong as
one — they multiply. Naive Bayes makes the compounding explicit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make the correspondence tangible, I built an interactive explorer with Claude
that lets you fill in an ACH table and watch the Bayesian posterior update live:&lt;/p&gt;
&lt;p&gt;&lt;a href="/artifacts/ach-bayesian/"&gt;&lt;strong&gt;ACH ↔ Bayesian Reasoning Explorer&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The explorer includes a few worked examples (e.g., wet sidewalk) and a toggle to
expose the likelihood matrix, log-likelihood contributions, and the joint
distribution.&lt;/p&gt;
&lt;!-- markdownlint-disable MD013 --&gt;
&lt;figure&gt;
  &lt;img loading="lazy" decoding="async" src="https://toddschiller.com/assets/images/ach-bayesian/ach-screenshot.png" alt="Preview of ACH ↔ Bayesian Reasoning Explorer"&gt;
  &lt;figcaption&gt;Screenshot of ACH entry in the ACH ↔ Bayesian Reasoning Explorer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;!-- markdownlint-enable MD013 --&gt;
&lt;h2&gt;Want to learn more about ACH?&lt;/h2&gt;
&lt;p&gt;I gave a workshop
at &lt;a href="https://wiki.hope.net/index.php?title=Intelligence_Analysis_101_workshop"&gt;Hackers on Planet Earth (HOPE) 2020&lt;/a&gt;.
Or,
see &lt;a href="https://github.com/twschiller/open-synthesis/"&gt;my open-source Open Synthesis repository&lt;/a&gt;.&lt;/p&gt;
</content><category term="Reasoning"></category><category term="ACH"></category><category term="Bayesian reasoning"></category><category term="analysis"></category><category term="epistemics"></category></entry></feed>