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:
|
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:
|
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 marshal
|
||||||
import base64
|
import base64
|
||||||
|
Loading…
Reference in New Issue
Block a user