add mod_oop\decision_tree sol
This commit is contained in:
parent
73cdb1320e
commit
b4c92e894b
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user