What is an algorithm that will take as an input a flat list of objects with a varying degree of overlapping properties:
thing1 (instance of "Mammal", but we don't know this now)
-eatsFood
-reproduces
-hasMilk
thing2 (instance of "Emu", but we don't know this now)
-eatsFood
-reproduces
-laysEggs
-hasFeathers
-doesNotFly
thing3 (instance of "Eagle", but we don't know this now)
-eatsFood
-reproduces
-laysEggs
-hasFeathers
-flies
thing4 (another instance of "Eagle", we just know it has the same "shape" as thing 3)
-eatsFood
-reproduces
-laysEggs
-hasFeathers
-flies
thing5 (instance of "BaldEagle", but we don't know this now)
-eatsFood
-reproduces
-laysEggs
-hasFeathers
-flies
-hasWhiteHead
And return as an output a hierarchical class structure/inheritance tree/taxonomy like the following?
Notes:
- The algorithm is able to identify a hierarchical structure in the objects' properties, including abstract classes that are not explicitly present as objects in our data set. For example, there are no instances of "Bird" or "Animal" in our object data set, however the algorithm is able to identify that "Eagle" and "Emu" both inherit from a common parent class (the abstract class "Bird") and that both the "Bird" and "Mammal" classes inherit from a common parent class (the abstract class "Animal").
- The algorithm doesn't know or care about the class names ("Animal", "Mammal", "Bird", "Emu", "Eagle", "Bald Eagle"). We generate those ourselves based on the properties of the classes the algorithm has generated. I just put them here to aid the example, but they're not part of the algorithm.
- The list of an object's properties in the data set will not necessarily be "in order" like they are here. Don't assume any order to the properties in the raw data.