📘 Formal concepts

📘 Formal concepts#

Formal concepts are the building blocks of formal concept analysis (FCA), representing the relationships between a set of items and their attributes. In the GALACTIC framework, formal concepts are implemented using the Concept class of the galactic.algebras.concept.core module, which allows for the creation, manipulation, and analysis of these concepts within a given antitone Galois connection.

Creating concepts#

The constructor of the Concept class takes an instance of the GaloisConnection class as input, which defines the context in which the concepts are formed and optionnally an iterable of items or attributes to initialize the concept. When neither items nor attributes are provided, the concept is initialized as the top concept (with full extent and smallest intent).

from galactic.algebras.concept.core import (
    Concept,
    GaloisConnection,
    create_context_from_dataset
)
from galactic.algebras.concept.examples.animals.core import ANIMAL_ATTRS, ANIMAL_DATA
context = create_context_from_dataset(ANIMAL_DATA, ANIMAL_ATTRS)
connection = GaloisConnection(context)
top = Concept(connection=connection)
top
bottom = Concept(connection=connection, items=[])
bottom
<galactic.algebras.concept.core.Concept object at 0x7d95025bc7c0>

The extent and intent of the concept can be accessed using the extent and intent attributes, respectively. They are closed sets of items and attributes within the context of the antitone Galois connection.

display(top.extent, list(top.extent))
display(top.intent, list(top.intent))
display(bottom.extent, list(bottom.extent))
display(bottom.intent, list(bottom.intent))
<galactic.algebras.concept.core.Extent object at 0x7d9502440a00>
[Item(key='Dove', value=<list object at 0x7d9502426240>),
 Item(key='Hen', value=<list object at 0x7d9502426580>),
 Item(key='Duck', value=<list object at 0x7d9502426280>),
 Item(key='Goose', value=<list object at 0x7d95024265c0>),
 Item(key='Owl', value=<list object at 0x7d9502426600>),
 Item(key='Hawk', value=<list object at 0x7d9502426640>),
 Item(key='Eagle', value=<list object at 0x7d9502426680>),
 Item(key='Fox', value=<list object at 0x7d95024266c0>),
 Item(key='Dog', value=<list object at 0x7d9502426700>),
 Item(key='Wolf', value=<list object at 0x7d9502426740>),
 Item(key='Cat', value=<list object at 0x7d9502426780>),
 Item(key='Tiger', value=<list object at 0x7d95024267c0>),
 Item(key='Lion', value=<list object at 0x7d9502426800>),
 Item(key='Horse', value=<list object at 0x7d9502426840>),
 Item(key='Zebra', value=<list object at 0x7d9502426880>),
 Item(key='Cow', value=<list object at 0x7d95024268c0>)]
<galactic.algebras.concept.core.Intent object at 0x7d95024497c0>
[]
<galactic.algebras.concept.core.Extent object at 0x7d9502691b00>
[]
<galactic.algebras.concept.core.Intent object at 0x7d9502440a80>
[<function small at 0x7d9502ddef20>,
 <function medium at 0x7d950241fec0>,
 <function big at 0x7d950243c040>,
 <function twolegs at 0x7d950243c400>,
 <function fourlegs at 0x7d950243c7c0>,
 <function hair at 0x7d950243cb80>,
 <function feathers at 0x7d950241ea20>,
 <function fly at 0x7d950243d260>,
 <function swim at 0x7d950243d620>,
 <function run at 0x7d950243d9e0>,
 <function hunt at 0x7d950243dda0>,
 <function mane at 0x7d950243e160>,
 <function hooves at 0x7d950243e520>]

Operating on concepts#

The Concept class implements the Element protocol of the galactic.algebras.lattice.core module, which also provides methods to create concepts using the join (\(\vee\)) or meet (\(\wedge\)) operators.

concept_1 = Concept(
    connection=connection,
    items=[
        context.domain.item(key='Cat'),
        context.domain.item(key='Wolf'),
    ],
)
concept_2 = Concept(
    connection=connection,
    attrs=[
        context.co_domain.attr(name='mane'),
    ],
)
join = concept_1 | concept_2
meet = concept_1 & concept_2
display(meet.extent, list(meet.extent))
display(meet.intent, list(meet.intent))
display(join.extent, list(join.extent))
display(join.intent, list(join.intent))
display(meet <= join, meet.extent <= join.extent, meet.intent >= join.intent)
<galactic.algebras.concept.core.Extent object at 0x7d950245cfc0>
[Item(key='Wolf', value=<list object at 0x7d9502426740>),
 Item(key='Lion', value=<list object at 0x7d9502426800>)]
<galactic.algebras.concept.core.Intent object at 0x7d950245d040>
[<function fourlegs at 0x7d950243c7c0>,
 <function hair at 0x7d950243cb80>,
 <function run at 0x7d950243d9e0>,
 <function hunt at 0x7d950243dda0>,
 <function mane at 0x7d950243e160>]
<galactic.algebras.concept.core.Extent object at 0x7d9502dd7340>
[Item(key='Fox', value=<list object at 0x7d95024266c0>),
 Item(key='Dog', value=<list object at 0x7d9502426700>),
 Item(key='Wolf', value=<list object at 0x7d9502426740>),
 Item(key='Cat', value=<list object at 0x7d9502426780>),
 Item(key='Tiger', value=<list object at 0x7d95024267c0>),
 Item(key='Lion', value=<list object at 0x7d9502426800>),
 Item(key='Horse', value=<list object at 0x7d9502426840>),
 Item(key='Zebra', value=<list object at 0x7d9502426880>)]
<galactic.algebras.concept.core.Intent object at 0x7d95023faac0>
[<function fourlegs at 0x7d950243c7c0>,
 <function hair at 0x7d950243cb80>,
 <function run at 0x7d950243d9e0>]
True
True
True