📘 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 0x7d2abaed93c0>

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 0x7d2aba65b800>
[Item(key='Dove', value=<list object at 0x7d2aba658f00>),
 Item(key='Hen', value=<list object at 0x7d2aba659340>),
 Item(key='Duck', value=<list object at 0x7d2aba659040>),
 Item(key='Goose', value=<list object at 0x7d2aba659380>),
 Item(key='Owl', value=<list object at 0x7d2aba6593c0>),
 Item(key='Hawk', value=<list object at 0x7d2aba659400>),
 Item(key='Eagle', value=<list object at 0x7d2aba659440>),
 Item(key='Fox', value=<list object at 0x7d2aba659480>),
 Item(key='Dog', value=<list object at 0x7d2aba6594c0>),
 Item(key='Wolf', value=<list object at 0x7d2aba659500>),
 Item(key='Cat', value=<list object at 0x7d2aba659540>),
 Item(key='Tiger', value=<list object at 0x7d2aba659580>),
 Item(key='Lion', value=<list object at 0x7d2aba6595c0>),
 Item(key='Horse', value=<list object at 0x7d2aba659600>),
 Item(key='Zebra', value=<list object at 0x7d2aba659640>),
 Item(key='Cow', value=<list object at 0x7d2aba659680>)]
<galactic.algebras.concept.core.Intent object at 0x7d2aba668640>
[]
<galactic.algebras.concept.core.Extent object at 0x7d2aba62b300>
[]
<galactic.algebras.concept.core.Intent object at 0x7d2aba65b7c0>
[<function small at 0x7d2abaeec900>,
 <function medium at 0x7d2aba65c2c0>,
 <function big at 0x7d2aba65c400>,
 <function twolegs at 0x7d2aba65c7c0>,
 <function fourlegs at 0x7d2aba65cb80>,
 <function hair at 0x7d2aba65cf40>,
 <function feathers at 0x7d2aba642de0>,
 <function fly at 0x7d2aba65d620>,
 <function swim at 0x7d2aba65d9e0>,
 <function run at 0x7d2aba65dda0>,
 <function hunt at 0x7d2aba65e160>,
 <function mane at 0x7d2aba65e520>,
 <function hooves at 0x7d2aba65e8e0>]

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 0x7d2aba679b00>
[Item(key='Wolf', value=<list object at 0x7d2aba659500>),
 Item(key='Lion', value=<list object at 0x7d2aba6595c0>)]
<galactic.algebras.concept.core.Intent object at 0x7d2aba6799c0>
[<function fourlegs at 0x7d2aba65cb80>,
 <function hair at 0x7d2aba65cf40>,
 <function run at 0x7d2aba65dda0>,
 <function hunt at 0x7d2aba65e160>,
 <function mane at 0x7d2aba65e520>]
<galactic.algebras.concept.core.Extent object at 0x7d2abaeb2a80>
[Item(key='Fox', value=<list object at 0x7d2aba659480>),
 Item(key='Dog', value=<list object at 0x7d2aba6594c0>),
 Item(key='Wolf', value=<list object at 0x7d2aba659500>),
 Item(key='Cat', value=<list object at 0x7d2aba659540>),
 Item(key='Tiger', value=<list object at 0x7d2aba659580>),
 Item(key='Lion', value=<list object at 0x7d2aba6595c0>),
 Item(key='Horse', value=<list object at 0x7d2aba659600>),
 Item(key='Zebra', value=<list object at 0x7d2aba659640>)]
<galactic.algebras.concept.core.Intent object at 0x7d2abaed7940>
[<function fourlegs at 0x7d2aba65cb80>,
 <function hair at 0x7d2aba65cf40>,
 <function run at 0x7d2aba65dda0>]
True
True
True