关于split和try_split的两个理解!

来源:12-3 使用信息熵寻找最优划分

爱西瓜同志

2019-04-08

这是split的代码:

def split(X, y, d, value):
    index_a = (X[:,d] <= value)
    index_b = (X[:,d] > value)
    return X[index_a], X[index_b], y[index_a], y[index_b]

关于split的理解:
假设y里面有五个种类,我们做的就是把这5个种类分成1个种类和4个种类的前提下,尽量使这个“1”纯净。

这是try_split的代码:

def try_split(X, y):
    
    best_entropy = float('inf')
    best_d, best_v = -1, -1
    for d in range(X.shape[1]):
        sorted_index = np.argsort(X[:,d])
        for i in range(1, len(X)):
            if X[sorted_index[i], d] != X[sorted_index[i-1], d]:
                v = (X[sorted_index[i], d] + X[sorted_index[i-1], d])/2
                X_l, X_r, y_l, y_r = split(X, y, d, v)
                e = entropy(y_l) + entropy(y_r)
                if e < best_entropy:
                    best_entropy, best_d, best_v = e, d, v
                
    return best_entropy, best_d, best_v

关于try_split的理解:
简单来说,就假设y里只有2种元素。在try_split过程中,进行索引排序后,如果对应的y确实是按照由弱到强,或者由强到弱分布的,那找到的这个v确实是合适的,可假如经过索引排序后,对应的y是由强到弱再到强分布的,那用这个方法找到的v其实是不合适的,也就是说这个方法并不合适。

不知道这两个理解对不对?

写回答

3回答

liuyubobobo

2019-04-08

整个过程是首先对某一个维度的x进行排序。排序以后,依次遍历每一个点的值,以每一个点的值作为分割点,看在这里分割,是不是最佳的分割点(信息熵最小)。使用最佳分割点分割。


关键在于,分割的依据,不是训练数据集的y,而是根据每一个位置x计算出的分割后的信息熵:)


继续加油!:)

1
4
liuyubobobo
回复
爱西瓜同志
抱歉,我没有看到你的图示。给个链接?
2019-04-09
共4条回复

爱西瓜同志

提问者

2019-04-08

//img.mukewang.com/szimg/5cab2c720001511a22261076.jpg

计算信息熵的依据应该是y吧

0
0

爱西瓜同志

提问者

2019-04-08

关于第二个理解中y由弱到强(由强到弱)的理解就是:

    y可以是(1,1,1,1,1,0,0,0,0,0),(0,0,0,0,0,1,1,1,1,1)这样的

    而有强到弱再到强的理解可以是(1,1,1,1,1,1,0,0,0,0,0,,1,1,1,1,1),就是这么个意思

0
0

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程