朴素贝叶斯模型是生成学习的一种,用于分类问题。作为生成学习,朴素贝叶斯针对每一个分类,生成一个该分类对应的数据的模型,然后判断一个数据最符合哪一个模型,从而分类。
其核心为贝叶斯公式:
目标是
这里的 \(x\) 代表了一系列特征 \(x_1,\dots,x_n\),于是我们的目标也可以写作:
这个式子非常复杂,如果考虑每个特征都是 \(0/1\) 变量,那么学习的参数为 \(O(2^n)\)(对于 \(x_{1},\dots,x_{i-1},y\) 的每种取值情况,都有 \(x_i\) 的分布)。
而朴素贝叶斯采取了一个非常强的假设——\(x_1,\dots,x_n\) 相互独立,于是上式立即化简为:
参数数量 \(O(n\times \#\text{class})\),这样就具有可操作性了。
以每个特征都为 \(0/1\) 变量,进行 \(0/1\) 分类为例,推导各个参数的取值。
参数有:
仍然采用最大似然估计,用联合概率定义似然函数(\([x]\) 表示 \(x\) 为真即 \(1\),假即 \(0\)):
取对数似然(其中 “\(\dots\)” 对 \(y=1\) 的情况省略):
先对 \(\phi_y\) 求偏导并令其为零:
从而
再对 \(\phi_{j\mid y=0}\) 求偏导并令其为零:
从而
同理有
实际上这些公式看起来非常显然,就是以频率估计概率,但是都是基于MLE推导而来的。
朴素贝叶斯模型非常依赖数据的“完整性”——假如训练集中没有 \(x^{(i)}_j=1,y^{(i)}=0\) 的数据,那么我们对 \(P(x_j=1\mid y=0)\) 的估计就是 \(0\),也即在统计上不可能发生,然而这是很不安全的,我们更倾向于说 \(P(x_j=1\mid y=0)\) 很小,而不是为 \(0\)。
以一个例子突出朴素贝叶斯模型的这一问题。
考虑给定一个纯文本邮件,判断其是否为垃圾邮件。
我们可以用一种很简单的方法处理数据——预设一个字典,假设邮件的所有单词都包含在内(如果没有包含就把它忽略)。设置特征为“某一个单词是否在邮件中出现”,出现即为 \(1\),不出现即为 \(0\)。是垃圾邮件,则目标值为 \(1\),否则为 \(0\)。
(其实可以注意到这种特征设置并不满足朴素贝叶斯的假设,比如 buy 和 price 这两个单词是否出现一般来说是不独立的。因此直接这样实现的效果很差,用 UCI 中的数据集 spambase,将其提供的“单词出现频次”改为“是否出现”,大概错误率为 10%。)
那么就可能会有一个问题——字典中的某个单词 \(j\) 没有在 training set 里出现,但是出现在了 test set 中。按照我们的方法,
那么我们发现模型对 test set 中的这封邮件是垃圾邮件和不是垃圾邮件的概率都是 \(0\)。很有可能这一个单词与是否是垃圾邮件无关,但是它造成了我们根本无法判断这封邮件是否是垃圾邮件。
一个非常简单的处理,我们假设每种情况最初都包含有一个数据,也即
同理
更为普遍地,我们考虑有 \(k\) 个分立取值的变量 \(x_j\in\{1,\dots,k\}\),那么我们对其概率估计为:
这样就直接避免了上述问题,但是同时也会造成一定程度的误差,在数据较多时造成的误差不明显。
我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st
我想实现一个简单的贝叶斯分类系统来对短信进行基本的情感分析。欢迎提供在Ruby中实现的实用建议。也欢迎提出除贝叶斯之外的其他方法的建议。 最佳答案 IlyaGrigorik在BayesianClassifiers上的这篇博文中对这个问题给出了很好的答案。此外,您不妨看看ai4rrubygem用于贝叶斯分类器的一些替代方法。ID3是一个不错的选择,因为它提供了即使对机器学习技术没有任何真正了解的人也能“理解”的决策树。 关于ruby-在Ruby中实现贝叶斯分类器?,我们在StackOver
我有一组随机点,想用raphaeljs创建一个平滑的svg形状。为了连接这些点,我使用了catmull-rom-spline。问题是路径闭合的点不平滑。这是我项目中的示例路径:M125,275R125,325175,325225,325275,325225,275175,275125,275Z我还创建了一个jsfiddle:http://jsfiddle.net/ry8kT/这可以用catmull曲线实现吗?如果没有,能否请您举例说明如何获得完全平滑的形状?非常感谢,麦克法兰 最佳答案 我自己修好了:我没有使用catmullrom样
更新问题我已经将其更新为更加简洁......:在这个fiddle中:http://jsfiddle.net/pX2Xb/4/我有一些raphael代码可以在一页上绘制3000个圆圈。然后它会尝试在10秒内同时为所有圆圈设置动画(更改填充颜色),这会导致视觉动画效果笨拙。将圆圈数更改为20以查看更流畅的动画以进行比较。我的问题是(a)我是否可以使对3000个元素的更新更顺畅,以及(b)如果可以,执行此操作的代码是什么样的?一些注意事项:如果有一些方法可以围绕这个进行优化,我愿意花一点时间,但是,例如,无论动画如何,我都希望所有圈子至少更新1.5倍时间设置为。所以,如果动画是10秒,所有圆
我有一个容器,其工作方式类似于macos中的通知-元素被添加到队列并在特定超时后删除。这很好用,但有一个不和谐的视觉副作用。当它们从DOM中移除时,UI会出现参差不齐的更新,因为堆栈中的下一个元素会填充前一个元素所造成的空白。我希望堆栈中下面的元素能够顺利地向上移动到该空间,最好使用css3,但添加一个transition:all0.5sease-in-out到.notice当其兄弟被移除时,类对该对象没有影响。最小的JS交互:$('#add').click(function(e){e.preventDefault();$('#container').append('Notice#')
我正在尝试同步两个可滚动的DIVS滚动位置。遵循的方法:Method-1:on-scroll事件设置其他DIV的scrollTop。问题:滚动事件最后执行,UI在iOSSafari中缓慢。Method-2:使用setInterval来同步两个滚动位置。问题:iOS在滚动期间不执行定时器功能,所以滚动位置在最后同步。同样,这更加缓慢。尝试过,许多博客中提到的计时器已修复,但仍然没有优雅。Method-3:尝试自定义滚动条,所以iScroll并尝试在scroll事件上同步两者,问题:这看起来好多了,但在iOS中仍然很慢!!!Method-4:尝试自定义滚动条,所以iScroll并尝试在sc
我的需求很简单,但我找不到合适的解决方案。我创建元素并将它们作为元素列表添加到DOM,每个新元素都在旧元素之前添加。我希望“顺利”添加新元素。每个元素的高度是动态的,因此必须符合CSS规则。我想我必须使用CSSanimations和keyframes,据我所知我不能使用transitions因为有时itisnotrenderedbythebrowser.我不想使用Javascript,所以我更愿意避免使用setTimeout()或jQuery的解决方案。我确信这可以使用现代CSS正确完成,但我仍然需要找到正确的方法。我有一个解决方案的开始(见下文),但是仍然有max-height:10
我很好奇MikeBostock如何能够以如此流畅的方式创建一条跟随鼠标光标的垂直线。如果你看这里http://square.github.com/cubism/,你可以明白我在说什么。看看我刚刚在这里制作的一个简单示例:http://jsfiddle.net/zbfUq/在我的示例中,有很多次该行实际上消失了。他是否正在做某种位置插值以在未记录的两个点之间创建平滑的平移?如果是这样,有人知道如何做这样的事情吗? 最佳答案 我已经为您制作了一个工作示例:http://jsfiddle.net/zbfUq/37/本质上,您已经在onmo
我目前正在使用JavaScript和MediaSourceAPI开发DASH播放器流媒体工作正常,但我坚持改变表示。在播放期间更改表示的最暴力的方法可能是替换HTML文档中的元素。不过,我想知道是否有一种简单的方法可以使用MediaSourceAPI实现适配(更改表示形式)。我读过单个MediaSource对象可以处理多个源缓冲区,但在添加第二个视频缓冲区后会引发异常。我使用的是Chrome43.0.2357.65mvarmediaSource=MediaSource();varurl=URL.createObjectURL(mediaSource);videoElement.src=
我正在玩弄并尝试建立一个视差网站-是的,我知道它们是一种令人讨厌的时尚,但我仍然想尝试一下。因此,为了获得灵感,我一直在查看各种优秀视差网站的示例并发现了这个网站:https://victoriabeckham.landrover.com/INT.它可以使用鼠标滚轮、滚动条和anchor链接进行平滑滚动。我一直在寻找可以实现这种效果的jQuery插件,但似乎只能找到使用内部页面链接的插件-anchor或ID(详见下文)-但不是鼠标滚轮和滚动条。我很有可能使用了错误的关键字进行搜索。有谁知道找到这些插件的正确术语或知道任何可以实现这种效果的插件吗?附带说明一下,我目前正在学习jQuery