From b4c92e894b40617ce43d1355d41e2dc9f7cf5a66 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 8 Apr 2024 17:23:37 +0300 Subject: [PATCH] add mod_oop\decision_tree sol --- mod_oop/decision_tree.py | 80 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/mod_oop/decision_tree.py b/mod_oop/decision_tree.py index cb54340..bd288b3 100644 --- a/mod_oop/decision_tree.py +++ b/mod_oop/decision_tree.py @@ -1,10 +1,86 @@ +# https://stepik.org/lesson/701984/step/10?unit=702085 + + class DecisionTree: - ... + @classmethod + def predict(cls, root, x): + """для построения прогноза (прохода по решающему дереву) для вектора x из корневого узла дерева root""" + if not root.is_leaf: + return cls.predict(root.left if x[root.indx] else root.right, x) + return root.value + + @classmethod + def add_obj(cls, obj, node=None, left=True): + """для добавления вершин в решающее дерево (метод должен возвращать добавленную вершину - объект класса TreeObj); + + В методе add_obj параметры имеют, следующие значения: + + obj - ссылка на новый (добавляемый) объект решающего дерева (объект класса TreeObj); + node - ссылка на объект дерева, к которому присоединяется вершина obj; + left - флаг, определяющий ветвь дерева (объекта node), к которой присоединяется объект obj (True - к левой ветви; False - к правой). + """ + + if node: + if left: + node.left = obj + else: + node.right = obj + return obj class TreeObj: - ... + def __init__(self, indx, value=None): + """indx - проверяемый индекс (целое число); + value - значение с данными (строка); + __left - ссылка на следующий объект дерева по левой ветви (изначально None); + __right - ссылка на следующий объект дерева по правой ветви (изначально None). + """ + self.indx, self.value, self.__left, self.__right = indx, value, None, None + @property + def left(self): + return self.__left + + @property + def is_leaf(self): + return self.__left is None and self.__right is None + + @left.setter + def left(self, left): + self.value = None + self.__left = left + + @property + def right(self): + return self.__right + + @right.setter + def right(self, right): + self.value = None + self.__right = right + + +# -------------------------- + + +def use(): + root = DecisionTree.add_obj(TreeObj(0)) + v_11 = DecisionTree.add_obj(TreeObj(1), root) + v_12 = DecisionTree.add_obj(TreeObj(2), root, False) + DecisionTree.add_obj(TreeObj(-1, "будет программистом"), v_11) + DecisionTree.add_obj(TreeObj(-1, "будет кодером"), v_11, False) + DecisionTree.add_obj(TreeObj(-1, "не все потеряно"), v_12) + DecisionTree.add_obj(TreeObj(-1, "безнадежен"), v_12, False) + + x = [1, 1, 0] + res = DecisionTree.predict(root, x) # будет программистом + print(res) + assert res == "будет программистом", "будет программистом же?" + + +use() + +# -------------------------- import marshal import base64