Skip to content

Gaussian fuzzy set #12328

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

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@
* [Vicsek](fractals/vicsek.py)

## Fuzzy Logic
* [Gaussian Fuzzy Set](fuzzy_logic/Gaussian_fuzzy_set.py)
* [Fuzzy Operations](fuzzy_logic/fuzzy_operations.py)

## Genetic Algorithm
Expand Down
105 changes: 105 additions & 0 deletions fuzzy_logic/Gaussian_fuzzy_set.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
"""

Check failure on line 1 in fuzzy_logic/Gaussian_fuzzy_set.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (N999)

fuzzy_logic/Gaussian_fuzzy_set.py:1:1: N999 Invalid module name: 'Gaussian_fuzzy_set'
By @Shreya123714

https://en.wikipedia.org/wiki/Fuzzy_set
https://en.wikipedia.org/wiki/Fuzzy_set_operations
https://en.wikipedia.org/wiki/Membership_function_(mathematics)
"""

from __future__ import annotations
from dataclasses import dataclass
import numpy as np
import matplotlib.pyplot as plt


@dataclass

Check failure on line 15 in fuzzy_logic/Gaussian_fuzzy_set.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (I001)

fuzzy_logic/Gaussian_fuzzy_set.py:9:1: I001 Import block is un-sorted or un-formatted
class GaussianFuzzySet:
"""
A class for representing and manipulating Gaussian fuzzy sets.

Attributes:
name: The name or label of the fuzzy set.
mean: The mean value (center) of the Gaussian fuzzy set.
std_dev: The standard deviation (controls the spread) of the Gaussian fuzzy set.
is_complement: Indicates whether this is the complement of the original fuzzy set.

Check failure on line 24 in fuzzy_logic/Gaussian_fuzzy_set.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

fuzzy_logic/Gaussian_fuzzy_set.py:24:89: E501 Line too long (90 > 88)

Methods:
membership(x): Calculate the membership value of an input 'x' in the fuzzy set.
complement(): Create a new GaussianFuzzySet instance representing the complement.

Check failure on line 28 in fuzzy_logic/Gaussian_fuzzy_set.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

fuzzy_logic/Gaussian_fuzzy_set.py:28:89: E501 Line too long (89 > 88)
plot(): Plot the membership function of the fuzzy set.

>>> fuzzy_set = GaussianFuzzySet("Medium Temperature", mean=25, std_dev=5)
>>> fuzzy_set.membership(25)
1.0
>>> fuzzy_set.membership(30)
0.6065306597126334
>>> fuzzy_set.complement().membership(25)
0.0
"""

name: str
mean: float
std_dev: float
is_complement: bool = False # This flag indicates if it's the complement set

def membership(self, x: float) -> float:
"""
Calculate the membership value of an input 'x' in the Gaussian fuzzy set.
If it's a complement set, returns 1 - the Gaussian membership.

>>> GaussianFuzzySet("Medium", 0, 1).membership(0)
1.0
>>> GaussianFuzzySet("Medium", 0, 1).membership(1)
0.6065306597126334
"""
membership_value = np.exp(-0.5 * ((x - self.mean) / self.std_dev) ** 2)
return 1 - membership_value if self.is_complement else membership_value

def complement(self) -> GaussianFuzzySet:
"""
Create a new GaussianFuzzySet instance representing the complement.

>>> GaussianFuzzySet("Medium", 0, 1).complement().membership(0)
0.0
"""
return GaussianFuzzySet(
f"¬{self.name}",
self.mean,
self.std_dev,
is_complement=not self.is_complement,
)

def plot(self):
"""
Plot the membership function of the Gaussian fuzzy set.
"""
x = np.linspace(
self.mean - 3 * self.std_dev, self.mean + 3 * self.std_dev, 1000
)
y = [self.membership(xi) for xi in x]
plt.plot(x, y, label=self.name)
plt.xlabel("x")
plt.ylabel("Membership")
plt.legend()


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

testmod()

# Create an instance of GaussianFuzzySet
fuzzy_set = GaussianFuzzySet("Medium Temperature", mean=25, std_dev=5)

# Display some membership values
print(f"Membership at mean (25): {fuzzy_set.membership(25)}")
print(f"Membership at 30: {fuzzy_set.membership(30)}")
print(
f"Complement Membership at mean (25): {fuzzy_set.complement().membership(25)}"
)

# Plot the Gaussian Fuzzy Set and its complement
fuzzy_set.plot()
fuzzy_set.complement().plot()
plt.title("Gaussian Fuzzy Set and its Complement")
plt.show()
Loading