Skip to content

Predator<>Prey Models and Dating Apps

subscribe

So, ya boy is on Hinge (not an ad), and it makes me want to kill myself (clearly, not an ad).

A common sentiment shared by both men and women on dating apps is that the apps are terrible — but for completely different reasons. My female friends are inundated with likes and matches, yet these very rarely convert into anything interesting. My male friends and I are starving, begging for likes, matches, scraps, etc.

I’ve always been really fascinated by these outcomes on dating apps. Social Media is filled with theories on why apps are like this, with many red-pilled content creators blaming women. But that’s too small brained for me - I theorized that a few systemic realities could lead to the unfortunate outcomes we see in dating marketplaces.

And I felt like dynamical systems were the perfect tool to try and interrogate these questions. This article will start with an introduction to the basics of dynamical systems, before using simulations to show you how dynamical systems can help us understand dating apps.

Lock in cause this is gonna be interactive!

What are dynamical systems?

Dynamical systems are a fancy name for a simple concept: how can a set of equations (the system) explain complex behaviors (the dynamics)?

A canonical example of this is the Lotka–Volterra predator–prey model. This model tries to explain why in some ecosystems, prey and predator populations show cyclical behaviors. For example, Hare and Lynx populations consistently boom and crash in cycles over time:

Hudson's Bay Company trapping records showing snowshoe hare and Canada lynx populations booming and crashing in cycles, out of phase with each other, over roughly a century
Snowshoe hare and Canada lynx population cycles, from Hudson's Bay Company trapping records.Source: EALT

But why do these cycles happen? Lotka and Volterra were independently studying these dynamics in different contexts, and decided to build an intuition from first principles. To do this, they thought about what impacted the population of the prey (hares) and the predator (lynx). For Hares and Lynx, populations grow due to reproduction, and shrink due to deaths. However, the drivers of reproduction and death are different for the two animals:

Hare (prey)Lynx (predator)
Reproduction

Hares need other hares to reproduce, so they reproduce at a rate proportional to their current population

Lynx need other lynx to reproduce, but they also need food (Hares) to survive long enough to reproduce

Death

Hares are hunted by lynx. The number of hares that die is proportional to the number of lynx and the number of hares (more hares means more deaths are possible)

Lynx compete with each other for access to food, so their death rate is proportional to how many other lynx they compete with.

Keeping this in mind, let’s define a few variables to represent the system we described above:

Lotka–Volterra variables

H
the number of hares
α
hare reproduction rate
δ
lynx reproduction rate
L
the number of lynx
β
lynx predation rate
γ
lynx competition rate

Using these variables and our understanding of how the ecosystem works, we can represent expected changes in the hare and lynx populations over time with these equations:

dHdt = αH − βHL
dLdt = δHL − γL

Where dHdt is the change in the hare population (H) per unit of time t, and dLdt is the change in the lynx population (L) per unit of time. These equations may look complicated, but all they say is that:

  • the change in the hare population (dHdt) is related to how many hares (H) already exist (more hares mean more babies), minus how many hares (H) die due to lynx (L) (more lynx mean more deaths, and more hares mean more deaths are possible)
  • the change in the lynx population (dLdt) is related to how many hares (H) and the number of lynx (L) (more hares means more food, and more lynx mean more babies), minus the existing number of lynx (L) (who compete with each other for food).

Step through it yourself

t = 0t = 50

t = 0H = 10L = 10

Here's the math. We use a step size (Δt) of 0.1:

Interactive Lotka–Volterra predator–prey simulator. Starting from 10 hares and 10 lynx with α=0.3, β=0.03, δ=0.03, γ=0.8, step forward in time (forward Euler, Δt=0.1, up to t=50) to watch the prey and predator populations rise and fall in out-of-phase cycles. Each step shows the arithmetic behind the equations dH/dt = αH − βHL and dL/dt = δHL − γL.

To understand how these equations can be used to estimate populations over time, let’s start to plug in some numbers. Our example ecosystem will start with 10 hares (H) and 10 lynx (L). We’ll assume that α = 0.3, β = 0.03, δ = 0.03, and γ = 0.8. Now that we have all of our numbers, we can use the equations to calculate changes in the population. Doing this over and over again allows us to predict how the populations will change over time!

This simulation plots the expected populations over time given the parameters we chose. Feel free to update the parameters as much as you want, and see how the predictions change:

The parameters we chose lead to cyclical trends — it’s pretty amazing that such a simple set of equations can lead to complex behaviors like this! If you are curious about the math behind this complexity, I recommend Nonlinear Dynamics and Chaos by Strogatz or Modeling Life by Garfinkel. They are both interesting and approachable!

That being said, I imagine you are wondering how any of this relates to dating apps. Well a lot of women complain how men on dating apps seem to just treat them as a piece of meat (prey). But that’s not the connection I want to focus on.

Instead, we can use the foundations of Lotka-Volterra to guide us on creating a similar ‘system’ of a dating app and the users on them, then use that system to make predictions over time! Let’s take a look at how.

Dating Dynamical Systems

Like with Lotka–Volterra, before we get to any math, lets just conceptualize how a dating app works. I think about the system as having 2 parts: the Humans and the Marketplace:

Humans

Each human has a few different inputs:

  • Gender — for simplicity, our system will have only males (M) and females (F). Our system will start with M and F being exactly the same, but we will introduce some differences between the populations to see how that impacts outcomes!
  • Desirability (d) — again for simplicity, a single number between 1 and 10
  • Swipe volume (μn, σn) — how many profiles does a user swipe on per day? This is pulled from a normal distribution.
  • Swipe flexibility (μf, σf) — users may be willing to swipe on profiles that might be less ‘objectively desirable’ than them. This flexibility will be generated from these parameters.
  • Target match rate (μr, σr) — when a user is on a dating app, do they try to get 10% of their swipes to be matches? 1%? 100%? When their match rates are above this, they become more selective; when below, they become less selective. In reality, I don’t think people think like this, but it’s a way to generate a learning mechanism — individuals adjust their flexibility based on their ability (or inability) to get their ideal % of matches. Just like flexibility, each user’s target is its own draw from this distribution — not everyone is chasing the same match rate.
  • Adaptation rate (ra) — tied to the above target match rate, how quickly do they adapt their behaviors?
  • Churn — over time, users may decide to leave the platform. To start, we’ll ignore this, but we’ll add this in later!

Marketplace

And then there are the parameters of the marketplace itself:

  • Population dynamics — how many people are on the platform, and what are the relative proportions of M vs F? All of our simulations will start with an even split of 1000 M and 1000 F. Everyone will be assigned a desirability value from 1 to 10, and desirability will be evenly distributed. However, as we add complexities to the system like user churn, the gender balance may shift over time!
  • Ranking (θ̂d) — our simulations will start with a system where the profiles seen by users are randomly determined. However, that is not actually how the systems work. Although making a sophisticated ranking algorithm is beyond the scope of this article, we will introduce a ranking method that is biased towards showing more desirable profiles.

We also need to detail how exactly the sequence of events work:

  1. 1

    Impressions. Users see x profiles, based on their swiping behaviors (μn, σn) and the platform’s ranking (θ̂d).

  2. 2

    Swipe & match. They swipe on profiles that meet their current desirability thresholds (μf, σf). A match happens wherever both sides swiped yes.

  3. 3

    Adapt. After all users have done this, we check whether each person’s actual match rate hit their μr, and nudge their thresholds by ra accordingly. This is essentially the user becoming more or less picky based on their prior experiences.

  4. 4

    Churn & entry. We calculate whether any users have decided to leave the platform. For each person that left, we randomly select a new human (of either gender) to take their place. So even if 10 males leave, that doesn’t mean 10 males join.

Then we loop this over and over and over again.

It should be noted that unlike with Lotka–Volterra, this system is NOT an equation. Instead, we are creating a simulator where we can run virtual experiments. In the simulator there will be individual users (‘humans’) who will have certain characteristics that determine their behavior on our simulated marketplace.

Because we are using a simulation, instead of looking at equations to analyze the system, we will check out how changing different parameters impacts overall outcomes. This allows us to learn how small changes can lead to behaviors we might see in real life.

Simulations

Now that we have the foundations for conceptualizing a dating app marketplace, we can start to create simulations.

In analyzing these simulations we will use multiple perspectives: first the trends at a population level, while also zooming all the way in into the experiences of individuals within the system. There are two reasons for also evaluating individual perspectives:

  • looking at what happens to individuals within the system help us debug our simulation - its easier to wrap our heads around what’s supposed to happen to an individual, and we can more easily find bugs
  • statistics tends to remove the humanity of the problem we’re evaluating - following the experiences of individuals will help us empathize with the problems they face, as the paramaters of the simulation change

In order to understand how different parts of the system impact final outcomes, we will start with a system of 2000 Males and 2000 Females where M and F act the same on dating apps (on average). Although the real world is not like this, this starting point gives us a baseline that we can explore from by tweaking one variable in the system at a time.

As you walk through these different simulations, I recommend taking a look at the population results for that scenario, and then stepping through the individual experiences of the various users within the system. Develop an intuition around why different types of users might have these different outcomes, and try to explain to yourself why the data looks the way that it does. After that, tap to reveal my thoughts on the simulation, and decide if you agree with me, or think I got this all wrong. I found a lot of joy in thinking through these questions, and I hope you find joy in them too.

Or don’t do that at all - I’m not your dad 🤷🏽‍♂️

Baseline: M/F Equality

The baseline case: what happens to everyone when M and F behave identically and nobody leaves? We can see there is inequality due to the distribution of desirability (this is evenly distributed from 1 to 10), but the outcomes for M and F are the same.

Pure equality, no churn (baseline)

25018812563012345678910DesirabilityImpressions
Gini: Matches0.30
Lower Thresh: M5.28
Lower Thresh: F5.41

Dating-marketplace scenario "Pure equality, no churn (baseline)". Match Gini 0.30. Lower acceptance threshold — M: 5.28, F: 5.41. Chart of impressions / likes / matches / match quality by desirability bucket (1-10), one curve each for M and F, toggle between metrics with the buttons above the chart.

Male
Female
Day 1 of 21

Press Playto swipe as Derek

0 sent 0 rejected 0 not seen
0 likes 0 matches

Step through a real dating-marketplace persona's actual recorded swipes, one at a time. Pick one of 6 people — three men, three women, spanning low to high desirability — then press Play to auto-play their real swipes and notifications. A sent like either turns into a match, gets turned down once the other person independently encounters it, or — unlike a real app — can sit forever unseen if the matching algorithm never re-surfaces it to them.

Because the marketplace simply shows other users randomly, everyone gets roughly the same number of impressions (views from other users). Unsurprisingly, the most attractive users will get more likes.

The story is more surprising when looking at matches: we see that upper-middle desirability buckets get the least amount of matches. This is actually due to more desirable users being able to be much pickier with who they match with. An undesirable user is unlikely to ever get enough likes to make them pickier. But more desirable users actually do get lots of likes, enabling them to become extremely picky.

You may be wondering, “if this is true, why don’t the highest desirability users have the lowest amount of matches?”. This is actually due to a quirk of the simulation! A hidden rule that I added was that users could not become so picky that they would reject users who are 9.5+. This artificially reduces the ‘standards’ of very high desirability individuals, making them less picky relative to their desirability. This resulted in many more matches.

If you’re curious about how I proved that this was the mechanism, I don’t have the time to explain within this article. However, if you download the python files at the end of the article and look through the explore.ipynb file, you’ll be able to see the python code I used to test out this hypothesis!

If we switch gears and look at the individual experiences instead of the population stats, I found the experiences of Derek and Priya interesting. Although they are examples of ‘undesirable’ individuals in our system, they still get quite a few matches. This will change as we change the parameters of our simulations, so keep an eye on them as you explore further!

Introduce “thirstiness”

Now let’s break the symmetry: based on the experiences of my friends, I think men are willing to:

  • swipe on slightly less desirable profiles
  • and they swipe more

Essentially, they are thirsty. So we implemented these changes into the M population within our system:

Thirsty Men

1000750500250012345678910DesirabilityImpressions
Gini: Matches0.36
Lower Thresh: M4.41
Lower Thresh: F6.35

Dating-marketplace scenario "Thirsty Men". Match Gini 0.36. Lower acceptance threshold — M: 4.41, F: 6.35. Chart of impressions / likes / matches / match quality by desirability bucket (1-10), one curve each for M and F, toggle between metrics with the buttons above the chart.

Male
Female
Day 1 of 21

Press Playto swipe as Derek

0 sent 0 rejected 0 not seen
0 likes 0 matches

Step through a real dating-marketplace persona's actual recorded swipes, one at a time. Pick one of 6 people — three men, three women, spanning low to high desirability — then press Play to auto-play their real swipes and notifications. A sent like either turns into a match, gets turned down once the other person independently encounters it, or — unlike a real app — can sit forever unseen if the matching algorithm never re-surfaces it to them.

I was very suprised by these results - simply by making M more thirsty, we can see a HUGE change in the outcomes by gender and desirability. Less attractive M get much fewer matches, while less attractive F end up having the highest number of matches.

Why is this? Well, because M send so many more likes, F are able to be much pickier. Because F become pickier, their thresholds for who is acceptable for them shift up. This leads to lower desirability M being unable to compete for matches, while high desirability M continue to be very successful.

Its fascinating that such a small change led to these large asymmetries, and I suspect that much of the inequality in outcomes in real marketplaces is due to this difference in thirstyness!

Introduce algorithmic ranking

Real platforms don’t just show a random feed of profiles. In order to entice users to stay on the platform longer and swipe more, they have sophisticated algorithms to determine who to show and when.

Without overcomplicating this, we can keep our basic random sorting of users, but with a bias to show more attractive (high desirability) profiles first.

Thirsty Men + Ranking

1000750500250012345678910DesirabilityImpressions
Gini: Matches0.39
Lower Thresh: M4.24
Lower Thresh: F6.04

Dating-marketplace scenario "Thirsty Men + Ranking". Match Gini 0.39. Lower acceptance threshold — M: 4.24, F: 6.04. Chart of impressions / likes / matches / match quality by desirability bucket (1-10), one curve each for M and F, toggle between metrics with the buttons above the chart.

Male
Female
Day 1 of 21

Press Playto swipe as Derek

0 sent 0 rejected 0 not seen
0 likes 0 matches

Step through a real dating-marketplace persona's actual recorded swipes, one at a time. Pick one of 6 people — three men, three women, spanning low to high desirability — then press Play to auto-play their real swipes and notifications. A sent like either turns into a match, gets turned down once the other person independently encounters it, or — unlike a real app — can sit forever unseen if the matching algorithm never re-surfaces it to them.

This was another surprise - I thought ranking algorithms greatly increase inequality in the system. Yet we see only a small change in inequality relative to the previous simulation. This suggests that M thirstyness is the biggest driver of inequality.

However, this could be because there is only a limited number of profiles within this simulation. Over time, users may see all the other profiles that exist, regardless of what ranking algorithm we use. So in order for ranking to matter, we have to also allow for users to exit and enter the system over time.

Introduce user churn

This brings us to user churn: what makes someone leave the platform?

  • Relationship from the platform — proportional to matches obtained, but probably a logistic function that levels off at some point.
  • Relationship outside the platform — proportional to the desirability of the user.
  • Churn due to discontent — proportional to time on the platform, and inversely proportional to the number of recent matches.

After a user has swiped and gotten new matches, we then calculate their probability of churn for that day (exact churn calculations can be found in the code at the end of this article). For users that churn, we randomly find another user to replace them. The replacement user is NOT guaranteed to be the same gender as who left.

For these simulations, we run the system for 200 days in order to let changes over time ‘bake’. Then we collected the lifetime stats for all users who were active in the last 20 days of the simulation:

Thirsty Men + Ranking + Churn

250018751250625012345678910DesirabilityImpressions
Gini: Matches0.47
Lower Thresh: M3.56
Lower Thresh: F5.88

Dating-marketplace scenario "Thirsty Men + Ranking + Churn". Match Gini 0.47. Lower acceptance threshold — M: 3.56, F: 5.88. Chart of impressions / likes / matches / match quality by desirability bucket (1-10), one curve each for M and F, toggle between metrics with the buttons above the chart.

Male
Female
Day 1 of 21

Press Playto swipe as Derek

0 sent 0 rejected 0 not seen
0 likes 0 matches

Step through a real dating-marketplace persona's actual recorded swipes, one at a time. Pick one of 6 people — three men, three women, spanning low to high desirability — then press Play to auto-play their real swipes and notifications. A sent like either turns into a match, gets turned down once the other person independently encounters it, or — unlike a real app — can sit forever unseen if the matching algorithm never re-surfaces it to them.

Now we see a big increase in inequality. If you go through the simulations for individual users, it is especially depressing to see the experiences of Derek. At the end of his 20 days on the platform, he has sent almost 300 likes, while getting 1 match. Can you imagine how you would feel if you were on a dating app, and this was your experience?

I theorize that the inequality is driven by which users are most likely to churn. We’ve set parameters in such a way that the biggest reason for churn is due to matches on the platform. This leads to the types of users with many matches to be more likely to leave over time.

We can see this happening by looking at a few different charts over time:

M/F Breakdown over time

0%25%50%75%100%120406080100120140160180200Day

Day 200: M 60.7% · F 39.3%

This is because F on average have more matches leading to higher churn rates among F from the platform. As there are more M on the platform over time, this drives more inequality as more and more M compete for impressions/likes/matches with fewer and fewer F.

M/F Desirability over time

246810120406080100120140160180200Day

Day 200: M 4.4 · F 5.1

We also see the average quality of M degrades over time as well! The reason for this is that high desirability M have many more matches than less desirable M, so that they preferentially leave the platform. This trend is not as pronounced for F - although there is variance in the # of matches obtained by F, all F have quite a few matches.

Desirability of profiles seen by M/F over time

246810120406080100120140160180200Day

Day 200: M 7.2 · F 7.3

Interestingly, even though the quality of M degrades over time, the quality of M seen by F on the platform stays stable. This is because even though there are fewer and fewer high desirability M on the platform, the algorithm still preferences the few of those M available. This drives additional inequality, as highly desirable M get more and more impressions over time.

Changing the algorithm

You may feel that I was arbitrarily choosing parameters in the earlier simulations. You’re right! I was. What would happen if instead we chose different parameters? How would these changes shift the simulation?

Let’s look at how the outcomes of the system change as we increase how biased the algorithm is towards more desirable profiles. We can do this by rerunning the same simulations over and over, while incrementing through different values of θ̂d. We can measure the change in inequality of the system by plotting the Gini Coefficient. This will allow us to see, at a glance, how a changing algorithm changes inefficiency in the system.

In addition, our previous simulations have looked at overall Gini calculated using the distribution of # of matches by users. For this next chart, I added gender specific Gini coefficients. Essentially, what is the measure of inequality across just men, and what is the measure of inequality across just women?

Inequality by Ranking Bias

0.200.300.400.500.600.700.800.01.02.03.04.05.06.07.08.09.010.0Ranking desirability bias (θ̂d)Gini CoefficientNamibiaUnited StatesNetherlands

Unsurprisingly, increasing the bias towards showing more attractive profiles leads to more inequality over time. A more biased algorithm reduces impressions for less desirable individuals, giving them fewer and fewer opportunities to get matches. The users who are most attractive end up consolidating all of the impressions, and therefore more of the matches as well. This impacts both men and women, though men’s thirstiness leaves less desirable females better off than less desirable males.

However, it is shocking just how unequal these systems end up being. For some comparisons, I also added in the economic Gini values for 3 countries: the Netherlands (one of the most equal countries in the world), the US, and Nambia (the most unequal country in the world).

It’s crazy that datings apps are so unequal that they may be worse than the most economically unequal country in the world. Again, think about what it might be like to be an ‘undesirable’ user on these apps - how isolating and depressing that must be. As unequal as the US is with its 1% and 0.1%, these apps are WORSE. I will never espouse red-pill ideology, but the pain that birthed their worldview is real.

Optimal strategies for users

So far, we’ve only really discussed what happens to the overall system over time. But what about the experiences of individuals within the system? One question we could ask is: what are the best strategies to maximize matches?

Each virtual human in the system is created with certain characteristics. Obviously gender and desirability, but they also have different swiping behaviors on the platform. Some swipe many times per day, while others are less ‘thirsty’. Some are very picky (have a low match rate, only going for the best of the potential matches they could have), while others are not picky at all, and instead try to maximize total number of matches.

To answer these questions, I plotted out a heatmap where the axes are these two characteristics that the virtual humans could have. Then, for each combination of factors, we looked at how many matches (per day in the simulation) these humans got on average. Unsurprisingly, the users who both swiped the most AND were the least picky (high target match rate meant they were okay if low standards led to tons and tons of matches) had the most matches. This seemed true for both genders, and for all desirabilities.

Match Rate by Swiping Behaviors

Desirability
Swipe 0–8, target rate 0–3%: 0.1 matches/day avg (n=188)Swipe 8–15, target rate 0–3%: 0.2 matches/day avg (n=162)Swipe 15–20, target rate 0–3%: 0.2 matches/day avg (n=166)Swipe 20–25, target rate 0–3%: 0.3 matches/day avg (n=188)Swipe 25–30, target rate 0–3%: 0.3 matches/day avg (n=166)Swipe 30–35, target rate 0–3%: 0.4 matches/day avg (n=171)Swipe 35–42, target rate 0–3%: 0.5 matches/day avg (n=141)Swipe 42–86, target rate 0–3%: 0.6 matches/day avg (n=170)Swipe 0–8, target rate 3–7%: 0.2 matches/day avg (n=83)Swipe 8–15, target rate 3–7%: 0.3 matches/day avg (n=88)Swipe 15–20, target rate 3–7%: 0.3 matches/day avg (n=83)Swipe 20–25, target rate 3–7%: 0.4 matches/day avg (n=99)Swipe 25–30, target rate 3–7%: 0.5 matches/day avg (n=66)Swipe 30–35, target rate 3–7%: 0.5 matches/day avg (n=87)Swipe 35–42, target rate 3–7%: 0.6 matches/day avg (n=79)Swipe 42–86, target rate 3–7%: 0.8 matches/day avg (n=82)Swipe 0–8, target rate 7–10%: 0.2 matches/day avg (n=102)Swipe 8–15, target rate 7–10%: 0.3 matches/day avg (n=95)Swipe 15–20, target rate 7–10%: 0.4 matches/day avg (n=77)Swipe 20–25, target rate 7–10%: 0.4 matches/day avg (n=93)Swipe 25–30, target rate 7–10%: 0.5 matches/day avg (n=100)Swipe 30–35, target rate 7–10%: 0.6 matches/day avg (n=83)Swipe 35–42, target rate 7–10%: 0.6 matches/day avg (n=101)Swipe 42–86, target rate 7–10%: 0.8 matches/day avg (n=89)Swipe 0–8, target rate 10–13%: 0.2 matches/day avg (n=83)Swipe 8–15, target rate 10–13%: 0.3 matches/day avg (n=73)Swipe 15–20, target rate 10–13%: 0.4 matches/day avg (n=89)Swipe 20–25, target rate 10–13%: 0.4 matches/day avg (n=89)Swipe 25–30, target rate 10–13%: 0.5 matches/day avg (n=96)Swipe 30–35, target rate 10–13%: 0.6 matches/day avg (n=92)Swipe 35–42, target rate 10–13%: 0.6 matches/day avg (n=81)Swipe 42–86, target rate 10–13%: 0.8 matches/day avg (n=92)Swipe 0–8, target rate 13–17%: 0.2 matches/day avg (n=75)Swipe 8–15, target rate 13–17%: 0.3 matches/day avg (n=96)Swipe 15–20, target rate 13–17%: 0.4 matches/day avg (n=83)Swipe 20–25, target rate 13–17%: 0.5 matches/day avg (n=87)Swipe 25–30, target rate 13–17%: 0.6 matches/day avg (n=78)Swipe 30–35, target rate 13–17%: 0.6 matches/day avg (n=86)Swipe 35–42, target rate 13–17%: 0.6 matches/day avg (n=110)Swipe 42–86, target rate 13–17%: 0.9 matches/day avg (n=81)Swipe 0–8, target rate 17–21%: 0.2 matches/day avg (n=100)Swipe 8–15, target rate 17–21%: 0.4 matches/day avg (n=91)Swipe 15–20, target rate 17–21%: 0.4 matches/day avg (n=89)Swipe 20–25, target rate 17–21%: 0.5 matches/day avg (n=86)Swipe 25–30, target rate 17–21%: 0.6 matches/day avg (n=92)Swipe 30–35, target rate 17–21%: 0.6 matches/day avg (n=74)Swipe 35–42, target rate 17–21%: 0.7 matches/day avg (n=83)Swipe 42–86, target rate 17–21%: 0.9 matches/day avg (n=97)Swipe 0–8, target rate 21–52%: 0.3 matches/day avg (n=79)Swipe 8–15, target rate 21–52%: 0.3 matches/day avg (n=79)Swipe 15–20, target rate 21–52%: 0.5 matches/day avg (n=82)Swipe 20–25, target rate 21–52%: 0.5 matches/day avg (n=82)Swipe 25–30, target rate 21–52%: 0.6 matches/day avg (n=85)Swipe 30–35, target rate 21–52%: 0.5 matches/day avg (n=69)Swipe 35–42, target rate 21–52%: 0.6 matches/day avg (n=98)Swipe 42–86, target rate 21–52%: 0.9 matches/day avg (n=90)0–88–1515–2020–2525–3030–3535–4242–860–3%3–7%7–10%10–13%13–17%17–21%21–52%Swipe volume (profiles/day)Target match rate
0.90
Matches/day

This makes sense! Swiping many times is ‘costless’ within the system: it does not impact any future outcomes. So if you just want matches, you should swipe as often as possible with loose standards in order to maximze your chance of any match.

This is also quite depressing - our earlier simulations showed how men being thirsty and swiping so much led to a lot of the inequality we see in the system. Yet the optimal strategy as an individual in the system is to swipe more! No wonder dating apps are unequal, its a giant Prisoner’s Dilemma: men on average would benefit if they swiped less, but its optimal for an individual man to swipe more!

However, you could imagine a change to the ranking algorithm: what if your swiping behavior impacted both the types of profiles you would see, and which profiles would see you? You can imagine an alternative system where the platform must learn what your desirability is (since its not an intrinsic factor it would know in real life), and uses an ELO system in order to rank profiles. This ranking then impacts your likelihood of being seen. In that world, swiping too often might not be the optimal strategy!

Takeaways from the simulations

For me, I walked away from this work with 3 lessons:

  • so many of the problems with dating apps are caused by men being thirstier (on average)
  • not only are men thirstier, but the optimal strategy is to be thirsty, even if all men would benefit from generally being less thirsty
  • damn, it sucks to be an ‘undesirable’ individual on a dating app, but it especially sucks to be an ‘undesirable’ man

It should also be noted that a gross simplification I made in this work was to represent human desirability as a single value between 1 and 10. Humans are complex, and the preferences and desires between humans is even more complex. A single value for desirability doesn’t represent true human connection. However, I would argue it does represent how a platform may try to intuit a user’s desirability for its own algorithms. You, dear reader, are complex and layered and beautiful in the eyes of others. However, a platform needs to reduce your complexity and represent your desirability in a simpler manner for its algorithms. And given how much emphasis dating apps put on physical appearances and the limited opportunities for personal expression, I suspect that these platforms are greatly diminishing your complexity.

It’s also not obvious to me how to fix any of this. Maybe dating app algorithms could bias less towards attractive profiles? Or they could impose harsh limits on the # of profiles that can be seen per day? But I suspect that this is a great way to go bankrupt as a dating app. Coffee Meets Bagel might be the app that is the closest to my ‘ideal’ dating app, but its not exactly big. Short of a societal decision that we do not want to partake in these sorts of platforms, I think the misery of dating apps is here to stay.

That being said, I do have some parting thoughts for anyone who’s struggling with dating apps right now.

A Critique of Dynamical Systems

A critique you could give of all of the above work is: “How the fuck do you know if any of this is real?” And the answer is: I don’t. But this is because I don’t actually have data about the outcomes for users on these marketplaces.

If I were working internally at one of these companies, I would look at churn rates, swiping behaviors, the actual ranking algorithm, etc., in order to fit my model to real data. The idea is that if my simple system can well approximate the behaviors seen in real life, then we can create hypotheses which can be experimentally verified.

For example, with a dating app model we could swap out different ranking algorithms and see what might happen to different types of users. These simulations can inform opportunities for future experimentation. The model is making predictions about what the data should show, and the experimental data can validate or disprove the model. If the data disagrees with what the model predicts, then this gives us valuable information to correct our model. Over time, as the model better approximates the real world, it can be used to speed up experiment velocity by letting us do ‘sanity checks’ in-silico before spending the time and energy on low-value real experiments.

My favorite use of these sorts of models is as a way to reason through problems from first principles. If I am mathematically or logically creating a system from the ground up, I am using first principles. Then real world data can help validate or disprove my model and the principles and assumptions underlying it.

Going back to Lotka–Volterra: it started as observations from the real world which were turned into equations by reasoning through first principles about what impacts populations over time. Those equations were useful because we had access to actual population data to compare the model against. The real data allows us to see that Lotkta-Volterra were onto something interesting, while also giving us lots of opportunities to improve the models over time because it still missed important nuances.

This does mean that my model is essentially useless until these companies release vast amounts more data about what happens on their platform. Unfortunately, this seems unlikely to ever occur.

Don’t trust me!

Another critique you could give is, “Are any of the simulations you showed legit?”. After all, it’s the internet - everyone lies. The best part about these simulations is that anyone can run them, adapt them, and most importantly: QA them. The code is in Python - the desktop version of this article includes the files and instructions on how to get started!

Run it yourself

No Python experience required!

  1. Install Python — skip if you already have 3.10+

    Grab the installer from python.org/downloads. Need help? The official guide for your OS walks through it:

  2. Download the kit

    All the files for the simulation in a handy zip file:

    dating-dynamics-kit.zip
    What's inside
    • dating_dynamics/humans.pyhow we create a population of virtual humans
    • dating_dynamics/matching.pyranking algorithms for the dating platform
    • dating_dynamics/churn.pyhow to determine who churns
    • dating_dynamics/metrics.pyfor metrics like the Gini coefficient
    • dating_dynamics/simulation.pythis specifies the inputs for a simulation
    • dating_dynamics/fast_sequential.pywhat actually runs the simulation
    • explore.ipynba notebook to help you get started - run this!
    • requirements.txtthe python packages you need
  3. Set up your environment

    Unzip it, open a terminal inside the folder, then:

    cd dating-dynamics-kit
    python3 -m venv .venv
    source .venv/bin/activate
    pip install -r requirements.txt
  4. Run the simulation

    Launch the notebook:

    jupyter lab

    Open explore.ipynb, then RunRun All Cells. You'll build a population, watch the market run for 50 days, and plot who's getting matched — then flip on churn and watch the gender balance drift.

Open this article on desktop to access the files for the simulations

Parting Thoughts

So far, this article has been very clinical: approaching online dating with an analytical viewpoint. Let’s switch gears and talk the human side for a bit.

Real Talk, w/ Imesh

For my fellas (sorry ladies, I am not equipped to represent you): Dating is hard. Online dating is extra hard. This article didn’t even touch on some of the difficulties of being a person of color on a dating app. I often think about this video:

Pretty brutal. However, life is unfair. We all know this! But what you do in face of that adversity is what defines you. Dating apps are not built with your interests in mind, so how can you find peace in that, and still achieve what you want to achieve?

For me, I spent time on the apps in two different parts of my life: right after college, and now. Being on those apps right after college destroyed me. My very fragile ego and brittle self confidence was not equipped to handle the constant rejection built into those platforms.

But it’s a bit different being on the apps now. Although I still face that rejection, and still struggle to get matches, it doesn’t poison my mind and my life (as much).

The reason for this is not because the platforms have changed - I suspect they have only gotten worse. Instead, I have changed. Over the (almost) decade between when I first started using the apps to now, Imesh is a different man. The crippling anxiety that plagued my mind growing up is still around (I argue that it’s what makes me so good at what I do), but it has been tempered by my deep self-confidence. Sure, rejection still sucks, but I know that I have worth now independent of what the platforms tell me.

I’m not sure who’s reading this. But if you are like 22 year old Imesh, I have two things to tell you. First, trust yourself - things will work out, just focus on the inputs. Focus on yourself, do hard things, spend time doing what you love, and build community and relationships (romantic and not!) where you can. You’ll wake up one day and be amazed by who you’ve become.

The second thing is that in a world where dating is increasingly online, take a chance on real life. I mentioned earlier that a lot of the issues with apps are due to a combination of platforms letting men be hyper-thirsty and the algorithms reducing someone’s beauty to a tiny profile. You know what has neither of those things? The real world.

If everyone is meeting each other online, being earnest and confident in person becomes a more unique trait. In a world where we increasingly are being commodified, categorized, and made replaceable, being able to make connections in person becomes increasingly special. Tell that person at the gym that you like their tattoo. Shoutout someone when you like their style. Admire earnestly and deeply and vocally.

Just…you know…don’t be thirsty about it. Treat others with respect and dignity. Inquire about the person beyond your physical attraction to them. Handle rejection gracefully. JUST DON’T BE WEIRD, PLEASE.

Anti-Trust

It’s hard to find good market share data about the online dating services market, but I do want to share one thing. Did you know that:

  • Tinder
  • Hinge
  • The League
  • OKCupid
  • Match.com
  • Plenty of Fish
  • and every combination of “{descriptor} People Meet” (my favorite is Pet People Meet)

are all owned by the same company? The only dating platform that anyone uses that is NOT owned by Match Group is Bumble (or maybe something newer, like Feeld).

This seems absurd to me - in a functioning market, if any company is being particular parasitic on its user base, users can switch to a competitor who will treat users better as a way to grow their base. However, in a world where basically every app is owned by the same company, all the apps can be equally extractive! Users have no other choice!

FTC - I know you and I have not always agreed in the past, but can you PLEASE do something about this? That is all.


Finally, a shoutout to Professor Alan Garfinkel!

Alan Garfinkel smiling in his office, seated at his desk with bookshelves, a Science News cover on chaos theory, and his book Modeling Life on the wall

The Professor who first taught me about Dynamical Systems; and the thinker who has made more of an impact on me, my thought processes, and how I approach the world than anyone else. I’m so lucky to have been able to take your class, and even luckier to have been able to work with you until I graduated.

You’re the reason I:

  • learned to code
  • started appreciating why right questions matter more than right answers
  • grew the confidence to speak up AND the spine to take a risk on being wrong

My life would be so different had I not crossed paths with you. This article is a love letter to your influence, and I hope there are no mistakes in here that are making you yell at the screen right now. If I did fuck up, you can always email me at imesh.c.samarakoon@gmail.com!

Get notified

I've got a lot of cool ideas in the works
no spam, unsubscribe anytime