How the formula works

Your score starts with the raw votes you receive: No, Somewhat, Yes, Very. Not every vote counts the same, though. Photofeeler's VoterStyles algorithm reweights each one using the voter's own history, summarized as a single number from 0 to 10 called their lean (0 = habitual flatterer, 10 = harsh critic).

zphoto=jΦ(W0[vj])(A[vj]+B[vj](Lj5))jΦ(W0[vj])z_{\text{photo}} = \frac{\sum_{j} \Phi(W_0[v_j])\cdot\big(A[v_j] + B[v_j](L_j-5)\big)}{\sum_{j} \Phi(W_0[v_j])}
median=10Φ(zphoto)σz=Cϕ(zphoto)nqp=10Φ ⁣(zphoto+Φ1(p)σz)\begin{aligned}\text{median} &= 10\cdot\Phi(z_{\text{photo}}) \\ \sigma_z &= \dfrac{C}{\phi(z_{\text{photo}})\sqrt{n}} \\ q_p &= 10\cdot\Phi\!\big(z_{\text{photo}} + \Phi^{-1}(p)\cdot\sigma_z\big)\end{aligned}

What each piece does:

  • Base value (AA) is the z-contribution each button gets from a neutral voter (lean = 5).
  • Lean correction (BB) controls how strongly each button responds to L5L - 5. A "Very" from a harsh critic shifts z noticeably more than the same lean shift applied to a "No".
  • Trust weight (Φ(W0)\Phi(W_0)) is the share of a vote's weight that survives Photofeeler's quality filter. Low-quality and suspiciously generous votes get most of their weight cut.
  • The final score (median\text{median}) passes the weighted z-score through the standard normal CDF Φ\Phi and scales it by 10. Because Φ\Phi is an S-curve (not the bell itself), z=0z = 0 lands exactly at 5.0 and the ends saturate near 0 and 10.
  • The 90% range (qpq_p) tightens as nn grows. Its width at each z also depends on the bell-curve density ϕ(z)\phi(z) and on a global dispersion scalar CC.

Finding the weights

We fit these constants on 473 Dating-category tests: 25,098 votes in total across Smart, Trustworthy and Attractive. Nelder-Mead optimization minimized a joint loss over the reported median and the five quantiles of the 90% bar. The fitted formula reproduces Photofeeler's reported medians with about 1.7% mean absolute percentage error.

What we learned

The fitted numbers already tell a few stories. The base score below is what a single vote of that type from a neutral voter (lean = 5) would produce on its own. The kept weight is Φ(W0)\Phi(W_0), the fraction of that vote that survives the trust filter. The lean slope BB is the per-lean-point shift each button adds to the z-score. A bigger slope means the same click counts very differently depending on the voter's history. Switch traits to see how they differ:

No
Base score 2.7
Kept weight 100%
Lean slope 0.09
Somewhat
Base score 5.3
Kept weight 94%
Lean slope 0.11
Yes
Base score 8.9
Kept weight 67%
Lean slope 0.19
Very
Base score 10.0
Kept weight 33%
Lean slope 0.39
  • "Very" votes argue hard, but get throttled hard. A single "Very" pulls toward a flat 10.0, yet the trust filter keeps only 26–33% of its weight by default. The algorithm treats anyone clicking "Very" as probably too generous. Its full weight only returns when a habitual harsh critic casts it.
  • "No" and "Somewhat" go through almost unfiltered. Kept weights sit near 100% for Attractive and Trustworthy (98% on "Somewhat" for Trustworthy, 94% for Attractive). Smart is the slight exception, keeping 84% of a "No" and 90% of a "Somewhat".
  • Harsh critics move the score more than flatterers do. Compare the lean slope row above: on every trait, "Very" is about four to five times more sensitive to voter history than "No" (0.39 vs 0.09 on Attractive, 0.39 vs 0.08 on Smart, 0.31 vs 0.06 on Trustworthy). Concretely, on Attractive, a three-point lean jump from neutral (5) to harsh critic (8) adds 0.39 × 3 = 1.17 to a "Very"'s z-contribution, but only 0.09 × 3 = 0.28 to a flatterer's "No". That asymmetry is why a "Very" from someone who usually clicks "No" lifts your score noticeably more than a "No" from a habitual "Very" voter pulls it back.
  • "Somewhat" is close to neutral. Its base score sits near 5 on all three traits, so extra "Somewhat" votes mostly just pull the weighted mean toward the middle.

Why a high Smart score is easier than a high Attractive one

The three traits don't share the same score distribution. Across the 472 photos we have medians for, the share of photos hitting 9.0 or higher is 18.6% on Smart, 14.2% on Trustworthy and 7.0% on Attractive. Standout Smart scores are almost three times as common as standout Attractive scores.

  • Smart rewards legible signals. A clean background, good grooming and a fitted suit or blazer read as "put-together" within a second. Voters act on that cue quickly. The bar is categorical: you either look the part or you don't. Photos that clear it tend to land in the 8–9+ range instead of sitting in the middle.
  • Trustworthy has the highest floor but a thinner top. Its mean is actually the highest of the three (7.10, versus 6.73 on Smart and 6.74 on Attractive), so most photos drift into the 7s. The 9+ tail is thinner because voters reserve high Trust for warmth cues: a relaxed jaw, real eye contact and a natural smile. Outfit changes can't manufacture that.
  • Attractive is the hardest tail to reach. Only 7.0% of photos clear 9.0. The score depends on things you can't change on shoot day (bone structure, skin, body composition) plus things you can (lighting, grooming, wardrobe). Progress usually comes from stacking small wins rather than one switch.

There's also a visible coupling. Among the 97 photos scoring 8.0 or higher on Attractive, the mean Smart score is 8.79 but the mean Trustworthy score is only 7.94, a gap of about 0.85. Voters cool on the Trust rating once a photo looks physically striking, reading the subject as posed or edgy. That's why, once you optimize for looks, Smart climbs alongside Attractive while Trust lags behind.

Interactive score explorer

Drag the sliders to see how different vote mixes and voter leans land on the 0–10 scale.

Predicted score
6.04 7.63 / 10 8.79
from 20 votes · 90% range
Trait
Vote counts (0–20 per button)
No
1
Somewhat
6
Yes
11
Very
2
Mean voter lean (0 flatterer → 10 critic)

Defaults to the empirical mean lean for each vote type in our 25,098-vote dataset. Switching trait resets these. "Very" voters run harsher on Trustworthy than on Smart, for example.

No
6.1
Somewhat
4.8
Yes
4.5
Very
4.3
View raw algorithm coefficients

The fitted constants used above. The dispersion scalar CC is 0.38, shared across traits.

Trait Button AA (base) BB (lean slope) W0W_0 (trust pre-image)
SMART No -0.769 0.081 1.000
Somewhat -0.106 0.112 1.278
Yes 1.090 0.187 0.114
Very 4.003 0.392 -0.648
TRUSTWORTHY No -0.704 0.063 3.079
Somewhat -0.063 0.130 2.029
Yes 1.129 0.204 0.170
Very 4.001 0.311 -0.585
ATTRACTIVE No -0.600 0.093 3.323
Somewhat 0.083 0.114 1.597
Yes 1.210 0.186 0.434
Very 4.002 0.392 -0.431