Skip to content

[ADD] : maths joint probabilty distribution #10508

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
Oct 15, 2023
Merged
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
710f64e
Create joint_probability_distribution.py
leonado10000 Oct 15, 2023
32279e0
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
8fb17b5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
0f872bf
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
6c3d5a2
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
77c3a91
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
ba59bad
Merge branch 'TheAlgorithms:master' into master
leonado10000 Oct 15, 2023
c9e1d69
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
61661ad
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
a6d6ad8
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
6a26182
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
eea508d
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
acebaa0
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
53f630b
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
8ce6629
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
257ea79
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
4b07535
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
232b7b8
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
b301636
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
824a378
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
a3d1b12
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
5a86c99
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
f99e4d5
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
d80e546
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
6a4b223
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
a0c7fdb
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
198558b
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
cc3db54
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
848077e
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
c453741
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
7a94fe2
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
e5e5a91
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
544b648
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
463c067
Update joint_probability_distribution.py
leonado10000 Oct 15, 2023
a9b592f
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
bb64341
Update maclaurin_series.py
leonado10000 Oct 15, 2023
74ca473
Merge branch 'master' of https://github.com/leonado10000/Python
leonado10000 Oct 15, 2023
d853110
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 15, 2023
c5bcbb1
Revert changes to maclaurin_series.py
cclauss Oct 15, 2023
66c5acb
Revert changes to maclaurin_series.py
cclauss Oct 15, 2023
9168beb
Update joint_probability_distribution.py
cclauss Oct 15, 2023
26cf878
Update joint_probability_distribution.py
cclauss Oct 15, 2023
c1009e5
Update joint_probability_distribution.py
cclauss Oct 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions maths/joint_probability_distribution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
"""
Calculate joint probability distribution
https://en.wikipedia.org/wiki/Joint_probability_distribution
"""


def joint_probability_distribution(
x_values: list[int],
y_values: list[int],
x_probabilities: list[float],
y_probabilities: list[float],
) -> dict:
"""
>>> joint_distribution = joint_probability_distribution(
... [1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2]
... )
>>> from math import isclose
>>> isclose(joint_distribution.pop((1, 8)), 0.14)
True
>>> joint_distribution
{(1, -2): 0.21, (1, 5): 0.35, (2, -2): 0.09, (2, 5): 0.15, (2, 8): 0.06}
"""
return {
(x, y): x_prob * y_prob
for x, x_prob in zip(x_values, x_probabilities)
for y, y_prob in zip(y_values, y_probabilities)
}


# Function to calculate the expectation (mean)
def expectation(values: list, probabilities: list) -> float:
"""
>>> from math import isclose
>>> isclose(expectation([1, 2], [0.7, 0.3]), 1.3)
True
"""
return sum(x * p for x, p in zip(values, probabilities))


# Function to calculate the variance
def variance(values: list[int], probabilities: list[float]) -> float:
"""
>>> from math import isclose
>>> isclose(variance([1,2],[0.7,0.3]), 0.21)
True
"""
mean = expectation(values, probabilities)
return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities))


# Function to calculate the covariance
def covariance(
x_values: list[int],
y_values: list[int],
x_probabilities: list[float],
y_probabilities: list[float],
) -> float:
"""
>>> covariance([1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2])
-2.7755575615628914e-17
"""
mean_x = expectation(x_values, x_probabilities)
mean_y = expectation(y_values, y_probabilities)
return sum(
(x - mean_x) * (y - mean_y) * px * py
for x, px in zip(x_values, x_probabilities)
for y, py in zip(y_values, y_probabilities)
)


# Function to calculate the standard deviation
def standard_deviation(variance: float) -> float:
"""
>>> standard_deviation(0.21)
0.458257569495584
"""
return variance**0.5


if __name__ == "__main__":
from doctest import testmod

testmod()
# Input values for X and Y
x_vals = input("Enter values of X separated by spaces: ").split()
y_vals = input("Enter values of Y separated by spaces: ").split()

# Convert input values to integers
x_values = [int(x) for x in x_vals]
y_values = [int(y) for y in y_vals]

# Input probabilities for X and Y
x_probs = input("Enter probabilities for X separated by spaces: ").split()
y_probs = input("Enter probabilities for Y separated by spaces: ").split()
assert len(x_values) == len(x_probs)
assert len(y_values) == len(y_probs)

# Convert input probabilities to floats
x_probabilities = [float(p) for p in x_probs]
y_probabilities = [float(p) for p in y_probs]

# Calculate the joint probability distribution
jpd = joint_probability_distribution(
x_values, y_values, x_probabilities, y_probabilities
)

# Print the joint probability distribution
print(
"\n".join(
f"P(X={x}, Y={y}) = {probability}" for (x, y), probability in jpd.items()
)
)
mean_xy = expectation(
[x * y for x in x_values for y in y_values],
[px * py for px in x_probabilities for py in y_probabilities],
)
print(f"x mean: {expectation(x_values, x_probabilities) = }")
print(f"y mean: {expectation(y_values, y_probabilities) = }")
print(f"xy mean: {mean_xy}")
print(f"x: {variance(x_values, x_probabilities) = }")
print(f"y: {variance(y_values, y_probabilities) = }")
print(f"{covariance(x_values, y_values, x_probabilities, y_probabilities) = }")
print(f"x: {standard_deviation(variance(x_values, x_probabilities)) = }")
print(f"y: {standard_deviation(variance(y_values, y_probabilities)) = }")