python中的条件熵计算,H(Y|X)

数据挖掘 机器学习 决策树
2022-02-13 06:27:58

输入 X:一个 numpy 数组,其大小给出了实例的数量。X 包含每个实例的属性值。Y:一个 numpy 数组,其中包含每个实例对应的目标标签。

输出:条件熵

你能帮我动态编码条件熵计算吗,这将进一步从给定总体的总熵中减去,以找到信息增益。

我尝试了类似下面的代码示例。但我唯一的输入数据是两个 numpy 数组。你能帮我纠正一下吗?[代码]

def gain(data, attr, target_attr):

    val_freq = {}
    subset_entropy = 0.0                                                   
for record in data:
        if (val_freq.has_key(record[attr])):
            val_freq[record[attr]] += 1.0
        else:
            val_freq[record[attr]]  = 1.0                                 
for val in val_freq.keys():
        val_prob = val_freq[val] / sum(val_freq.values())
        data_subset = [record for record in data if record[attr] == val]
        conditional_entropy += val_prob * entropy(data_subset, target_attr)
2个回答
##Entropy
def entropy(Y):
    """
    Also known as Shanon Entropy
    Reference: https://en.wikipedia.org/wiki/Entropy_(information_theory)
    """
    unique, count = np.unique(Y, return_counts=True, axis=0)
    prob = count/len(Y)
    en = np.sum((-1)*prob*np.log2(prob))
    return en


#Joint Entropy
def jEntropy(Y,X):
    """
    H(Y;X)
    Reference: https://en.wikipedia.org/wiki/Joint_entropy
    """
    YX = np.c_[Y,X]
    return entropy(YX)

#Conditional Entropy
def cEntropy(Y, X):
    """
    conditional entropy = Joint Entropy - Entropy of X
    H(Y|X) = H(Y;X) - H(X)
    Reference: https://en.wikipedia.org/wiki/Conditional_entropy
    """
    return jEntropy(Y, X) - entropy(X)


#Information Gain
def gain(Y, X):
    """
    Information Gain, I(Y;X) = H(Y) - H(Y|X)
    Reference: https://en.wikipedia.org/wiki/Information_gain_in_decision_trees#Formal_definition
    """
    return entropy(Y) - cEntropy(Y,X)

条件熵的公式是:

H(X|Y)=vϵvalues(Y)P(Y=v)H(X|Y=v)对于 X 给定 Y。

X 和 Y 的互信息:

I(X,Y)=H(X)H(X|Y)=H(Y)H(Y|X)我假设你已经知道 H(X) 的公式,即熵。有关更多信息,我建议:http ://www.cs.cmu.edu/~venkatg/teaching/ITCS-spr2013/notes/lect-jan17.pdf

在了解了这些公式之后,编码部分应该不会那么难。Python 会为您处理大部分事情,例如:log(X),当 X 是矩阵时,python 只记录每个元素。

对于总和,您可以使用迭代方法或使用 np.sum()。如果您有代码,请考虑发布它,以便我们恢复并告诉您什么是错误的、正确的以及如何改进。