Use a weighted ranking algorithm that normalizes engagement across community size and highlights statistical outliers.
Goal: Equal visibility potential for small and large communities by emphasizing relative performance over absolute volume.
Outline:
-
Inputs
- ( u ): upvotes
- ( d ): downvotes
- ( t ): post age (in hours)
- ( n_c ): number of active users in the community
- ( μ_c ), ( σ_c ): mean and standard deviation of engagement (e.g., score = upvotes − downvotes) within community ( c )
-
Compute raw score [ s = u - d ]
-
Normalize by community size [ s' = \frac{s}{\sqrt{n_c}} ] (Square root dampens the effect of community population size.)
-
Compute z-score (outlier detection) [ z = \frac{s' - μ_c}{σ_c} ] This measures how exceptional a post is compared to typical posts in its own community.
-
Apply time decay [ z_t = z \times e^{-λt} ] ( λ ) is a decay constant controlling how fast posts lose prominence.
-
Sort order
- Primary key: ( z_t ) descending.
- Secondary key: recency or total engagement.
Effect:
- A post that performs far above its community norm (high z-score) rises regardless of community size.
- Large communities no longer dominate since normalization and outlier weighting make “exceptional” small-community posts equally competitive.
Optional adjustments:
- Cap visibility to prevent manipulation (e.g., minimum engagement threshold).
- Use Bayesian shrinkage if communities have low post counts to stabilize ( μ_c ) and ( σ_c ).
This yields a discovery feed surfacing statistical outliers across all communities.