User:Lucasvb/An upgrade to the spatial model of voters: Difference between revisions

 
(8 intermediate revisions by 2 users not shown)
Line 1:
= An upgrade to the spatial model of voters =
 
In the following article, I'll explain ana possible alternate [[spatial model of votersvoting]], which is an upgrade of the typical geometric model and hascontains it as a special case.
 
I believe this model encapsulates many important aspects that have been missing from most analyses so far. But remember, it's still just a ''model''.
Line 13:
Now suppose you go around and ask people their opinion regarding many such issues, under those specific framings, and that people answered you honestly and accurately to the best of their knowledge. (We can't really expect more than that, as we can't read people's minds.)
 
At the very least, we would like to know whether they agree or disagree with the statement. But we could also ask how strongly they feel about that position, how certain they are of it, and how important they feel it is to hold that position.
 
One way to convert this into a numerical scale is by considering the following parameters:
Line 31:
This kind of model has been used extensively in political polls for decades. The popular website [https://isidewith.com/ I Side With] uses a very similar model.
 
Of course, there's the problemquestion of how can we treat similar answers as compatible. It is possible to formally justify this, but that's a much deeper problemdiscussion. Since this is just a justification of a mathematical model for simulations, we don't really need to worry about it too much.
 
==== Stances ====
Line 122:
We would expect that if both opinions are already similar, not a lot of convincing is required. We would also expect that the further apart the "opinion units" need to be relocated, the more difficult it is to change someone's opinion.
 
In mathematics and engineering, this is a well-studied problem of [https[w://en.wikipedia.org/wiki/Transportation_theory_Transportation theory (mathematics) |optimal transport]], and it has found uses everywhere, from artificial intelligence to traffic management.
 
The intuitive notion of how "difficult" it is to convince someone to believe something else, piece by piece, is captured by the '''''[https[w://en.wikipedia.org/wiki/Earth_mover%27s_distanceearth-mover's distance|earth-mover's distance]]''''' ('''''EMD''''') between two distributions. It is, intuitively, the least amount of effort you would need to rearrange one pile of dirt into another pile of dirt.
 
If you replace "dirt" with "opinion unit", you'll immediately arrive at our idea here.
Line 160:
Note that different issues are never compared with one another here. Only opinions on the same issue count towards each term.
 
It should be clear that that if the distributions are infinitely sharp (i.e. [https[w://en.wikipedia.org/wiki/Dirac_delta_functionDirac delta function|Dirac deltas]]), the earth-mover's distance is simply the distance between those two sharp peaks. In this way, we recover the old traditional spatial model from our model.
 
=== Why the Euclidean distance anyway? ===
 
We could have considered other distances (or "metrics") in the same way, but why single out the EuclieanEuclidean one? Why not use
 
:<math>d(a,b) = \sum_{i=1}^{N} \text{EMD}(a_i(x),b_i(x))), </math>
Line 188:
== Implementation ==
 
In practice, it's up to us to determine how sharply-peaked the distributions can get.
The earth-mover's distance is simple and efficient to compute in a discrete case, where the distribution is defined in a number of bins. This makes it readily available in many software packages.
 
As a first approximation, it is helpful to model the distribution as a simple trapezoidal distribution, instead of a normal distribution.
The earth-mover's distance is simple and efficient to compute in a discrete 1D case, where the distribution is defined in a number of bins. This makes it readily available in many software packages.
 
AsUnder this setup, the sharpest distribution is 1 bin wide. So as a first approximation, it is helpful to model the distribution as a simple trapezoidal distribution, instead of a normal distribution.
 
In my simulations, I've defined an integer parameter <tt>L</tt>, the resolution of one side of the belief axis. In order to make 0 a valid belief, it is best to use an odd number of bins, so the total number of bins is given by <tt>W = 2*L+1</tt>.
Line 195 ⟶ 198:
The following Python code generates the trapezoid distribution for a given opinion, with belief from -1 to +1, and importance from 0 to 1.
 
<syntaxhighlight lang="python">
import numpy as np
from scipy.stats import wasserstein_distance
 
L = 5 # bin resolution (number of degrees of agreement/disagreement)
W = 2*L+1 # total number of bins, an odd number so we have a clean zero
_space = np.linspace(-1,1,W) # array with positions of the bins
 
# Earth-mover's distance (or Wasserstein distance) between two opinion distributions
def EMD(dist1,dist2):
def return wasserstein_distanceEMD(_space,_space,dist1,dist2):
return wasserstein_distance(_space,_space,dist1,dist2)
 
# Generates an opinion distribution as a truncated & bounded trapezoidal distribution
# belief: from -1 to +1
# importancebelief: from 0-1 to +1
def# opinion(belief, importance): from 0 to 1
def w = opinion(1 -belief, importance)*(W-1) + 1:
v w = (w+1)/2 - Limportance)*abs(np.linspace(W-1,1,W) -+ belief*importance)1
v = (w+1)/2 - L*abs(np.linspace(-1,1,W) - belief*importance)
v[v < 0] = 0
v[v >< 10] = 10
v[v /> 1] = sum(v)1
v /= sum(v)
return v
 
# Visualize distribution with text blocks
def diststr(op):
return "".join(["_▁▂▃▄▅▆▇█"[int(r/max(op)*7)] for r in op]) # we go up to 7 because the full block looks bad piled up
 
# Show some distributions generated
for w in range(1,W+1):
for cw = 1 -in range(w-1)/(,W-+1):
for x in rangec = 1 - (w-1)/(W-L,L+1):
op = opinion(for x/ in range(-L,cL+1):
o1 op = opinion(b1x/L, i1c)
print("(%+0.03f|%0.03f)" % (x/L,c), diststr(op))
 
# Print a few distances
for i in range(10):
for wi in range(1,W+110):
b1, b2 = np.random.rand()*2-1, np.random.rand()*2-1
i1 b1, i2b2 = np.random.rand()*2-1, np.random.rand()*2-1
b1 i1, b2i2 = np.random.rand()*2-1, np.random.rand()*2-1
o1 = opinion(b1, i1)
o2 o1 = opinion(b2b1, i2i1)
o2 = opinion(b2, i2)
print(
"(%+0.03f|%0.03f)" % (b1,i1), diststr(o1),
"vs",
"vs",
diststr(o2), "(%+0.03f|%0.03f)" % (b2,i2),
"= %0.04f" % EMD(o1,o2))
</syntaxhighlight>
295

edits