笔记_孤立森林代码(引用自@weixin_44575152)

去看了看大佬的论文,虽然大概明白了一些意思,但是好像还是不太懂(懂了,但不完全懂.jpg)。于是就基本放弃了完全懂之后自己实现,就试着读懂别人的轮子,最少大概明白怎么用
引用的是这位博主的代码 传送门 致上感谢
python的基本语法我还没有完全忘记…大概还是能啃动的
还是要感慨一下 python的变量不必声明类型 如果我之后写什么东西,争取写好注释,是什么东西一眼看过去清清楚楚的就好了(flag)
(就算退役了我怎么还在不停地学东西啊…最近好像肠胃感冒了,也许是看不懂论文的缘故[错乱中])


"""
@author: Inki
@email: inki.yinji@qq.com
@version: Created in 2020 1230, last modified in 2020 1231.
@note:The paper name --> isolation forest.
"""import numpy as np class Tree:"""The tree structure."""def __init__(self, value, left, right):     #init 构造函数 self 有些像java的thisself.value = valueself.left = leftself.right = rightclass IsolationForest:"""The isolation forest algorithm.@param:data: The given data.@attribute:tree: The isolation forest.@example:# >>> np.random.seed(10)# >>> temp_data = np.random.rand(10, 10)# >>> temp_model = IsolationForest(temp_data)# >>> temp_model.display()"""def __init__(self, data):self.data = dataself.size_data = 0self.size_attribute = 0self.tree = Noneself.__initialize_isolation_forest()def __initialize_isolation_forest(self):"""The initialize of isolation forest."""self.size_data = len(self.data)self.size_attribute = len(self.data[0])self.tree = self.__get_isolation_forest(np.arange(self.size_data), -1, "")# 加入根节点 np.arange(n)=[0,1,...,n-1]def __get_isolation_forest(self, idx, height, flag):"""Get the isolation forest."""if len(idx) == 1:return Tree((idx[0], height + 1, flag), None, None)elif len(idx) == 0:returnelse:temp_random_attribute_idx = np.random.choice(self.size_attribute)#从[0-size_attribute)之间随机选一个数字temp_attribute = self.data[idx][:, temp_random_attribute_idx]"""给原作者发了邮件,搞懂了 再次感谢idx用于选择data的行,temp_random_attribute_idx用于选择列。即对于任意给定的data,选取指定的列和行出来。设data = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12]])idx = np.array([3, 0, 1])temp_random_attribute_idx = np.array([2, 0])则data[idx][:, temp_random_attribute_idx]为np.array([[12, 10],[3, 1],[6, 4]])在这里的作用就是随机选出矩阵里的一些参数"""temp_threshold = np.random.choice(temp_attribute)#在刚刚选出来的参数中再选出一个参数temp_left_idx, temp_right_idx = self.__filter(idx, temp_attribute, temp_threshold)return Tree((len(idx), height + 1, temp_random_attribute_idx, temp_threshold, flag),self.__get_isolation_forest(temp_left_idx, height + 1, "left"),self.__get_isolation_forest(temp_right_idx, height + 1, "right"))def __filter(self, idx, attribute, threshold):"""Filter the data."""ret_left, ret_right = [], []  #左右子树for i in range(len(idx)):if attribute[i] < threshold:ret_left.append(idx[i])else:ret_right.append(idx[i])return ret_left, ret_rightdef display(self):"""Display tree"""temp_tree = [self.tree]while len(temp_tree) > 0 and temp_tree is not None:temp_node = temp_tree.pop(0)temp_value = temp_node.valueif len(temp_value) == 5:if temp_value[-1] == "":#最后一位空 是根节点print("Len: %d; layer: %d; attribute idx: %d; threshold: %.2f; flag: root" % temp_value[:-1])else:print("Len: %d; layer: %d; attribute idx: %d; threshold: %.2f; flag: %s" % temp_value)else:print("Data idx: %d; layer: %d; flag: %s" % temp_value)if temp_node.left is not None:temp_tree.append(temp_node.left) if temp_node.right is not None:temp_tree.append(temp_node.right)if __name__ == '__main__':np.random.seed(10)temp_data = np.random.rand(10, 10)temp_model = IsolationForest(temp_data)temp_model.display()


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部