add mod_oop\decision_tree sol

This commit is contained in:
Dmitry Belyaev 2024-04-08 17:23:37 +03:00
parent 73cdb1320e
commit b4c92e894b

View File

@ -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