Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning ID3机器学习算法是否能够处理多个是/否类?_Machine Learning - Fatal编程技术网

Machine learning ID3机器学习算法是否能够处理多个是/否类?

Machine learning ID3机器学习算法是否能够处理多个是/否类?,machine-learning,Machine Learning,我花了五天时间在这上面,几乎没有睡觉,现在我已经不知所措了。事实上,由于睡眠不足,我现在感觉不舒服 我已经用两个类实现了ID3,例如YES/NO,现在我的任务是使用一个可能产生3倍结果的数据集 数据子集示例: 3.4,5.2,1.4,0.2,BarnOwl 2.3,4.5,1.3,0.3,BarnOwl 3.4,6,4.5,1.6,SnowyOwl 2.9,5.7,4.2,1.3,SnowyOwl 2.8,6.4,5.6,2.1,LongEaredOwl 3.2,6.4,5.3,2.3,Long

我花了五天时间在这上面,几乎没有睡觉,现在我已经不知所措了。事实上,由于睡眠不足,我现在感觉不舒服

我已经用两个类实现了ID3,例如
YES/NO
,现在我的任务是使用一个可能产生3倍结果的数据集

数据子集示例:

3.4,5.2,1.4,0.2,BarnOwl
2.3,4.5,1.3,0.3,BarnOwl
3.4,6,4.5,1.6,SnowyOwl
2.9,5.7,4.2,1.3,SnowyOwl
2.8,6.4,5.6,2.1,LongEaredOwl
3.2,6.4,5.3,2.3,LongEaredOwl
2.8,6.2,4.8,1.8,LongEaredOwl
2.3,5,3.3,1,SnowyOwl
我对数据进行洗牌,并将前100个条目作为训练数据,以示例分解:

{'SnowyOwl': 32, 'BarnOwl': 35, 'LongEaredOwl': 33}
关于计算

熵(32SO,35BO,33LO)=

=1.58395

我写了我的代码,并检查熵函数,而不是得到范围内的结果

Entropy=[0..1]

我得到
1.58395

我给出的公式与
YES/NO
(为质量问题抱歉)配合得非常好

确认我的函数正在计算正确的结果,尽管超出了我使用的预期范围

有人能确认这个公式是正确的吗?
这就是为什么它超出了我的预期范围。

一个
n
值的离散随机变量的熵位于
[0,log2(n)]
范围内。这意味着对于3个结果,范围将是
[0\log2(3)]=[0,1.58496250072]
。答案是肯定的,你的熵公式很好


(要看到这一点,请注意,当所有结果的概率相同时,即
1/n
,熵达到最大值。然后
-1/n\log2(1/n)-…-1/n\log2(1/n)=n*1/n*\log2(n)=log2(n)
。另一方面,当一个结果以概率1发生,而所有其他结果以概率0发生时,熵将取其最小值:
1*log2(1)-0*log2(0)-…-0*log2(0)=0
。这就是为什么范围是
[0,log2(n)]
。我遗漏了熵在这两点上取其最大值和最小值的证明。请注意,我设置了
0*log2(0):=0
,因为
log2(0)
不存在。在实践中,通常要确保总和超过
p*log2(p)
p>0
)一个
n
值离散随机变量的熵在
[0,log2(n)]
范围内。这意味着对于3个结果,范围将是
[0\log2(3)]=[0,1.58496250072]
。答案是肯定的,你的熵公式很好


(要看到这一点,请注意,当所有结果的概率相同时,即
1/n
,熵达到最大值。然后
-1/n\log2(1/n)-…-1/n\log2(1/n)=n*1/n*\log2(n)=log2(n)
。另一方面,当一个结果以概率1发生,而所有其他结果以概率0发生时,熵将取其最小值:
1*log2(1)-0*log2(0)-…-0*log2(0)=0
。这就是为什么范围是
[0,log2(n)]
。我省略了熵在这两点上取最大值和最小值的证明。注意,我设置了
0*log2(0):=0
,因为
log2(0)
不存在。在实践中,人们通常会确保总和超过
p*log2(p)
p>0

非常感谢诸如此类的废话。这很有道理!如果可以的话,还有一个问题,在“是/否”中,如果没有“否”,我返回0,因为没有熵。但在我的示例中,如果我的一个类是零-(32/100)log2(32/100)-(68/100)log2(68/100)-(0/100)log2(0/100),则会导致崩溃。事实上,我不认为我可以成功地完成这是不幸的,因为KNN将很容易解决这个问题,如果我被允许使用它。好答案。还请注意,您仍然可以通过使用带基数N的
log
来规范化两个以上类的熵,其中N是类的数量。对于所有相等的概率(1/N),最大熵将为1,最小熵仍然为0(当单个类的概率为1,而所有其他类的概率为0)。@chris,它会因为log2(0)未定义而崩溃吗?也许你可以检查p=0;如果是这样,就忽略这个项,因为它对熵没有贡献。(前一段时间,我实现了增量决策树学习器;考虑查看<代码> HoffdIn。CPP 函数,计算信息增益;也许它会对你有所帮助。)归根结底,归一化并不重要,因为他无论如何都应该使用同一棵树。但是关于@chris期望熵在[0..1]范围内,使用logN可以做到这一点。当然,这也意味着信息增益也限制在1以内。非常感谢你的废话。这很有道理!如果可以的话,还有一个问题,在“是/否”中,如果没有“否”,我返回0,因为没有熵。但在我的示例中,如果我的一个类是零-(32/100)log2(32/100)-(68/100)log2(68/100)-(0/100)log2(0/100),则会导致崩溃。事实上,我不认为我可以成功地完成这是不幸的,因为KNN将很容易解决这个问题,如果我被允许使用它。好答案。还请注意,您仍然可以通过使用带基数N的
log
来规范化两个以上类的熵,其中N是类的数量。对于所有相等的概率(1/N),最大熵将为1,最小熵仍然为0(当单个类的概率为1,而所有其他类的概率为0)。@chris,它会因为log2(0)未定义而崩溃吗?也许你可以检查p=0;如果是这样,就忽略这个项,因为它对熵没有贡献。(前一段时间,我实现了增量决策树学习器;考虑查看<代码> HoffdIn。CPP 函数,计算信息增益;也许它会对你有所帮助。)归根结底,归一化并不重要,因为他无论如何都应该使用同一棵树。但是关于@chris期望熵在[0..1]范围内,使用logN可以做到这一点。当然,这也意味着信息增益也被限制为1。