算法:集合的划分原理及代码实现

在大学的离散数学中,会有关于划分原理的介绍。

基本概念

划分的概念就是把一个集合A分成若干个子集a1、a2…的过程,但是必须满足下列条件:
1.a1∪a2∪….∪an = A
2.对于所有i、j 属于0到n, ai∩aj = 空集。
3.a1…an 不为空集

例如
集合A = {1}的划分只有一种情况:{1}
集合A = {1,2}的划分有以下两种情况,分别是{1}{2},{1、2}
集合A = {1, 2, 3}的划分有五种情况:①{1}{2}{3};②{1}{2、3};③{2}{1、3};④{3}{1、2};⑤{1、2、3}
以此类推……

计算

那么就会出现一个问题,一个含有n个元素的集合的划分有多少种呢?
B1、B2 …. Bn分别表示从1到n个元素的集合的划分的个数,而有上述可知B1= 1,B2 = 2,B3 = 5,且令B0=1。
对一般的n有递推公式:
Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn,
C(n,k)是n元素取k个元素的组合数

公式可以这么理解:
n个元素的有Bn个分法,那么n+1个时,多加的这个设为t,
1.把t单独拿出来,剩下的有Bn种分法。即C(n,n)Bn。
2.t和其他元素当成一个整体,这其他元素可以是一个两个三个….
当是一个的时候:则有C(n,n-1)种抽取这一个元素的抽法,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
当是一个的时候:则有C(n,n-1)种抽取这一个元素的可能,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
以此类推….
当是n个的时候:则有C(n,0)种抽取这一个元素的可能,而剩下的只有0个了,所以是C(n,n-1)B0

全部累加则为Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn

代码实现待续….

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息熵(Information Entropy)是信息论中的一个概念,用来衡量一个随机变量的不确定性。对于一个离散型随机变量X,其信息熵定义为: H(X) = -∑ P(x) * log2(P(x)) 其中,P(x)表示随机变量X取值为x的概率。信息熵的单位是比特(bit),表示所需要的平均比特数来编码一个样本。 信息增益(Information Gain)用于衡量特征选择对于决策树构建的贡献程度。在决策树算法中,每次选择一个特征作为节点划分依据,目标是选择能够使得划分后获得最大信息增益的特征。信息增益的计算公式如下: IG(D, A) = H(D) - ∑ (|D_v| / |D|) * H(D_v) 其中,D表示当前样本集合,A表示某个特征,D_v表示经过特征A划分后得到的子样本集合,H(D)表示样本集合的信息熵。 信息增益比(Information Gain Ratio)对信息增益进行了修正,解决了信息增益偏向于具有较多取值的特征的问题。信息增益比的计算公式如下: GR(D, A) = IG(D, A) / H(A) 其中,H(A)表示特征A的固有值(intrinsic value),即特征A的信息熵。选择具有最大信息增益比的特征作为节点划分依据。 关于信息熵、信息增益和信息增益比的原理,可以参考《机器学习》等相关教材或论文,这里只做简要介绍。 关于案例和代码实现,这里给出一个简单的示例。假设我们有一个二分类问题,特征有两个,分别是年龄和性别,目标是预测一个人是否喜欢阅读。下面是一个简单的Python代码实现: ```python import numpy as np # 计算信息熵 def calculate_entropy(labels): counts = np.bincount(labels) probabilities = counts / len(labels) entropy = -np.sum(probabilities * np.log2(probabilities + 1e-10)) # 加上一个小值避免log(0) return entropy # 计算信息增益 def calculate_information_gain(data, labels, feature_index): feature_values = np.unique(data[:, feature_index]) entropy = calculate_entropy(labels) information_gain = entropy for value in feature_values: subset_indices = np.where(data[:, feature_index] == value)[0] subset_labels = labels[subset_indices] subset_entropy = calculate_entropy(subset_labels) information_gain -= len(subset_indices) / len(labels) * subset_entropy return information_gain # 计算信息增益比 def calculate_information_gain_ratio(data, labels, feature_index): information_gain = calculate_information_gain(data, labels, feature_index) intrinsic_value = calculate_entropy(data[:, feature_index]) information_gain_ratio = information_gain / (intrinsic_value + 1e-10) # 加上一个小值避免除零 return information_gain_ratio # 示例数据 data = np.array([[18, 'M'], [20, 'F'], [25, 'M'], [30, 'F'], [35, 'M']]) labels = np.array([0, 0, 1, 1, 1]) # 计算信息增益 ig_age = calculate_information_gain(data, labels, 0) ig_gender = calculate_information_gain(data, labels, 1) print("Information Gain (Age):", ig_age) print("Information Gain (Gender):", ig_gender) # 计算信息增益比 igr_age = calculate_information_gain_ratio(data, labels, 0) igr_gender = calculate_information_gain_ratio(data, labels, 1) print("Information Gain Ratio (Age):", igr_age) print("Information Gain Ratio (Gender):", igr_gender) ``` 以上代码实现了对数据集的信息增益和信息增益比的计算。注意,在计算信息熵时,为了避免出现log(0)的情况,加上了一个很小的值(1e-10)进行平滑处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值