# https://www.bilibili.com/video/BV1p7411t7ri?from=search&seid=7286286693409120190

# https://blog.csdn.net/gyqjn/article/details/45501185
import numpy as np
# 条件熵
def h(x):
    return np.sum([-p*np.log2(p) for p in x])
def alpha(e):
    return 0.5*np.log2((1-e)/e)
# print(h([1/2,1/2]))
print(h([3/7,4/7]))
print("阈值为2.5条件熵： ",0.3*h([1])+0.7*h([3/7,4/7]))
print("阈值为5.5条件熵： ",0.6*h([3/6,3/6])+0.4*h([3/4,1/4]))
print("阈值为8.5条件熵： ",0.9*h([3/9,6/9])+0.1*h([1]))

print(alpha(0.3))

# 六.举例
# 信息熵
# 假如双十一我要剁手买一件衣服，但是我一直犹豫着要不要买，我决定买这件事的不确定性（熵）为2.6。
# 条件熵
# 我在看了这件衣服的评价后，我决定买衣服这件事的不确定性是1.2。
# 我在线下实体店试穿衣服后，我决定买衣服这件事的不确定性是0.9。
# 信息增益
# 上面条件熵给出了两个：
# 一个是看了网上的评价，此时的信息增益是Gain1=2.6−1.2=1.4Gain1=2.6−1.2=1.4。
# 另一个是线下试穿了衣服，此时的信息增益
# Gain2=2.6−0.9=1.7Gain2=2.6−0.9=1.7。
# # 很显然我在线下试穿衣服之后对于决定买这件衣服的不确定度下降更多，更通俗的说就是我试穿衣服之后买这件衣服的可能性更大了。所以如果有看买家评价和线下试穿两个属性，首先应该选择线下试穿来构建内部节点。