理解 KL 分歧的直观指南
点亮数学机器学习
我正在开始一系列新的博客文章,遵循初学者友好的方法来理解机器学习中一些具有挑战性的概念。首先,我们将从 KL 散度开始。
代号: 此处
本系列的其他文章可以在下面找到。
A BCD* E F**G*** H I J K**L*** M**NO P Q R S T U V**
*表示中等付费墙后面的文章
概念基础
首先,让我们建立一些基本规则。我们将定义一些我们需要知道的事情,比如我们的手背来理解 KL 散度。
什么是发行版
所谓分布,我们指的是不同的东西,如数据分布或概率分布。这里我们感兴趣的是概率分布。想象你在一张纸上画两条轴(即 X 和 Y ),我喜欢把一个分布想象成两条轴之间掉下来的一根线;X和Y。 X 表示您有兴趣获取概率的不同值。 Y 代表在 X 轴上观察到某个值的概率(即 y=p(x) )。我在下面想象这一点。****
这是一个连续的概率分布。例如,将轴 X 想象为一个人的高度,将轴 Y 想象为找到具有该高度的人的概率。
如果你想使这种概率分布离散,你可以把这根线切成固定长度的段,然后把这些段以水平的方式转动。然后创建连接每条线的边缘和 x 轴的矩形。这是一个离散的概率分布。
什么是事件?
对于离散概率分布,一个事件就是你观察到 X 取某个值(例如 X=1 )。我们姑且称 P(X=1) 事件发生的概率 X=1 。在连续空间中你可以把这想象成一个数值范围(例如0.95<X<1.05)。请注意,事件的定义不限于 x 轴上的值。然而,考虑到这一点,我们可以继续前进。
回到 KL 分歧
为了从这一点继续下去,我将谦虚地使用这篇博文【1】中的例子。这是一篇解释 KL 分歧的很好的文章,但是我觉得解释中的一些错综复杂之处可以解释得更详细一些。好了,我们开始吧。
我们试图解决的问题
因此,在[1]中解决的问题的要点是,我们是一群访问广阔的外层空间的科学家,我们发现了一些太空蠕虫。这些太空蠕虫有不同数量的牙齿。现在我们需要将这些信息发送回地球。但是从太空向地球发送信息是昂贵的。所以我们需要用最少的信息量来表达这些信息。一个很好的方法是,我们不记录单个的数字,而是画一个图,其中 X 轴是已经观察到的不同齿数( 0,1,2,…,等等)。)并使 Y 轴看到一个带 x 多齿的蜗杆的概率(即带 x 齿的蜗杆数/蜗杆总数 )。我们已经把我们的观察转换成一个分布。
这种分发比发送单个蠕虫的信息更有效。但是我们可以做得更好。我们可以用一个已知的分布(如均匀分布、二项式分布、正态分布等)来表示这个分布。).例如,如果我们用均匀分布来表示真实分布,我们只需要发送两条信息就可以恢复真实数据;蠕虫的均匀概率和数量。但是我们如何知道哪种分布更好地解释了真实的分布呢?这就是 KL 分歧的来源。
直觉:KL 散度是衡量两个分布(例如线程)之间匹配的一种方式
因此,我们可以使用 KL 散度来确保我们将真实分布与一些解释简单且众所周知的分布很好地匹配。
让我们改变例子中的一些东西
为了能够检查数值的正确性,让我们将概率值改为更人性化的值(与[1]中使用的值相比)。我们将做如下假设。假设我们有 100 条虫子。我们有以下数量的蠕虫。
- 0 齿:2(概率: p0=0.02
- 1 齿:3(概率: p1=0.03
- 2 齿:5(概率: p2=0.05
- 3 齿:14(概率: p3=0.14
- 4 齿:16(概率: p4=0.16
- 5 齿:15(概率: p5=0.15 )
- 6 齿:12(概率: p6=0.12 )
- 7 齿:8(概率: p7=0.08 )
- 8 齿:10(概率: p8=0.1 )
- 9 齿:8(概率: p9=0.08 )
- 10 齿:7(概率: p10=0.07 )
快速理智检查!让我们确保值加起来是 100,概率加起来是 1.0。
总蠕虫数= 2+3+5+14+16+15+12+8+10+8+7 = 100
总概率= 0.02+0.03+0.05+0.14+0.16+0.15+…。0.12+0.08+0.1+0.08+0.07 = 1.0
这是它的视觉效果。
第一次尝试:用均匀分布建模
现在,让我们先试着用均匀分布来模拟这个分布。均匀分布只有一个参数;一致概率;给定事件发生的概率。
p _ uniform = 1/总事件数=1/11 = 0.0909
这就是均匀分布和真正的并排分布的样子。
让我们把这个结果放在一边,我们将用另一种类型的分布来模拟真实的分布。
第二次尝试:用二项式分布建模
通过计算一枚硬币正面落地的概率,你可能对二项式概率很熟悉。我们可以把同样的概念推广到我们的问题上。对于一枚硬币,你有两种可能的输出,假设硬币正面落地的概率是 p ,你运行这个实验进行 n 次试验,获得 k 成功的概率由下式给出:
打破平衡
让我们顺便了解一下二项分布中的每一项,看看它们是否有意义。第一任是 p^k 。我们要获得 k 的成功,其中单次成功的概率是 p 。那么获得 k 成功的概率就是*。请记住,我们正在为 n 试验运行实验。因此,会有 n-k 次失败的试验,失败概率为***【1-p】。所以获得 k 成功的概率是pk(1-p){n-k}的联合概率。我们的工作不会就此结束。 k 试验可以在 n 试验中进行不同的排列。要在空间内排列的不同排列 k 元素的数量由下式给出:
将所有这些相乘,我们得到了成功的二项式概率。
二项分布的均值和方差
我们还可以定义二项分布的均值和方差。这些是由,
均值= np
方差= np(1-p)
意思反映了什么?Mean 是您运行 n 次试验后获得的预期(平均)成功次数。如果每次试验的成功概率为 p ,那么可以说如果你进行 n 次试验,你将获得 np 次成功。接下来方差代表什么?它表示成功试验的真实次数偏离平均值的程度。为了理解方差,让我们假设 n=1 。那么方程就是, 方差=p(1-p) 。当 p=0.5 (获得正面和反面的可能性相等)时,方差最高;当 p=1 或 p=0 (肯定获得正面/反面)时,方差最低。
回到建模
现在有了对二项分布的坚实理解,让我们回到我们手头的问题。让我们先计算一下蠕虫的预期齿数。那会是,
已知均值,我们可以计算出 p 其中,
均值= NP
5.44 = 10p
p = 0.544
注意比 n 是从蠕虫种群中观察到的最大齿数。你可能会问为什么我们没有选择 n 作为蠕虫总数(即 100 )或者事件总数(即 11 )。我们很快就会看到原因。有了这个,我们可以定义任意数量的牙齿的概率如下。
鉴于牙齿可以取值到 10,那么看到 k 颗牙齿的概率是多少(其中看到一颗牙齿就是试验成功)。
从抛硬币的角度来看,这就像在问,
假设我有 10 次翻转,观察到 k 头的概率是多少。
形式上,我们计算所有不同的 k 值的概率。这里 k 成为我们要观察的齿数。而**【pk^{bi}】则是第 k 个齿仓的二项概率(即 0 齿、1 齿等)。).所以当我们如下计算它们时,**
p0^{bi} = (10!/(0!10!))0.544⁰(1–0.544)^{10} = 0.0004
p1^{bi} =(10!/(1!9!))0.544(1–0.544)⁹= 0.0046
p2^{bi} =(10!/(2!8!))0.544(1–0.544)⁸= 0.0249
……
p9^{bi} =(10!/(9!1!))0.544⁹(1–0.544)= 0.0190
p10^{bi} =(10!/(10!0!))0.544^{10}(1–0.544)⁰= 0.0023
这是真实分布和二项分布的比较。
让我们总结一下我们所拥有的
**好吧,回头想想我们到目前为止做了什么。首先我们理解了我们想要解决的问题。问题是用最少的努力把某种太空蠕虫牙齿的统计数据发送到整个空间。为此,我们考虑用一些已知的分布来表示蠕虫的真实统计数据,因此我们可以只发送该分布的参数,而不是真实统计数据。我们研究了两种类型的分布,得出了以下统计数据。
均匀分布—概率为 0.0909
二项分布—其中 n=10 , p=0.544 和 k 取 0 到 10 之间的不同值
现在让我们在一个地方可视化一切
我们如何定量地决定哪些是最好的?
有了这些复杂的计算,我们需要一种方法来衡量每个近似分布与真实分布之间的匹配程度。这一点很重要,这样,当我们传递信息时,我们可以安心,不用担心“我的选择正确吗?”在我们的余生中。
这就是 KL 背离的由来。KL 散度的正式定义如下。
这里的是近似值,而 p(x) 是真实分布,我们感兴趣的是匹配【q(x)来。直观地,这测量了给定的任意分布与真实分布的偏差。如果两个分布完全匹配,[D _ { KL }(p | | q)= 0否则可以取 0 和 ∞ 之间的值。KL 散度值越低,我们将真实分布与我们的近似值匹配得越好。
KL 背离的直观分解
让我们一块一块来看 KL 发散。先取*log(p(x _ I)/q(x _ I))分量。如果 q(x_i) 高于 p(x_i) 会怎么样?那么这个组件将产生一个负值(因为小于 1 的 log 值是负值)。另一方面,如果 q(x_i) 总是小于 p(x_i) 这个分量将产生正值。只有当p(x _ I)= q(x _ I)*时,该值才会为零。然后为了使这成为一个期望值,你用 p(x_i) 对 log 分量进行加权。这意味着, p(x_i) 概率较高的匹配区域比 p(x_i) 概率较低的匹配区域更重要。
直觉上,优先正确匹配近似值中的真正高概率事件是有意义的。从数学上讲,这允许您自动忽略位于真实分布支持面(支持面是分布使用的 x 轴上的全长)之外的分布区域。此外,这避免了计算 log(0) 如果您试图计算超出真实分布支持范围的任何区域的 log 分量,将会出现这种情况。
计算 KL 散度
现在让我们计算我们得到的每个近似分布的 KL 散度。首先让我们来看看均匀分布。
现在对于我们得到的二项分布,
关于二项式均值的 KL 散度
现在让我们来玩一下 KL 散度。首先,我们将看到当二项分布的成功概率改变时,KL 散度是如何变化的。不幸的是,我们不能对均匀分布做同样的事情,因为我们不能改变概率,因为 n 是固定的。
你可以看到,随着我们远离我们的选择(红点),KL 散度迅速增加。事实上,如果你打印一些与我们的选择相差很小的 KL 散度值δ**,你会看到我们选择的成功概率给出了最小的 KL 散度。**
现在我们对 KL 散度的讨论到此结束。
结论
现在我们有了一些可靠的结果,虽然均匀分布看起来很简单,没有什么信息,而二项式分布更微妙,但均匀分布比二项式分布更符合真实分布。说实话,这个结果其实让我很意外。因为我期望二项式能更好地模拟真实分布。因此,这给了我们一个重要的教训,那就是为什么我们不应该只相信我们的直觉!
代码:此处
KL divergence 的乐趣
你可以通过玩 KL 散度来获得更多的乐趣,从而更好地理解 KL 散度。你可以在我的博客中了解更多。
参考
[1]https://www . countbayesie . com/blog/2017/5/9/kull back-lei bler-divergence-explained
注意:请去我的网站看看,因为我也在那里贴了更多机器学习的东西。
小提示:我很高兴地宣布,我的关于使用 TensorFlow 进行自然语言处理的书已经出版了,供大家购买!这本书非常适合寻求基于现代深度学习的解决方案的实用视角的初级/中级读者。这本书附有指导读者实现各种 NLP 应用的练习。你可以在 Packt 网站或者亚马逊找到。
理解 Word2vec 的直观指南
点亮数学机器学习
数学机器学习系列 之光 A-Z 的第三篇博文来了。这篇文章是关于 Word2vec 算法的。Word2vec 算法输出单词向量。单词向量是许多自然语言处理(NLP)系统的基础,这些系统已经风靡全球(亚马逊 Alexa、谷歌翻译等)。).我们将在接下来的章节中讨论细节。但是首先让我拼出我的其他博客文章的链接的字母表。
A BCD* E F**G*** H I J**KL* M**N****
*表示中等付费墙后面的文章
词向量,有什么大的想法?这都是关于环境的
没有进一步的理由,让我们坚持到底。单词向量是单词的数字表示,保留单词之间的语义关系。例如单词 猫 的向量,就会和单词 狗 的向量非常相似。然而, 铅笔 的矢量将与 猫 的单词矢量大相径庭。而这种相似性是由两个被讨论的词(即[ 猫、 狗]或[ 猫、 )在同一语境中使用的频率来定义的。例如,考虑下面的句子,
以上句子中的奇数我觉得没必要拼出来,明显是带 铅笔 的,作为漏字。为什么你觉得这是个奇怪的句子?拼写没问题,语法没错,那为什么?就是因为 上下文 ,铅笔 一词 使用不正确。这应该让你相信一个词的上下文对这个词本身的影响。单词向量算法使用单词的上下文来学习单词的数字表示,使得在相同上下文中使用的单词具有相似的单词向量。
Word2vec 的影响和含义
要了解 Word2vec 技术的含义,请尝试以下方法。继续,调出谷歌学者。键入一些与自然语言处理相关的任务(如问答、聊天机器人、机器翻译等)。过滤 2013 年以后发表的论文(Word2vec methods 就是那时候出的)。得到使用词向量的论文占论文总数的比例。我打赌这个比例会很高。为了使陈述具体化,单词向量被用于,
- 语言建模
- 聊天机器人
- 机器翻译
- 问题回答
- …以及更多
你可以看到所有令人兴奋的自然语言处理前沿实际上严重依赖于词向量。现在让我们讨论一下单词向量有什么样的含义可以使模型更好。当使用单词向量时,语义上接近的单词将在模型中表现为相似的计算,而其他单词将表现为进行不同的计算。这是一个值得拥有的属性,因为在输入本身中编码这样的信息会导致模型以较少的数据执行得很好。
从原始文本到词向量:高级方法
现在,有了可靠的直觉,我们将首先讨论 Word2vec 算法的高级机制。我们将在后面的小节中完善细节,直到我们确信我们知道如何实现 Word2vec 算法。为了以无人监督的方式(即没有人类标记数据)学习单词向量,我们必须定义并完成某些任务。以下是这些任务的高级列表。
- 从原始文本创建格式为[输入字,输出字]的数据元组,其中每个字被表示为一个热向量
- 定义一个模型,该模型可以将独热向量作为输入和输出来训练
- 定义一个损失函数来预测正确的单词,该单词实际上在输入单词的上下文中,以优化模型
- 通过确保相似的单词具有相似的单词向量来评估模型
这个看似简单的程序将导致学习非常强大的单词向量。让我们来看看上述流程中每一步的细节。
从原始文本创建结构化数据
这不是一项非常困难的任务。这是对原始文本进行简单处理,将其转换成特定的结构。想想下面这句话。
猫把玻璃从桌子上推了下来
从这句话中创建的数据如下所示。句子后面的每一行代表一个数据点。蓝框代表一键输入词( 中间词,称为目标词 ),红框代表一键输出词( 上下文窗口中除中间词以外的任何词,称为上下文词 )。从单个上下文窗口创建两个数据点。上下文窗口的大小是由用户定义的。上下文窗口越大,模型的性能越好。但是当上下文窗口很大时,随着数据量的增加,您将付出计算时间的代价。不要把目标词和目标(正确输出)混淆对于神经网络来说,这是两个完全不同的东西。
Creating data for Word2vec
定义嵌入层和神经网络
用于从上面定义的结构化数据中学习的神经网络。然而,它伴随着一个转折!为了清楚起见,您有以下组件。
- 表示为独热向量的一批输入
- 表示为一个热点向量的一批输出(仅在训练阶段)
- 嵌入层
- 神经网络
如果您不知道最后两个组件是什么以及如何执行的,也没有必要害怕。我们将探究这些组件中的每一个,以了解它们的作用。
嵌入层:存储所有的单词向量
我们议程中的第一个是 嵌入层 。嵌入层存储在词汇表中找到的所有单词的单词向量。可以想象这是一个巨大的矩阵(大小为 【词汇大小 x 嵌入大小】 )。这个嵌入大小是用户可调的参数。它越高,模型的性能就越好。但是超过某一点(比如,嵌入大小为 500),您将不会获得太多令人惊讶的性能/大小增益。这个巨大的矩阵被随机初始化(就像神经网络一样),并在优化过程中一点一点地调整,以显示强大的单词向量。这是它看起来的样子。
What the embedding layer looks like
神经网络:将单词向量映射到输出
接下来是我们模型的最后一块乐高积木;神经网络。在训练期间,神经网络获取输入单词并尝试预测输出单词。然后,使用损失函数,我们惩罚错误分类的模型,奖励正确分类的模型。我们将把我们的对话限制在一次处理一个输入和一个输出。然而在现实中,您是成批处理数据的(比如说,64 个数据点)。让我们描述一下培训中使用的确切流程:
- 对于给定的输入单词(目标单词),从嵌入层中找到相应的单词向量
- 将单词向量输入神经网络,然后尝试预测正确的输出单词(上下文单词)
- 通过比较预测和真实上下文单词,计算损失
- 使用损失和随机优化器来优化神经网络和嵌入层
需要注意的一点是,在计算预测时,我们使用 softmax 激活将预测标准化为有效的概率分布。
将所有内容组合在一起:从输入到模型到输出
知道了 Word2vec 算法的所有细节,我们就可以把所有的部分放在一起了。这样一旦训练好这个模型,我们要做的就是 把嵌入层保存到磁盘 。然后,我们可以在一天中的任何时间享受语义保留的单词向量。下面我们来看看完整的图片是什么样子的。
How the model looks at its final form
这种数据和模型布局的特殊排列被称为 跳格算法;一个 Word2vec 算法。这就是我们要关注的。另一种算法被称为连续词袋(CBOW)模型。
定义损失函数:优化模型
到目前为止,我们还没有讨论的一个重要信息是损失函数,但它是必不可少的。通常,标准的 softmax 交叉熵损失对于分类任务来说是一个很好的损失函数。对于 Word2vec 模型来说,使用这个损失是不太实际的,因为对于一个更简单的任务,比如情绪分析(其中你有两个可能的输出:正面或负面)。在这里,事情会变得很古怪。在消耗数十亿个单词的真实单词任务中,词汇量可以很容易地增长到 100,000 或更多。这使得 softmax 归一化的计算量很大。这是因为 softmax 的完整计算需要计算关于所有输出节点的交叉熵损失。
所以我们要用一个更聪明的替代方案,叫做 采样 softmax 损耗 。在采样的 softmax 损失中,执行以下操作。请注意,与标准的 softmax 交叉熵损失相比,有相当多的变化。首先,计算给定目标单词的真实上下文单词 ID 和对应于真实上下文单词 ID 的预测值之间的交叉熵损失。然后,我们添加根据一些噪声分布采样的K
负样本的交叉熵损失。概括地说,我们将损失定义如下:
SigmoidCrossEntropy
是我们可以在单个输出节点上定义的损耗,与其余节点无关。这对于我们的问题来说非常理想,因为我们的词汇量会变得很大。我不打算深究这次损失的细节。您不需要了解这是如何实现的,因为这些是 TensorFlow 中的内置函数。但是了解损失中涉及的参数(例如K
)是很重要的。要点是,采样的 softmax 损耗通过考虑两种类型的实体来计算损耗:
- 由预测向量中的真实上下文单词 ID(上下文窗口内的单词)给出的索引
K
指示单词 id 的索引,并且被认为是噪声(上下文窗口之外的单词)
我通过一个例子进一步形象化了这一点。
Getting positive and negative samples for the sampled softmax layer
张量流实现:Skip-gram 算法
在这里,我们将把我们刚刚讨论的内容放入一个实现中。此处 可作为练习 。在本节中,我们将实现以下内容。
- 数据生成器
- 跳格模型(带张量流)
- 运行跳格算法
数据生成程序
首先让我们了解如何生成数据。我们不打算深入研究这段代码的细节,因为我们已经讨论了数据生成的内部机制。这只是将逻辑转换为实现。
****def** generate_batch(batch_size, window_size):
**global** data_index
*# two numpy arras to hold target words (batch)*
*# and context words (labels)*
batch = np.ndarray(shape=(batch_size), dtype=np.int32)
labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)
*# span defines the total window size*
span = 2 * window_size + 1
*# The buffer holds the data contained within the span*
queue = collections.deque(maxlen=span)
*# Fill the buffer and update the data_index*
**for** _ **in** range(span):
queue.append(data[data_index])
data_index = (data_index + 1) % len(data)
**for** i **in** range(batch_size // (2*window_size)):
k=0
*# Avoid the target word itself as a prediction*
**for** j **in** list(range(window_size))+list(range(window_size+1,2*window_size+1)):
batch[i * (2*window_size) + k] = queue[window_size]
labels[i * (2*window_size) + k, 0] = queue[j]
k += 1
*# Everytime we read num_samples data points, update the queue*
queue.append(data[data_index])
*# If end is reached, circle back to the beginning*
data_index = (data_index + np.random.randint(window_size)) % len(data)
**return** batch, labels**
定义跳格模型
首先,我们将定义模型所需的一些超参数。
**batch_size = 128
embedding_size = 64
window_size = 4
num_sampled = 32 # Number of negative examples to sample.**
batch_size
定义了在给定时间我们处理的数据点的数量。那么embedding_size
就是一个字向量的大小。下一个超参数window_size
定义了我们上面可视化的上下文窗口的大小。最后num_sampled
定义损失函数中负样本的数量(K
)。然后我们为输入和输出定义张量流占位符。
**tf.reset_default_graph()
# Training input data (target word IDs).
train_dataset = tf.placeholder(tf.int32, shape=[batch_size]) # Training input label data (context word IDs)
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])**
这里,train_dataset
获取一个代表一组选定目标单词的单词 id 列表batch_size
。最后,train_labels
表示所选目标单词的相应上下文单词的batch_size
列表。接下来,我们定义定义模型所需的模型参数:嵌入层以及神经网络的权重和偏差。
***################################################*
*# Model variables #*
*################################################*
*# Embedding layer*
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
*# Neural network weights and biases*
softmax_weights = tf.Variable(
tf.truncated_normal([vocabulary_size, embedding_size],
stddev=0.1 / math.sqrt(embedding_size))
)
softmax_biases = tf.Variable(tf.random_uniform([vocabulary_size],-0.01,0.01))**
我们将嵌入层定义为一个 TensorFlow 变量:embeddings
。然后我们定义神经网络权重(softmax_weights
)和偏差(softmax_biases
)。此后,我们定义将嵌入层连接到神经网络所需的关键操作,以联合优化嵌入层和神经网络。
**# Look up embeddings for a batch of inputs.
embed = tf.nn.embedding_lookup(embeddings, train_dataset)**
tf.nn.embedding_lookup
函数将我们的嵌入层作为输入和一组单词 id(train_dataset
),并将相应的单词向量输出到变量embed
。定义了嵌入查找函数,我们可以定义上面讨论的采样 softmax 损失函数。
**################################################
# Computes loss #
################################################
loss = tf.reduce_mean(tf.nn.sampled_softmax_loss( weights=softmax_weights, biases=softmax_biases, inputs=embed, labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size) )**
这里,tf.nn.sampled_softmax_loss
函数接受一组权重(softmax_weights
)、偏差(softmax_biases
)、对应于在train_dataset
中找到的单词 id 的一组单词向量、正确上下文单词的 id(train_labels
)、噪声样本的数量(num_sampled
)和词汇的大小(vocabulary_size
)。有了输出计算操作和定义的损耗,我们可以定义一个优化器来优化关于嵌入层和神经网络的参数的损耗。
**################################################
# Optimization #
################################################
optimizer = tf.train.AdamOptimizer(0.001).minimize(loss)**
然后,我们通过使向量幅度等于 1 来获得归一化的嵌入层。
**################################################
# For evaluation # ################################################
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keepdims=True))
normalized_embeddings = embeddings / norm**
运行代码
这里我们将讨论如何运行之前定义的张量流模型的细节。首先我们定义一个session
,然后随机初始化所有的张量流变量。
**num_steps = 250001
session = tf.InteractiveSession()
# Initialize the variables in the graph
tf.global_variables_initializer().run()
print('Initialized')
average_loss = 0**
现在,对于预定义数量的步骤,我们生成批量数据:目标单词(batch_data
)和上下文单词(batch_labels
)。
**for step in range(num_steps):
# Generate a single batch of data
batch_data, batch_labels = generate_batch( batch_size, window_size)**
然后,对于每个生成的批处理,我们通过运行session.run([optimize, loss],...)
来优化嵌入层和神经网络。我们还得出最终的损失,以确保它随着时间的推移而减少。
***# Optimize the embedding layer and neural network*
*# compute loss*
feed_dict = {train_dataset : batch_data, train_labels : batch_labels}
_, l = session.run([optimizer, loss], feed_dict=feed_dict)**
在这里,每 5000 步,我们打印平均损失,作为视觉辅助。
****if** (step+1) % 5000 == 0:
**if** step > 0:
average_loss = average_loss / 5000
print('Average loss at step **%d**: **%f**' % (step+1, average_loss))
average_loss = 0**
最后,我们得到最终的嵌入,我们稍后使用它来可视化某些单词。
**sg_embeddings = normalized_embeddings.eval()
session.close()**
最后,如果您使用像 t-SNE 这样的流形学习算法来可视化嵌入,您将得到以下结果。
正如你所看到的,与猫相关的单词是沿着某个方向找到的,而与狗相关的单词是沿着不同的方向找到的。介于这两个方向之间的单词(例如动物或宠物)正是我们所需要的。
结论
我们的谈话就此结束。单词向量是一种非常强大的单词表示,有助于机器学习模型更好地执行。我们经历了数据生成过程以及 Word2vec 模型中的不同组件。然后我们讨论了 Word2vec 算法的一个特定变体;跳过 gram 模型。我们在 TensorFlow 中实现了该算法。最后,我们可视化了嵌入,看到学习到的嵌入实际上描述了一些有用的语义。你可以在这里 找到练习文件 。
如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
thushv89.medium.com](https://thushv89.medium.com/membership)****
想在深度网络和 TensorFlow 上做得更好?
检查我在这个课题上的工作。
[2] (视频课程)Python 中的机器翻译 — DataCamp
[3] (书)TensorFlow 中的自然语言处理 1 — Packt
闪电谈话:使用 HDBScan 进行集群
最近,我应邀就一种叫做 HDBScan 的聚类算法做了一个简短的演讲。HDBScan 基于 DBScan 算法,与其他聚类算法一样,它用于将相似的数据分组在一起。
Clustering with HDBScan
我在演讲中涉及了三个主题:HDBScan 的优点、实现以及它是如何工作的。
优势
常规 DBScan 在对不同形状的数据进行聚类方面非常出色,但在对不同密度的数据进行聚类方面却表现不佳。你可以去 Naftali Harris 的博客看看关于 DBScan 的文章,然后玩玩密度条散点图。
下面是 Naftali 网站上的密度条散点图的副本。你可以看到,有一个主要的中心集群和噪声在左边和右边。
Density Bars
玩了参数之后,下面是 DBScan 的表现。它能够得到中心星团,但也产生了许多没有多大意义的迷你星团。
Density Bars with DBScan Applied
下面是 HDBScan 的表现。我只能得到我正在寻找的一个集群。不幸的是,没有算法是完美的,它确实把一些噪声放到了紫色的簇中,但它比常规的 DBScan 更接近我所寻找的。
Density Bars with HDBScan Applied
除了更适合不同密度的数据,它还比常规的 DBScan 更快。下面是几个聚类算法的图表,DBScan 是深蓝色,HDBScan 是深绿色。在 200,000 记录点,DBScan 花费的时间大约是 HDBScan 的两倍。随着记录数量的增加,DBScan 和 hdb scan 性能之间的差异也会增加。
Source: http://hdbscan.readthedocs.io/
实现
HDScan 是一个独立于 scikitlearn 的库,所以你要么 pip 安装它,要么 conda 安装它。
两种算法都有最小样本数参数,该参数是记录成为核心点的邻居阈值。
DBScan 有一个参数 epsilon,它是那些邻居形成核心的半径。这是 DBScan 上图的 DBSCAN 实现(eps = 0.225,min_samples=4)。
HDBScan 的参数是最小集群大小,即集群需要多大才能形成。这比 epsilon 更直观,因为您可能知道您的集群需要多大才能做出可行的决策。这是 HDBScan 上图的 HDBSCAN 实现(min_samples=11,min_cluster_size=10,allow_single_cluster=True)。
工作原理
这两种算法都是从查找每个点的核心距离开始的,核心距离是该点与其由最小样本参数定义的最远邻居之间的距离。由于蓝点落在绿点的半径内,绿点可以捕捉蓝点作为其集群的一部分。然而,红点不在绿点的半径范围内,反之亦然,因此两个点都不能捕捉彼此(尽管它们可以通过其他点连接)。
Core Distances: http://hdbscan.readthedocs.io/
潜在的簇可以形成树状图,树状图上的 DBScan 的截止点是ε。
Expanded Dendogram: http://hdbscan.readthedocs.io/
HDBScan 以不同的方式处理这个问题,它丢弃微小的分支,而保留由最小簇大小参数定义的最大簇。这导致了一个更加浓缩的树突图,如下图所示。
Condensed HDBScan Dendogram
HDBScan 是为具有不同密度的数据的真实场景而构建的,它相对较快,并且允许您根据大小来定义哪些集群对您来说是重要的。总的来说,HDBScan 似乎是一个很棒的算法。如果您想要上面相应视频的我的幻灯片的链接,请单击此处。
来源:
文件:【http://hdbscan.readthedocs.io/
使用 HDBSCAN 实现高性能集群:https://www.youtube.com/watch?v=AgPQ76RIi6A
可视化 DBScan 聚类:https://www . naftaliharris . com/blog/visualizing-DBS can-Clustering/
大学记忆会随着时间变好吗?
大学真的那么棒吗,还是事后看来只是如此?
毕业季
5 月,全国各地的学生大学毕业。我在脸书的博客上充斥着帽子和礼服的自拍照、给家长的感谢信,以及对人们在学校时光的冗长反思。
呃。
我回到了大学时代——友谊、聚会,偶尔还有学习。
大学是一段神奇的时光,在这里你没有压力,没有责任,没有规则。日常生活中最困难的决定是晚餐是点披萨还是中餐。
或者是?
虽然大学现在看起来像是 4 年的假期,但我不确定当我入学时是否真的有这种感觉。当我熬夜到凌晨 2 点,把布莱克-斯科尔斯公式死记硬背的时候,我并不觉得大学有什么乐趣。当我拼命想找一份暑期实习时,我也没有感到特别没有压力。
我一直认为大学是我一生中最美好的时光,但当我开始反思我的大学经历时,我就不那么确定了。我开始想,我对大学的美好回忆有多少是因为大学真的很棒,又有多少是因为怀旧引发的回忆。
为了解决我的疑问,我决定进行一项调查。
耶,分析。
我招募了 317 名 4 年制本科项目的学生或毕业生。
除了典型的人口统计学问题(性别、年龄等。),我问人们他们什么时候/是否毕业,他们获得了什么学位或正在攻读什么学位(文学士、理学士等)。).
我还要求人们将他们的大学经历与典型的大学经历在五个方面进行比较:快乐、压力、有用性和价值。对于每项指标,每个人都给出了 1 到 10 分的评分,10 分明显高于平均水平,1 分明显低于平均水平,5 分是大学经历的平均水平。这让我可以比较不同的维度,并为每个人提供相同的基准,无论他们何时毕业。
我调查的 317 人中,女性 137 人,男性 179 人,还有 1 人是“其他”。在这些回复中,107 人是在校学生(目前正在参加 4 年制本科项目或在过去 6 个月内毕业),210 人是大学毕业生。
我结合使用 Python、Tableau 和优秀的老式 Excel,分析了这些回复。以下是研究结果:
人们认为他们是特殊的雪花,有着高于平均水平的大学经历。
所有五个维度的平均评分都高于 5 分,这是大学经历的基准。人们倾向于认为他们的大学经历高于平均水平,这并不奇怪,因为人们通常觉得他们在生活中高于平均水平。
“难度”指标最接近基准(平均评分:5.70),而每个人都觉得自己的大学经历格外“值得”(平均评分:6.47)。
一旦你毕业了,大学似乎就没那么困难、压力和有用了。
大学生和毕业生之间的三个指标在统计上有所不同:“难度”、“压力”和“有用性”。大学生的平均评分不仅高于基准,也高于毕业生。
换句话说,如果你在大学,你倾向于认为你的经历比已经毕业的人更困难、更有压力、更有用。
为什么?
假设一:大学变难了。
一个可能的解释是,随着时间的推移,大学经历实际上已经发生了变化。现在的学生认为大学更困难、更有压力、更有用,因为大学更困难、更有压力、更有用。
这种影响在调查中得到了控制,因为每个人都给出了相对于“典型的大学经历”的评级。如果随着时间的推移,大学变得更具挑战性,人们对“典型的大学经历”的定义也会随之改变。因此,虽然这种影响是可能的,但它不会导致学生和毕业生之间的评分差异。
假设 2:改变大学记忆
另一种可能的解释是,人们对大学的记忆发生了变化。我们的记忆就像高年级学生参加上午 9 点的课程一样可靠。研究表明,每当我们回忆起一件事的时候,我们的记忆就会发生变化,因此,也许有压力的记忆,比如大三生物期末考试,已经随着时间的推移变得柔和,改变了我们对大学经历的看法。
这个假设很难被完美地检验,但是如果记忆的改变已经显著地影响了大学毕业生的评分,你可能会期待不同的评分取决于他们毕业的时间。
我把大学毕业生分成两组——应届毕业生(毕业于 5 年或不到 5 年)和老毕业生(毕业于 10 年或 10 年以上)。然后我比较了他们的评分。
事实证明,这五个指标在统计上没有什么不同。因此,尽管我们的记忆被扭曲了,但这并不是收视率差异背后的主要驱动力。
假设 3:改变视角
第三种可能是毕业后人们对大学的视角发生了变化。改变的不是大学记忆,而是我们如何判断这些记忆。
大多数大学生几乎没有全职工作、支付账单或抚养家庭的经验。正因为如此,大学期间的每一个项目、作业和考试似乎都是一项艰巨的任务。
毕业时,毕业生意识到大学比“现实生活”更容易。因此,大学毕业生倾向于认为大学压力更小,更难,更有用,因为他们的标准已经提高了。
支持这一假设的一个指标是,在过去三年内毕业的人给大学的“难度”评级明显低于现在的学生(6.18 比 4.95)。三年的时间不足以让大学经历发生巨大变化,人们的记忆也不太可能被严重扭曲。这表明,在现实世界中呆上几年已经影响了人们对“困难”真正含义的定义。
大学和你记忆中的一样愉快,也值得每年 4 万美元的学费。
大学生和大学毕业生有两个相似的评价——快乐和有价值。我们认为我们享受大学生活的程度和我们实际享受大学生活的程度相当接近。阿瑟·罗斯有句名言“我爱大学”,显然,你永远不会忘记这句话。
虽然一旦人们毕业,有用性就会下降,但价值却不会下降。事实上,对于学生和毕业生来说,“有价值”相对于其他指标得分最高。显然,你是否会用你在莎士比亚哲学 101 中学到的东西并不影响你是否认为大学是值得的。
不同的人有不同的评价
比较男性和女性的评价,女性发现大学比男性压力更大,而“难度”在统计上没有差异。因此,学业似乎不是大学里唯一的压力来源——参加过新生入学迎新会的人都不会感到惊讶。
我也比较了不同的大学专业。大多数人要么追求文学学士,要么追求理学学士,所以我专注于这两个学位。两个学位都认为大学同样值得,但文学学士更有趣:更高的乐趣,更低的难度,更低的压力。这也不会让任何一个上过工程学课并在黑板上看到外语开发的人感到惊讶。
我需要一杯啤酒。
所以大学的某些方面在毕业后有所提高,而其他方面保持不变。有一件事是肯定的,当你可以的时候享受大学生活。这么多电影都是关于大学的,而几乎没有电影是关于保住一份工作并获得稳定收入的,这是有原因的。
有机会通过挖掘每个维度来建立这个调查:是什么让大学变得愉快?是什么让大学变得艰难?在兄弟会聚会上认识脸书的某个人后,在加他们为好友之前,应该等待多长时间?
但是现在,我想我需要一盏明亮的灯,打个盹。
你可能喜欢的其他文章
如果你喜欢这篇文章,请访问LateNightFroyo.com,阅读关于爱情、生活等话题的话题。
用于深度学习的线性代数备忘单
常用操作初学者指南
在杰瑞米·霍华德出色的深度学习课程中,我意识到我对先决条件有点生疏,我的模糊性影响了我理解反向传播等概念的能力。我决定就这些话题整理几个维基页面来提高我的理解。这里是深度学习中使用的一些更常见的线性代数运算的非常基本的介绍。新:查看机器学习备忘单了解更多主题。
什么是线性代数?
在深度学习的背景下,线性代数是一个数学工具箱,为同时操作多组数字提供了有用的技术。它提供了像向量和矩阵(电子表格)这样的结构来保存这些数字,以及如何加、减、乘、除这些数字的新规则。
为什么有用?
它把复杂的问题变成简单、直观、有效计算的问题。这是一个线性代数如何实现更快的速度和更简单的例子。
*# Multiply two arrays*
x = [1,2,3]
y = [2,3,4]
product = []
for i in range(len(x)):
product.append(x[i]*y[i])*# Linear algebra version*
x = numpy.array([1,2,3])
y = numpy.array([2,3,4])
x * y
初始化数组后,线性代数方法的速度提高了 3 倍。
在深度学习中是如何使用的?
神经网络将权重存储在矩阵中。线性代数让矩阵运算变得快速简单,尤其是在 GPU 上训练的时候。事实上,GPU 是在考虑向量和矩阵运算的情况下创建的。与图像可以表示为像素阵列类似,视频游戏使用巨大的、不断发展的矩阵来产生引人注目的游戏体验。GPU 不是逐个处理像素,而是并行处理整个像素矩阵。
向量
向量是数字或术语的一维数组。在几何学中,向量存储了一个点的潜在变化的大小和方向。向量[3,-2]表示向右 3,向下 2。一维以上的向量称为矩阵。
向量记法
有多种方法来表示向量。这里有一些你可能会在阅读中遇到的。
几何中的向量
向量通常表示从一个点开始的运动。它们存储了一个点的潜在变化的幅度和方向。向量[-2,5]表示向左移动 2 个单位,向上移动 5 个单位。来源。
v = [-2, 5]
矢量可以应用于空间中的任何一点。向量的方向等于向上移动 5°和向左移动 2°所产生的斜边的斜率。它的大小等于斜边的长度。
标量运算
标量运算涉及一个向量和一个数。通过对向量中的所有值进行加、减或乘运算,可以就地修改向量。
Scalar addition
元素式操作
在像加、减、除这样的元素运算中,位置对应的值被组合起来产生一个新的向量。向量 A 中的第一个值与向量 b 中的第一个值配对,第二个值与第二个值配对,依此类推。这意味着向量必须有相等的维数才能完成运算。*
Vector addition
y = np.array([1,2,3])
x = np.array([2,3,4])
y + x = [3, 5, 7]
y - x = [-1, -1, -1]
y / x = [.5, .67, .75]
*有关 numpy 中广播的详细信息,请参见下文。
矢乘法
矢量乘法有两种类型:点积和哈达玛积。
点积
两个向量的点积是一个标量。向量和矩阵的点积(矩阵乘法)是深度学习中最重要的运算之一。
y = np.array([1,2,3])
x = np.array([2,3,4])
np.dot(y,x) = 20
哈达玛乘积
哈达玛乘积是逐元素乘法,它输出一个向量。
y = np.array([1,2,3])
x = np.array([2,3,4])
y * x = [2, 6, 12]
向量场
向量场显示了如果我们对点 (x,y) 应用像加法或乘法这样的向量函数,该点会假设移动多远。给定空间中的一个点,矢量场显示了我们提出的在图中的多个点处的 功率 和 方向 。
这个向量场很有趣,因为它根据起点向不同的方向移动。原因是该字段后面的向量存储类似于 2x 或 x 的项,而不是类似于-2 和 5 的标量值。对于图上的每个点,我们将 x 坐标插入到 2x 或 x 中,并绘制一个从起点到新位置的箭头。向量场对于可视化机器学习技术(如梯度下降)非常有用。
矩阵
矩阵是数字或术语的矩形网格(类似于 Excel 电子表格),具有特殊的加法、减法和乘法规则。
矩阵维度
我们用行和列来描述矩阵的维数。
a = np.array([
[1,2,3],
[4,5,6]
])
a.shape == (2,3)b = np.array([
[1,2,3]
])
b.shape == (1,3)
矩阵标量运算
对矩阵的标量运算与对向量的运算方式相同。只需将标量应用于矩阵中的每个元素——加、减、除、乘等。
Matrix scalar addition
a = np.array(
[[1,2],
[3,4]])
a + 1
[[2,3],
[4,5]]
矩阵元素运算
为了加、减或除两个矩阵,它们必须有相等的维数。*我们以元素方式组合相应的值,以生成新的矩阵。
a = np.array([
[1,2],
[3,4]
])
b = np.array([
[1,2],
[3,4]
])a + b
[[2, 4],
[6, 8]]a — b
[[0, 0],
[0, 0]]
数字广播*
我不能逃避谈论这个,因为它在实践中非常相关。在 numpy 中,通过一种叫做广播的机制放宽了元素操作的维度要求。如果每个矩阵中的相应维度(行与行、列与列)满足以下要求,则两个矩阵是兼容的:
- 尺寸相等,或
- 一个维度的大小为 1
a = np.array([
[1],
[2]
])
b = np.array([
[3,4],
[5,6]
])
c = np.array([
[1,2]
])# Same no. of rows
# Different no. of columns
# but **a** has one column so this works
a * b
[[ 3, 4],
[10, 12]]# Same no. of columns
# Different no. of rows
# but **c** has one row so this works
b * c
[[ 3, 8],
[5, 12]]# Different no. of columns
# Different no. of rows
# but both **a** and **c** meet the
# size 1 requirement rule
a + c
[[2, 3],
[3, 4]]
在更高的维度——3D,4D,事情会变得更奇怪,但现在我们不会担心这个。了解 2D 的运作是一个良好的开端。
矩阵 Hadamard 积
矩阵的 Hadamard 乘积是一种元素运算。位置对应的值相乘产生新的矩阵。
a = np.array(
[[2,3],
[2,3]])
b = np.array(
[[3,4],
[5,6]])# Uses python's multiply operator
a * b
[[ 6, 12],
[10, 18]]
在 numpy 中,只要矩阵和向量的维数满足广播的要求,就可以取它们的 Hadamard 积。
矩阵转置
神经网络经常处理不同大小的权重和输入,其中维数不满足矩阵乘法的要求。矩阵转置提供了一种“旋转”其中一个矩阵的方法,以便操作符合乘法要求并可以继续。转置矩阵有两个步骤:
- 将矩阵向右旋转 90 度
- 颠倒每行中元素的顺序(例如,[a b c]变成[c b a])
举个例子,把矩阵 M 转置成 T :
a = np.array([
[1, 2],
[3, 4]])a.T
[[1, 3],
[2, 4]]
矩阵乘法
矩阵乘法指定了一组将矩阵相乘以生成新矩阵的规则。
规则
并非所有矩阵都适合乘法。此外,对最终矩阵输出的尺寸也有要求。来源。
- 第一个 矩阵的 列数必须等于第二个 矩阵的 行数
- 一个 M×N 矩阵和一个 N×K 矩阵的乘积是一个 M×K 矩阵。新矩阵取第一个 的 行和第二个 的 列
步伐
矩阵乘法依靠点积来乘以各种行和列的组合。下图取自汗学院的优秀线性代数课程,矩阵 C 中的每个条目都是矩阵 A 中的一行和矩阵 b 中的一列的点积。
操作a1B1**意味着我们取矩阵 A (1,7) 中第一行和矩阵 B (3,5)中第一列的点积。
这是另一种看待它的方式:
用这些例子测试你自己
numpy 矩阵乘法
Numpy 使用函数np.dot(A,B)
进行向量和矩阵乘法。它还有一些其他有趣的特性和陷阱,所以我鼓励你在使用前阅读文档这里。
a = np.array([
[1, 2]
])
a.shape == (1,2)b = np.array([
[3, 4],
[5, 6]
])
b.shape == (2,2)# Multiply
mm = np.dot(a,b)
mm == [13, 16]
mm.shape == (1,2)
教程
可汗学院线性代数
深度学习书籍数学部分
吴恩达的课程笔记
线性代数讲解
矩阵讲解
线性代数入门
迷你参考线性代数 4 页
深度学习背景下的线性代数解释
Photo by Charles Deluvio 🇵🇭🇨🇦 on Unsplash
在这篇文章中,我使用了自顶向下的方式来解释深度学习的线性代数。首先提供应用程序和用途,然后深入提供概念。
维基百科中线性代数的定义:
线性代数是关于线性方程和线性函数及其通过矩阵和向量空间表示的数学分支。
目录:
- 引言。
- 向量和矩阵的数学观点。
- 矩阵的类型。
- 矩阵分解。
- 规范。
- 矢量化。
- 广播。
- 外部资源。
Laxman Vijay (buymeacoffee.com)
简介:
如果你开始学习深度学习,你首先会接触到的是前馈神经网络,这是深度学习中最简单也是最有用的网络。在引擎盖下,前馈神经网络只是一个复合函数,将一些矩阵和向量相乘。
这并不是说向量和矩阵是进行这些运算的唯一方法,但是如果你这样做,它们会变得非常高效。
上图显示了一个简单的向前传播信息的前馈神经网络。
该图像是神经网络的漂亮表示,但是计算机如何理解这一点。在计算机中,神经网络的各层用向量表示。将输入层视为 X,将隐藏层视为 h。现在不考虑输出层。(这里不涉及前馈神经网络的计算过程。)
所以,它可以用向量和矩阵来表示,
上图显示了计算上述神经网络的第一个也是唯一一个隐藏层的输出所需的操作(未显示输出层的计算)。我们来分解一下。
网络的每一列都是向量。向量是数据(或特征)集合的动态数组。在当前的神经网络中,向量’ x '保存输入。将输入表示为向量并不是强制性的,但是如果你这样做,它们会变得越来越便于并行执行操作。
深度学习,具体来说,神经网络的计算成本很高,所以它们需要这个好技巧来加快计算速度。
这叫矢量化。它们使得计算速度极快。这就是为什么深度学习需要 GPU 的主要原因之一,因为它们擅长矩阵乘法之类的矢量化运算。(我们将在最后深入了解这一点)。
隐藏层 H 的输出通过执行 H = f( W 来计算。x + b)。
这里 W 称为权重矩阵,b 称为偏差,f 是激活函数。(本文不解释关于前馈神经网络,如果你需要一本关于 FFNN 概念的初级读本,看这里。)
让我们分解这个等式,
第一个组件是 W 。x;这是一个矩阵-向量乘积,因为 W 是矩阵, x 是向量。在开始乘法运算之前,让我们先了解一下符号:通常向量用小粗斜体字母表示(如 x ),矩阵用大写粗斜体字母表示(如 X )。如果字母是大写加粗但不是斜体,那么它是一个张量(如 X )。
从计算机科学的角度来看
标量:单个数字。
Vector:值的列表。(秩 1 张量)
矩阵:二维值列表。(秩 2 张量)
张量:秩为 n 的多维矩阵。
向下钻取:
从数学的角度:
矢量:
矢量是既有大小又有方向的量。它是一个存在于空间的实体,如果它是一个存在于真实空间的二维向量,它的存在用 x∈ ℝ 表示。(每个元素表示沿不同轴的坐标。)
red and blue color vectors are the basis vectors.
2D 空间中的所有向量都可以通过称为基向量的两个向量的线性组合来获得。(用 I 和 j 表示)(一般来说,N 维的向量可以用 N 个基向量来表示。)它们是单位法向量,因为它们的大小是 1,并且它们彼此垂直。这两个向量中的一个不能用另一个向量来表示。所以它们被称为线性无关矢量。(如果任何一个向量不能由一组向量的线性组合得到,那么这个向量与那个集合线性无关)。可以通过这两个向量的线性组合获得的 2D 空间中的所有点集被称为这些向量的跨度。如果一个向量由一组其他向量的线性组合(加法、乘法)来表示,那么它线性依赖于该组向量。(将这个新向量添加到现有集合中是没有用的。)
任何两个矢量都可以相加。它们可以相乘。它们的乘法有两种类型,点积和叉积。参考此处。
矩阵:
*矩阵是数字的 2D 阵列。它们代表转换。2 * 2 矩阵的每一列表示在 2D 空间被应用该变换之后的 2 个基本向量中的每一个。它们的空间表示是 W ∈ ℝ 有 3 行 2 列。
一个矩阵的向量积叫做那个向量的变换,而一个矩阵的矩阵积叫做变换的合成。
只有一个矩阵不对向量做任何变换。就是单位矩阵( I )。I 列代表基矢。
矩阵的行列式用 det()表示矩阵所描述的线性变换的比例因子。****
为什么数学视角对深度学习研究者很重要?因为它们帮助我们理解基本对象的基本设计概念。他们也帮助设计深度学习问题的创造性解决方案。但是不用担心,有很多语言和软件包为我们做这些实现。但是知道它们的实现也很好。
python 编程语言的 numpy 就是这样一个库。
有很多学习数字的资源。(这对学习深度学习很重要,如果用 python 的话。)看这里。
在这里,np.array 创建了一个 numpy 数组。
np.random 是一个包含随机数生成方法的包。
点法是计算矩阵间乘积的方法。
我们可以改变 numpy 数组的形状并检查它。
这里可以看到,W.x 的乘积是一个矢量,加上 b,b 是一个标量。这会自动将 b 扩展为转置([1,1])。 这种 b 到几个位置的隐式复制称为广播。(一会儿我们会深入了解。)
你注意到转置这个词了吗: 一个矩阵的转置是矩阵的镜像跨过对角线(从矩阵的左上到右下。)
**## numpy code for transpose
import numpy as np
A = np.array([[1,2],
[3,4],
[5,6]])
B = np.transpose(A)
##or
B = A.T**
矩阵类型:
对角矩阵:除主对角元素外,所有元素为零。
diagonal matrix
单位矩阵:对角值为 1 的对角矩阵。
identity matrix
**## numpy code to create identity matrix
import numpy as np
a = np.eye(4)**
对称矩阵:与其转置矩阵相等的矩阵。A =转置(A)
奇异矩阵:行列式为零,列线性相关的矩阵。它们的秩小于矩阵的行数或列数。
矩阵分解:
矩阵分解或矩阵分解是将矩阵分解成矩阵的乘积。有许多不同的矩阵分解;每一种都在一类特定的问题中找到用途。最广泛使用的一种矩阵分解叫做特征分解,我们将矩阵分解成一组特征向量和特征值。
方阵的本征向量是非零向量使得乘以仅改变的比例****
A . v=λ。 v
这里 v 是本征向量,λ是本征值。
**## numpy program to find eigen vectors.
from numpy import array
from numpy.linalg import eig
# define matrix
A = array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(A)
# calculate eigendecomposition
values, vectors = eig(A)
print(values)
print(vectors)**
特征分解在机器学习中非常有用。这对于降维这样的概念特别有用。
有关特征分解的更多信息,请参考深度学习书籍第 2 章
深度学习中还会用到其他几种矩阵分解技术。看这里。
规范:
过拟合和欠拟合:
当你参加深度学习讲座时,你经常会听到过度适应和欠适应这个术语。这些术语描述了深度学习模型的准确性状态。
This image is the best explanation of overfitting and underfitting.
过拟合是指模型对训练数据学习得太好。它真的窃取了训练数据。在过拟合模型中,训练精度非常高,验证精度非常低。
欠拟合模型无法学习训练数据。在欠拟合模型中,训练和验证精度都非常低。
过度拟合和欠拟合都会导致模型性能不佳。但到目前为止,应用机器学习中最常见的问题是过度拟合。
为了减少过度拟合,我们必须使用一种叫做正则化的技术。防止对训练数据的强记,从而避免过拟合的风险。****
深度学习工程师的最重要的职责**是创建一个通常适合输入的模型。正则化有几种方法。最著名的是 L1 正则化(Lasso)和 L2 正则化(Ridge)。**
没有提供这些的细节,但是要理解这些,你必须知道什么是规范。
定额:
范数是向量的大小。向量 x 的范数的一般公式为:
p=2 的 L 范数称为欧几里德范数,因为它是原点和 x. 之间的欧几里德距离
L 范数就是向量所有元素的和。当系统需要更高的精度时,它用于机器学习。清楚地区分零元素和非零元素。L 范数也被称为曼哈顿范数。
还有最大范数,是量值最大的元素的绝对值。
矩阵的 L 范数等价于 frobenius 范数。
frobenius norm.
不仅在正则化,规范也用于优化程序。
好了,现在在所有这些概念和理论之后,我们开始涵盖深度学习所需的最重要的部分。它们是向量化和广播。
矢量化:
这是减少循环执行的技巧,通过提供向量形式的数据使进程并行执行。
许多 CPU 都有“向量”或“SIMD”(单指令多数据)指令集,这些指令集同时对两个、四个或更多个数据应用相同的操作。20 世纪 90 年代初,SIMD 在通用 CPU 上开始流行。
更多详细信息,请查看弗林的分类。
向量化是重写一个循环的过程,它不是处理数组中的一个元素 N 次,而是同时处理(比如说)数组中的 4 个元素 N/4 次。
Numpy 在他们的算法中大量实现了矢量化。这是 numpy 的官方声明。
矢量化描述了没有任何显式循环、索引等。,在代码中——当然,这些事情只是在优化、预编译 C 代码的“幕后”发生。矢量化代码有许多优点,其中包括:
矢量化代码更加简洁,也更容易阅读
更少的代码行通常意味着更少的错误
代码更类似于标准的数学符号(通常更容易正确地编写数学结构)
矢量化会产生更多“Pythonic 式”代码。如果没有向量化,我们的代码将充斥着低效和难以阅读的循环。
代码示例:
**## to add two arrays together.## consider two basic python lists.
a = [1,2,3,4,5]
b = [2,3,4,5,6]
c = []## without vectorization.for i in range(len(a)):
c.append(a[i]+b[i])## using vectorization.a = np.array([1,2,3,4,5])
b = np.array([2,3,4,5,6])
c = a+b**
上面的代码示例是一个过于简化的矢量化示例。而当输入数据变大时,矢量化才真正发挥作用。****
关于矢量化的更多细节,请看这里。
广播:
下一个重要的概念是广播。杰瑞米·霍华德爵士在他的一次机器学习讲座中说,广播可能是机器学习程序员最重要的工具和技能。
来自 Numpy 文档:
**The term broadcasting describes how numpy treats arrays with
different shapes during arithmetic operations. Subject to certain
constraints, the smaller array is “broadcast” across the larger
array so that they have compatible shapes. Broadcasting provides a
means of vectorizing array operations so that looping occurs in C
instead of Python. It does this without making needless copies of
data and usually leads to efficient algorithm implementations.**
代码示例:
**a = np.array([1.0, 2.0, 3.0])
b = 2.0
a * b
array([ 2., 4., 6.])this is similar toa = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
a * b
array([ 2., 4., 6.])**
数组 b 被扩展,从而可以应用算术运算。
广播不是一个新概念。这是一个相对古老的工具,可以追溯到 50 年代。在他的论文 " 符号作为思维工具 " ,中,Kenneth Iverson 描述了几种数学使用工具,这些工具允许我们以新的视角思考。他第一次提到广播不是作为一种计算机算法,而是作为一种数学过程。他在一个名为 APL 的软件中实现了许多这样的工具。
他的儿子后来扩展了他的想法,继续创造了另一个软件,叫做 J 软件。这一姿态意味着,通过软件,我们得到的是超过 50 年的深入研究,利用这些,我们可以在一小段代码中实现非常复杂的数学函数。
同样非常方便的是,这些研究也在我们今天使用的语言中找到了自己的方式,比如 python 和 numpy。
所以请记住,这些不是一夜之间产生的简单想法。这些就像是思考数学及其软件实现的基本方法。(以上内容摘自 fast.ai 机器学习课程。)
关于 numpy 版本广播的更多细节,看这里。
好了,这就够了,这篇文章向初学者介绍了许多新单词和术语。但是我也跳过了几个向量代数的深层概念。这可能是压倒性的,但我仍然使概念尽可能实用,(欢迎反馈!).
由于我刚刚开始深度学习,我决定帮助其他已经开始的人,为他们提供关于深度学习术语和东西的直观文章。所以如果你觉得这些文章有什么错误,请在评论中发表。
以下是一些有用的资源:
深入直观的线性代数视频: 3blue1brown
电子书:https://www.math.ucdavis.edu/~linear/linear-guest.pdf
学习深度学习的最佳站点: fast.ai
一本完整的学习书:深度学习书,作者 Ian Goodfellow。
用于深度学习的线性代数
每个深度学习程序背后的数学。
深度学习是机器学习的一个子域,涉及模拟大脑功能和结构的算法,称为人工神经网络。
线性代数是一种连续而非离散的数学形式,许多计算机科学家对它没有什么经验。对线性代数的良好理解对于理解和使用许多机器学习算法,尤其是深度学习算法至关重要。
为什么是数学?
线性代数、概率和微积分是机器学习的“语言”。学习这些主题将有助于更深入地理解底层算法机制,并允许开发新的算法。
当局限于更小的水平时,深度学习背后的一切都是数学。所以在开始深度学习和编程之前,了解基本的线性代数是非常重要的。
深度学习背后的核心数据结构是标量、向量、矩阵和张量。从程序上来说,让我们用这些来解决所有基本的线性代数问题。
标量
标量是单个数,是 0 阶张量的一个例子。符号 x ∈ ℝ表示 x 是属于一组实数值ℝ.的标量
深度学习中有不同组的感兴趣的数字。ℕ表示正整数(1,2,3,…)的集合。ℤ指定的整数,结合了正值,负值和零值。ℚ表示可以表示为两个整数的分数的有理数的集合。
少数内置标量类型是 Python 中的 int , float , complex , bytes , Unicode 。在 python 库 NumPy 中,有 24 种新的基本数据类型来描述不同类型的标量。有关数据类型的信息,请参考此处的文档。
在 Python 中定义标量和少量运算:
下面的代码片段解释了标量上的一些算术运算。
<class 'int'>
<class 'float'>
12.5
-2.5
37.5
0.6666666666666666
下面的代码片段检查给定的变量是否是标量。
True
False
True
向量
向量是单个数字的有序阵列,是一阶张量的一个例子。向量是称为向量空间的对象片段。向量空间可以被认为是特定长度(或维度)的所有可能向量的全部集合。由ℝ^3 表示的三维实值向量空间经常被用来以数学方式表示我们的三维空间的真实世界概念。
为了明确地识别向量的必要分量,向量的第 I 个标量元素被写成 x[i]。
中的深度学习向量通常表示特征向量,其原始成分定义了特定特征的相关程度。这种元素可以包括二维图像中一组像素的强度的相关重要性,或者金融工具横截面的历史价格值。
在 Python 中定义矢量和少量运算:
<class 'list'>
[1, 2, 3, 4, 5, 6]
[5 7 9]
<class 'numpy.ndarray'>
[-3 6 -3]
矩阵
矩阵是由数字组成的矩形阵列,是二阶张量的一个例子。如果 m 和 n 是正整数,即 m,n ∈ ℕ,那么 m×n 矩阵包含 m*n 个数字,有 m 行和 n 列。
完整的 m×n 矩阵可以写成:
将整个矩阵分量显示简化为以下表达式通常很有用:
在 Python 中,我们使用 numpy 库来帮助我们创建 n 维数组。这些基本上都是矩阵,我们使用矩阵方法,传入列表,从而定义一个矩阵。
$python
>>> import numpy as np
>>> x = np.matrix([[1,2],[2,3]])
>>> x
matrix([[1, 2],
[2, 3]])
>>> a = x.mean(0)
>>> a
matrix([[1.5, 2.5]])
>>> # Finding the mean with 1 with the matrix x.
>>> z = x.mean(1)
>>> z
matrix([[ 1.5],
[ 2.5]])
>>> z.shape
(2, 1)
>>> y = x - z
matrix([[-0.5, 0.5],
[-0.5, 0.5]])
>>> print(type(z))
<class 'numpy.matrixlib.defmatrix.matrix'>
在 Python 中定义矩阵和少量运算:
矩阵加法
矩阵可以添加到标量,向量和其他矩阵。这些操作中的每一个都有精确的定义。这些技术在机器学习和深度学习中经常使用,因此值得你熟悉它们。
矩阵-矩阵加法
c = A+B(A 和 B 的形状应该相等)
方法 shape 返回矩阵的形状,add 接受两个参数并返回这些矩阵的和。如果矩阵的形状不一样,它会抛出一个错误,说,加法不可能。
矩阵标量加法
将给定标量与给定矩阵中的所有元素相加。
矩阵标量乘法
将给定标量乘以给定矩阵中的所有元素。
矩阵乘法
形状为(m×n)的 a 和形状为(n×p)的 B 相乘得到形状为(m×p)的 C
矩阵转置
通过转置,您可以将行向量转换为列向量,反之亦然:
a =[aijmxn
AT=[a ji ]n×m
张量
张量的更一般的实体包括标量、矢量和矩阵。在物理科学和机器学习中,有时有必要使用二阶以上的张量。
我们使用像 tensorflow 或 PyTorch 这样的 Python 库来声明张量,而不是嵌套矩阵。
在 PyTorch 中定义简单张量
Python 中很少对张量进行算术运算
更多关于张量和 PyTorch 的文档请点击这里。
重要链接
要开始使用 python 进行深度学习:
人脑模仿。
towardsdatascience.com](/deep-learning-with-python-703e26853820) [## 机器学习导论
机器学习是一种从例子和经验中学习的想法,而不是显式编程。而不是…
towardsdatascience.com](/introduction-to-machine-learning-db7c668822c4)
结束语
感谢阅读。如果你觉得这个故事有帮助,请点击下面的👏去传播爱。
特别感谢 Samhita Alla 对本文的贡献。
用于深度学习的基础线性代数
线性代数的概念对于理解机器学习背后的理论至关重要,尤其是对于深度学习。它们给你更好的直觉,让你知道算法到底是如何工作的,这让你能够做出更好的决定。所以,如果你真的想成为这个领域的专业人士,你就不能逃避掌握它的一些概念。这篇文章将向你介绍在机器学习中使用的线性代数的最重要的概念。
目录:
- 简介
- 数学对象
- 计算规则
- 矩阵乘法性质
- 求逆和转置
- 总结
- 资源
介绍
线性代数是数学的一种连续形式,应用于整个科学和工程领域,因为它允许您对自然现象建模并有效地计算它们。因为它是一种连续而非离散的数学形式,许多计算机科学家对此没有太多的经验。线性代数也是几乎所有数学领域的核心,如几何和泛函分析。它的概念是理解机器学习背后的理论的一个至关重要的先决条件,特别是如果你正在使用深度学习算法。在开始机器学习之前,您不需要了解线性代数,但在某些时候,您可能希望更好地了解不同的机器学习算法在幕后是如何工作的。这将帮助你在机器学习系统的开发过程中做出更好的决策。所以如果你真的想成为这个领域的专业人士,你就必须掌握线性代数中对机器学习很重要的部分。在线性代数中,数据由线性方程表示,线性方程以矩阵和向量的形式呈现。因此,您主要是在处理矩阵和向量,而不是标量(我们将在下一节讨论这些术语)。当您拥有合适的库(如 Numpy)时,只需几行代码就可以非常容易地计算复杂的矩阵乘法。(注:这篇博文忽略了对机器学习不重要的线性代数概念。)
数学对象
数量
标量就是一个简单的数字。例如 24。
矢量
向量是有序的数字数组,可以在行或列中。向量只有一个索引,它可以指向向量中的一个特定值。例如,V2 指的是向量中的第二个值,在上图中是-8。
[数]矩阵
矩阵是有序的 2D 数列,它有两个指数。第一个指向行,第二个指向列。例如,M23 指的是第二行第三列中的值,即上面黄色图形中的 8。一个矩阵可以有多个行数和列数。请注意,向量也是矩阵,但只有一行或一列。
黄色图形示例中的矩阵也是一个 2×3 维矩阵(行×列)。下面你可以看到矩阵及其符号的另一个例子:
张量
你可以把张量想象成一个排列在规则网格上的数字阵列,轴的数量是可变的。张量有三个索引,第一个指向行,第二个指向列,第三个指向轴。例如,T232 指向第二行、第三列和第二个轴。这是指下图中右侧张量的值 0:
张量是上述所有概念中最通用的术语,因为张量是一个多维数组,它可以是一个向量,也可以是一个矩阵,这取决于它所包含的索引数。例如,一阶张量是一个向量(1 个索引)。二阶张量是一个矩阵(2 个指数),三阶张量(3 个指数)和更高阶张量称为高阶张量(3 个或更多指数)。
计算规则
1.矩阵标量运算
如果你对一个矩阵进行乘、除、减或加标量,你对矩阵的每个元素都要这样做。下图完美地说明了乘法的这一点:
2.矩阵向量乘法
矩阵乘以向量可以被认为是矩阵的每一行乘以向量的列。输出将是一个与矩阵行数相同的向量。下图显示了这是如何工作的:
为了更好地理解这个概念,我们将通过计算第二个图像。为了得到结果向量的第一个值(16),我们取要与矩阵相乘的向量的数字(1 和 5),然后将它们与矩阵第一行的数字(1 和 3)相乘。这看起来像这样:
11 + 35 = 16
我们对矩阵第二行中的值做同样的处理:
41 + 05 = 4
再次对于矩阵的第三行:
21 + 15 = 7
这是另一个例子:
这是一种小抄:
3.矩阵-矩阵加法和减法
矩阵-矩阵的加法和减法相当简单明了。要求是矩阵具有相同的维数,并且结果是矩阵也具有相同的维数。您只需将第一个矩阵的每个值与其在第二个矩阵中的对应值相加或相减。见下文:
4.矩阵-矩阵乘法
如果你知道如何将一个矩阵乘以一个向量,那么将两个矩阵相乘也并不难。请注意,只有当第一个矩阵的列数与第二个矩阵的行数匹配时,才能将矩阵相乘。结果将是一个与第一个矩阵行数相同、与第二个矩阵列数相同的矩阵。它的工作原理如下:
您只需将第二个矩阵分解成列向量,并将第一个矩阵分别乘以这些向量。然后你把结果放入一个新的矩阵(而不把它们加起来!).下图一步步解释了这一点:
这又是一张小抄:
矩阵乘法性质
矩阵乘法有几个特性,允许我们将大量计算捆绑到一个矩阵乘法中。我们将在下面逐一讨论。我们首先用标量来解释这些概念,然后用矩阵来解释,因为这会让你更好地理解这个过程。
1.不可交换
标量乘法是可交换的,但矩阵乘法不是。这意味着当我们乘标量时,73 和 37 是一样的。但是当我们把矩阵相乘时,AB 和 BA 不一样。
2.联合的
标量乘法和矩阵乘法都是结合律。这意味着标量乘法 3(53)与(35)3 相同,矩阵乘法 A(BC)与(AB)C 相同。
3.分布的
标量乘法和矩阵乘法也是分布式的。这意味着
3(5 + 3)与 35 + 33 相同,A(B+C)与 AB + AC 相同
4.单位矩阵
单位矩阵是一种特殊的矩阵,但是首先,我们需要定义什么是单位矩阵。数字 1 是一个恒等式,因为你乘以 1 的所有东西都等于它本身。因此,每个矩阵乘以一个单位矩阵等于它自己。例如,矩阵 A 乘以它的单位矩阵等于 A。
你可以通过一个事实来识别一个单位矩阵,即它的对角线上有 1,而其他值都是 0。它也是一个“方阵”,这意味着它的行数与列数相匹配。
我们之前讨论过矩阵乘法是不可交换的,但有一个例外,即如果我们用一个单位矩阵乘以一个矩阵。因此,以下等式成立: AI = IA = A
反转和转置
矩阵求逆和矩阵转置是两种特殊的矩阵性质。同样,我们将从讨论这些性质如何与实数相关开始,然后讨论它们如何与矩阵相关。
1.相反的
首先,什么是逆?一个数乘以它的倒数等于 1。请注意,除了 0 以外,每个数字都有一个倒数。如果你把一个矩阵乘以它的逆矩阵,结果就是它的单位矩阵。下面的例子展示了标量的反函数是什么样子的:
但不是每个矩阵都有逆矩阵。如果一个矩阵是“方阵”并且有逆矩阵,你可以计算它的逆矩阵。不幸的是,讨论哪些矩阵有逆矩阵超出了这篇文章的范围。
为什么我们需要一个逆?因为我们不能分解矩阵。没有除以矩阵的概念,但是我们可以用逆矩阵乘以一个矩阵,结果本质上是一样的。
下图显示了一个矩阵乘以它的逆矩阵,从而得到一个 2 乘 2 的单位矩阵。
使用 Numpy 可以很容易地计算矩阵的逆矩阵(如果有的话)。以下是文档的链接:https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . Lina LG . inv . html。
2.移项
最后,我们将讨论矩阵转置的性质。这基本上是一个矩阵的镜像,沿着 45 度轴。得到矩阵的转置是相当简单的。它的第一列是矩阵转置的第一行,第二列是矩阵转置的第二行。将 mn 矩阵转换成 nm 矩阵。同样,A 的 Aij 元素等于 Aji(转置)元素。下图说明了:
摘要
在本文中,您了解了机器学习中使用的线性代数的数学对象。你学会了如何乘、除、加、减这些数学对象。此外,你已经了解了矩阵的最重要的性质,以及为什么它们使我们能够进行更有效的计算。除此之外,你已经学习了什么是逆矩阵和转置矩阵,以及你可以用它们做什么。虽然机器学习中也使用线性代数的其他部分,但这篇文章为您提供了最重要概念的适当介绍。
资源
深度学习(书)——伊恩·古德菲勒、约书亚·本吉奥、亚伦·库维尔
https://machine learning mastery . com/linear-algebra-machine-learning/
https://en.wikipedia.org/wiki/Linear_algebra
https://www . mathsisfun . com/algebra/scalar-vector-matrix . html
https://www . quant start . com/articles/scalar-vectors-matrix-and-tensors-用于深度学习的线性代数-第一部分
https://www . aplustopper . com/understanding-scalar-vector-quantities/
向量是机器学习中最重要的概念之一,因为许多错误都是由于拥有矩阵/向量…
machinelearning-blog.com](https://machinelearning-blog.com/2017/11/04/calculus-derivatives/)
【https://machinelearning-blog.com】这个帖子最初发表在我的博客上(【T10”)。
R:预测电影受欢迎程度中的线性和贝叶斯建模
该选哪部电影?
让我们想象一个雨天。你透过窗户向外望去,一切都是灰色的,冰冷的。你抓起你的毯子,坐在你最喜欢的沙发上;这里非常舒适,你刚刚决定这是看电影的完美一天。你想看一部好电影,或者至少是受欢迎的电影。你有几个选择,但其中一些甚至没有在典型的电影网站评级!能够预测人们对这些电影的看法不是很好吗?好吧,也许有解决的办法。根据一些特征来预测一部电影的人气怎么样?我们只需要一个包含电影、一些统计工具和 R studio 的数据集。
在我们的数据集中,有 651 部 随机抽样的 电影在 1970 年至 2016 年期间在美国电影院上映。数据从烂番茄和 IMDB 获得。该数据集包含每部电影的 32 个特征,包括流派、美国电影协会评分、制作工作室以及它们是否获得奥斯卡提名等特征。所以现在,我们可以问自己:
一部电影的受欢迎程度可以通过考虑它的某些特征来预测吗,比如类型、流派、美国电影协会评分、IMDb 票数以及它是否获奖?
在继续开发任何模型之前,我们需要回答两个问题:我们的结果可以推广吗? 当前数据集可以做哪种类型的推断?。对于第一个问题,我们可以注意到,该数据集中包含的电影是从上述两个来源中随机采样的,并且采样方法没有产生任何偏差,因此,我们可以假设所获得的结果可以推广到 1970 年到 2016 年* 之间上映的所有美国电影。另一方面,这是一项观察性研究,因此从该数据中可以发现的关系表明 关联 ,而不是因果关系。*
准备好开始了吗?等一下。我们所理解的一部电影的“流行”是什么?我们的数据集包括来自两个不同来源的电影样本,我们有两个变量可以潜在地用作流行度* : audience_score
(烂番茄上的观众评分)和imdb_rating
(IMDB 上的评级)。让我们继续分析这两个变量。首先,我们将检查这些变量之间是否存在相关性。为此,我们将在散点图中绘制两个变量:*
我们可以看到,该图显示了两个变量之间可能的正相关关系。我们将通过使用函数cor
对相关性进行数值计算来确认这一点:
正如我们所观察到的,这两个变量之间有很高的相关性。如果我们要将其中一个变量作为响应,最好不要将另一个变量作为自变量。所以我们需要决定选择哪一个作为响应变量。我们可以利用histogram
和汇总统计来分析它们的分布,做出明智的选择。让我们从imbd_rating
开始:
**
然后,我们可以对audience_score
做同样的事情:
**
我们可以看到,变量imbd_rating
显示了一个接近正态的分布,其平均值为 6.493,中位数为 6.00。另一方面,变量audience_score
显示出更均匀的分布,平均值为 62.36,中位数为 65.00。因为它的分布,我们将选择只考虑imdb_rating
。
在决定将哪个变量作为我们的响应变量后,我们需要探索我们的解释变量*。我们可以分析我们感兴趣的变量的分布,包括在我们的模型中,通过绘制每个变量的直方图,并获得总结描述表。对于那些分类的变量,我们可以使用内置函数table
创建一个比例表。另一方面,我们可以为连续变量创建一个数据框,并应用函数summary
。我不会在这里展示整个代码,但是例如,在我们的数据集中,分析显示投票数的分布是右偏的。为了对此进行调整,我们可以对这些值进行对数转换(log_votes
)。*
之后,我们可以分析我们的探索变量和响应变量之间的相互作用。对于这项任务,我们可以根据探索变量是数值型还是分类型来绘制箱线图或散点图。我将只展示重要的发现。
从获得的情节和概要描述中,可以看出,在我们的数据集中,那些获得过奥斯卡奖的电影或导演获得过奥斯卡奖的电影似乎具有稍高的评级。此外,给出的投票数显示了与 IMDB 评级的微弱正相关。最后,变量best_actor_win
和best_actress_win
看起来具有相同的分布,并且与imdb_rating
有相似的关联,所以我们将把这两个变量合并成一个新的变量main_oscar_win
。
现在,我们对我们的反应变量有了一个很好的想法,也暗示了哪些变量对预测一部电影的受欢迎程度可能很重要。是时候开始建模了!。我们将采取两种方法:首先,我们将做一个多元线性回归,然后,我们将开发一个贝叶斯模型。
多元线性回归模型
多元线性回归试图通过对数据拟合线性方程来模拟两个或多个独立变量或解释变量与响应变量之间的关系。
我们的目标是达成一个简洁的模型,这就是更简单的模型,具有巨大的解释预测能力。为了做到这一点,我们有两个模型选择选项:向前选择和向后排除。在第一种情况下,我们从一个空模型开始,一次添加一个预测器。我们将选择第二个选项:向后排除意味着从包含所有候选的模型开始,并且一次丢弃一个预测器,直到达到最节省的模型。在我们的例子中,我们的第一个完整模型将包括我们之前发现的对预测电影受欢迎程度可能很重要的六个变量:genre
、best_pic_win
、best_dir_win
、main_oscar_win
、log_votes
和mpaa_rating
。在 R 中,我们可以使用函数lm
建立一个线性模型:
现在我们有了完整的模型,我们可以使用几个标准来删除变量:p 值和调整后的 R。我们将选择 p 值作为排除标准,因为在这种情况下,我们的目标是创建一个仅使用具有显著性的变量来显示最高预测值的模型。
在运行包含所有相关变量的完整模型后,我们获得了 0.3582 的调整后 R,这意味着我们仍然可以改进模型。为了做到这一点,我们可以从每次移除具有最高 p 值的变量开始,直到模型中剩余的所有变量都是显著的。所以我们模型中 p 值最高的变量是main_oscar_win
。
再次运行我们的简单模型后,我们可以看到现在我们调整后的 R 是 0.3594。我们可以通过再次消除具有最高 p 值的变量来进一步改进我们的模型。这种情况下会是best_pic_win
。
我们现在看到,调整后的 R 是 0.3595,与我们之前在步骤 1 中的模型没有不同,但不同的是,这次涉及的所有变量都是显著的。出于实际考虑,我不会在这里展示它,但移除任何其他变量都会降低调整后的 R。因此,我们认为这是我们的最终模型。
*对于线性回归,有一个非常重要的概念需要记住:**共线性。*当两个变量高度相关时,它们被认为是共线的。包含共线预测值使模型估计变得复杂。
因此,在这一点上,我们可以看看我们的变量,看看我们感兴趣的变量是否显示某种程度的共线性。在我们的数据集中,我们有混合变量,这是因为我们有一些分类变量和一些连续变量,所以在这种情况下,测量共线性的一种方法是使用 方差膨胀因子 (VIF) 。 用于量化普通线性回归中多重共线性程度的 VIF,计算为包含多个项的模型的方差与仅包含一个项的模型的方差之比。简而言之,它告诉我们由于模型中存在共线性,回归系数的方差增加了多少。所以,让我们来计算一下:
我们的预测值都没有很高的 VIF,所以我们可以假设多重共线性在我们的模型中不起作用。
现在,是时候在我们模型中运行一些诊断了。多元回归模型取决于以下四个假设:
- 每个数字解释变量与响应变量线性相关
- 残差接近正态分布,平均值为 0
- 残差的可变性几乎是恒定的
- 残差是独立的
我们将在我们的模型环境中逐一测试这些假设:
- 我们模型中唯一的数字变量是
log_values
。因此,我们可以通过检查残差图来探索第一个假设。
该图显示残差在 0 附近随机分散,这表明数值探索变量和响应变量之间存在线性关系。
2.为了检查这种情况,我们将首先执行残差直方图,然后执行残差 Q-Q 图。
正如我们在上面看到的,分布直方图和残差 Q-Q 图显示接近正态分布,也模拟了在原始imdb rating
变量中观察到的左侧偏斜。
3.现在,我们需要检查残差对于预测响应变量的低值和高值是否同样可变。然后,我们将检查残差与预测值的关系图。
残差随机分散在宽度为 0 左右的恒定带中。
4.最后,我们将检查残差的独立性:
上面的图没有显示任何特定的模式,所以可以假设残差是独立的,因此观察值也是独立的。
贝叶斯模型
通常,我们被教导用传统的频率统计来解决问题。然而,还有另一种方法,它有时因主观而被削弱,但它更直观或更接近我们在日常生活中思考概率的方式,但却是一种非常强大的工具:贝叶斯统计。这个理论所依赖的一些关键概念有:条件概率和贝叶斯定理。**
条件概率是在一个事件发生的情况下,另一个事件发生的概率。如果已知或假设事件 B 已经发生,那么我们感兴趣的事件 A 给定 B 的条件概率就写成 P (A|B)。
当两个事件是独立的,意味着 A 的发生不影响 B 的发生时,A 和 B 的合取概率*(换句话说,两个事件都为真的概率)写成 P ( A 和 B )= P(A) P(B)。但如果 A 条件 B 发生则不是这样,这里的合取概率是p(AB)=p(A)p(B|A)。*
这里,经过一些数学计算后,可以推导出贝叶斯定理*,并表示如下:*
p(A|B)=p(A)p(B|A/p(B)
换句话说:给定的 B 发生的概率等于 A 发生的无条件概率乘以 A 发生时 B 发生的概率,再除以 B 的无条件概率。
这个定理有一个强大的解释,叫做历时解释,意思是随着时间的推移,一些事情正在发生,它提供了一个工具来更新假设提供新数据的概率。在这种解释中,我们方程中的术语隐含着一些其他的概念:
- p ( A )是我们看到数据之前假设的概率,叫做先验概率,或者就叫先验*。*
- p (A|B)是我们的目标,这是我们看到数据后假设的概率,称为后验*。*
- p ( B |A)是假设下数据的概率,称为似然*。*
- p ( B )是数据在任何假设下的概率,称为归一化常数*。*
当我们想要在贝叶斯方法下建立一个模型时,有一个元素是关键的:贝叶斯因子。贝叶斯因子是两个竞争假设(通常是无效假设和替代假设)的似然概率之比,它帮助我们量化一个模型对另一个模型的支持。在贝叶斯建模中,先验分布的选择是分析的关键组成部分,可以修改我们的结果;然而,当我们添加更多的数据时,先验开始变弱。当分析师没有太多先验信息时,非信息先验是方便的。
在 R 中,我们可以使用BAS
包进行贝叶斯回归。我们将使用贝叶斯模型平均( BMA ),它提供了一种解释模型不确定性的机制,并且我们需要指出函数的一些参数:
先验:策尔纳-西奥·柯西(使用针对多变量情况扩展的柯西分布
模型先验:统一(为所有模型分配相等的概率)
方法:马尔可夫链蒙特卡罗 ( MCMC )(提高模型搜索效率)
我们现在将打印为该模型获得的边际包含概率:
之后,我们可以使用函数summary
来查看变量包含的零一指标的前 5 个模型。
它还显示了一个列,该列具有最高概率模型的每个模型的贝叶斯因子( BF )、模型的后验概率(postpross)、模型的其余部分、模型的维度( dim )以及在所选先验分布下的对数边际可能性( logmarg )。
最后,我们可以利用函数image
来可视化对数后验概率和模型等级。
在上图中,每一行对应于完整模型中包含的每个变量,还有一行用于截距。在每一列中,我们可以看到所有可能的模型(2 个⁶,因为我们有 16 个变量)按后验概率排序,从最好到最差排列在顶部(从左到右)。
*从上面的模型和图片可以看出:
feature_film
边际概率为 0.999, 并且出现在所有五个顶级模型中的
critics_score
边际概率为 0.999 并且也出现在所有五个顶级模型中的
runtime
边际概率为 0.98 并且出现在所有五个顶级模型中的
drama
边际概率为 0.57 并且出现在五个顶级模型中的三个
imbd_num_votes
边际概率为 0.99 并且出现在五个顶级模型中的三个
截距 也有边际概率为 1,出现在所有五大顶级型号
据此,最佳型号包括截距、feature_film
、critics_score
、drama
、imbd_num_votes
和runtime
*
我们现在可以获得 BMA 下的系数估计和标准差,以便能够检查重要变量系数的边际分布。为此,我们将使用函数coef
并使用plot
绘制它们
垂直线对应于系数等于 0 的后验概率。另一方面,成形曲线显示了系数非零的可能值的密度。值得一提的是,线的高度与其概率成比例。这意味着截距和feature_film
、critics_score
、imbd_num_votes
和runtime
没有表示非零概率的线。
最后,我们可以使用confint
方法获得系数的 95%可信区间(真实均值包含在给定区间内的概率为 0.95)。
BAS
包为我们提供了一种简单的方法,只需使用函数plot
和which
选项就可以获得模型的图形摘要。
- 残差与拟合图
理想情况下,我们不会看到异常值或非常数方差。然而,在这种情况下,我们可以看到预测值有一个常数,但有两个异常值。
2.模型概率
此图按采样顺序显示模型的累积概率。该图显示,累积概率在 300 次模型试验后开始变得平稳,因为每个额外的模型仅增加了累积概率的一个小增量。模型搜索在大约 1400 处停止,而不是 2 个⁵组合的枚举。
3.模型复杂性
该图显示了每个模型的维度,即回归系数的数量,包括截距与模型边际可能性的对数。在这种情况下,我们可以看到从 5 到 12 维可以达到最高的对数边际。
4.边际包含概率
在这种情况下,我们可以观察每个协变量的边际后验包含概率,大于 0.5 的边际后验包含概率显示为红色(解释数据和预测的重要变量)。在图表中,我们可以看到之前已经显示的关于哪些变量对最终得分有影响。
预测
现在是时候测试一下 我们两款的预测能力了!我们会用 2016 年上映的电影“ Zootropolis ”。相应信息从 IMDB 网站和 RottenTomatoes 获得,与分析数据一致。
**
正如我们在上面看到的,真实的imdb_rating
是 8,这与我们的贝叶斯模型预测的非常接近。
那么我们能得出什么结论呢?从线性回归和贝叶斯模型中,我们了解到,实际上可以通过考虑每部电影的特征数据来预测电影的受欢迎程度。
在线性回归分析中,可以建立一个简洁的、多变量的线性模型,该模型能够在一定程度上预测电影的受欢迎程度,即 IMDb 评分,并选择四个具有统计意义的预测值。然而,重要的是要记住,我们最终模型的调整后 R 仅为 0.3595,因此这意味着 35.95%的可变性由模型解释。在贝叶斯模型中,我们最终得到了一个同样满足贝叶斯假设的简约模型。从这两个模型中,我们可以看出贝叶斯模型的预测更接近真实的 IMDb 评级。
参考文献:
2016 年总统选举数据与各种任意选择的数据的线性相关性
出于好奇(和无聊),我收集了总统选举投票的数据,并将它们与各种类型的死亡率、性传播疾病、免疫率、犯罪活动和教育分数相关联。
请记住,这些图表和摘要代表了一种相当简单的统计分析,单个自变量的线性回归通常不足以解释因变量。但是,现在是凌晨 3 点,我喝了太多咖啡,无法入睡——不管怎样,让我们找点乐子吧!数据在状态级别上进行分析(N_max = 50)。
除非另有说明,所有示例都适用于具有单个独立变量的简单线性模型(直接参见下文)。具有缺失数据的实例已从分析中排除。
Figure 1.: A mathematical representation of a simple linear model with a single independent variable.
恶性肿瘤死亡率(每 10 万人)与投票给特朗普的人数(%):
Figure 2.: A scatterplot relating age adjusted mortality rate due to malignant neoplasms (i.e. cancer, in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.21
p_F = 0.0004824 ***
p_t[𝝱0] = 0.856997
p_t[𝝱1] = 0.000482 ***
有趣的是,将癌症导致的死亡率数据与特朗普的选票联系起来,会产生一种相对较弱(见 R _adj)但似乎很重要(见 p_F)的关系。这个特定模型中的异常值似乎是 NC、UT 和 WI。这种关系不适用于克林顿选民。
心脏病死亡率(每 10 万人)与投票给特朗普的人数(%)
Figure 3.: A scatterplot relating age adjusted mortality rate due to heart disease (in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.2553
p_F = 0.0001084 ***
p_t[𝝱0] = 0.020797 *
p_t[𝝱1] = 0.000108 ***
这个模型显示了相关的迹象。虽然相关性很弱,但也相当重要。该模型中的异常值也出现在 NC、UT 和 WI 中。
机动车事故死亡率(每 10 万人)与投票给特朗普的人数(%)
Figure 4.: A scatterplot relating age adjusted mortality rate due to motor-vehicle accidents (in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.4948
p_F = 7.376 * 10^(-9) ***
p_t[𝝱0] = 2.79 * 10^(-12) ***
p_t[𝝱1] = 7.38 * 10^(-9) ***
这是一个意想不到的结果。有机动车事故问题的州似乎在 2016 年支持特朗普。这一次,相关性实际上处于中等范围。事实上,当用克林顿选票替代特朗普选票时,可以观察到类似的密切关系(但方向相反)。
Figure 5.: A scatterplot relating age adjusted mortality rate due to motor-vehicle accidents (in incidents per 100,000) to percentage of people voting for Clinton in each state.
R²_adj = 0.3971
p_F = 5.648 * 10^(-7) ***
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 5.65 * 10^(-7) ***
进一步考察特朗普选民的模型,Breusch-Pagan ( p = 0.1193
)和 Score test ( p = 0.1449
)表明数据中不存在异方差。夏皮罗-维尔克(p = 0.6651
)、科尔莫戈罗夫-斯米尔诺夫(p = 0.8544
)和安德森-达林(p = 0.4715
)正态性检验都表明数据来自正态分布。德宾-沃森检验(p = 0.89
)表明误差不相关。
因此,我们或许可以有把握地预测某个州在 2016 年总统选举中的投票情况,只需使用机动车事故死亡率。或者,我们可以利用各州的投票记录来预测它们的机动车事故死亡率。
自杀死亡率(每 10 万人)与投票给特朗普的人数(%)
Figure 6.: A scatterplot relating age adjusted mortality rate due to suicide (in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.24
p_F = 0.0001811 ***
p_t[𝝱0] = 2.26 * 10^(-8) ***
p_t[𝝱1] = 0.000181 ***
该模型还显示出显著相关性的迹象,尽管在支持特朗普的州和自杀死亡率之间存在微弱的相关性。相反,支持克林顿的州显示出较低的死亡率——甚至更合适。
Figure 7.: A scatterplot relating age adjusted mortality rate due to suicide (in incidents per 100,000) to percentage of people voting for Clinton in each state.
R²_adj = 0.4636
p_F = 3.196 * 10^(-8) ***
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 3.2 * 10^(-8) ***
对 Trump 投票模型运行诊断会产生以下结果:
Breusch-Pagan p = 0.1763463 | No heteroskedasticity!
Score test p = 0.08569949 | No heteroskedasticity!
Shapiro-Wilk p = 0.2942 | Normal distribution!
Kolmogorov-Smirnov p = 0.8451 | Normal distribution!
Anderson-Darling p = 0.3797 | Normal distribution!
Durbin-Watson p = 0.704 | Uncorrelated errors!
凶杀死亡率(每 10 万人)与投票给特朗普的人数(%)
Figure 8.: A scatterplot relating age adjusted mortality rate due to homicide (in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.1366
p_F = 0.007208 **
p_t[𝝱0] = 2.61 * 10^(-16) ***
p_t[𝝱1] = 0.00721 **
这个模型显示,杀人道德率和特朗普支持度之间的相关性很弱。然而,参数估计似乎产生了一个非常好的 t 检验统计量。可能有影响的异常值是 HI、LA 和 TX。
药物中毒死亡率(每 10 万人)与投票给特朗普的人数(%)
Figure 9.: A scatterplot relating age adjusted mortality rate due to drug poisoning (in incidents per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.0179
p_F = 0.7115
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 0.711
在 2016 年选举中支持特朗普的州与药物中毒死亡率之间既没有显著也没有明显的相关性。
关于死亡率的结论
与支持克林顿的州相比,2016 年支持特朗普的州似乎因各种原因而倾向于遭受高死亡率。最突出的例子是与机动车辆和自杀有关的死亡。这一明显规律的一个显著例外是药物中毒死亡率——这是两个变量之间没有显著或明显相关性的唯一例子。
婴儿死亡率(每 1,000 名活产婴儿)与投票给特朗普的人数(%)
Figure 10.: A scatterplot relating rate of infant deaths (per 1,000 live births) to percentage of people voting for Trump in each state.
R²_adj = 0.256
p_F = 0.0001239 ***
p_t[𝝱0] = 0.000297 ***
p_t[𝝱1] = 0.000124 ***
当谈到特朗普的支持率和婴儿死亡率时,似乎支持特朗普的州的婴儿死亡率也略高。尽管这种关系很重要,但相对较弱,两个变量之间只有轻微的相关性。
非西班牙裔黑人婴儿死亡率(每 1,000 名活产婴儿)与投票给特朗普的人的比率(%)
Figure 11.: A scatterplot relating rate of non-hispanic black infant deaths (per 1,000 live births) to percentage of people voting for Trump in each state.
R²_adj = 0.3689
p_F = 6.537 * 10^(-5) ***
p_t[𝝱0] = 0.0225 *
p_t[𝝱1] = 6.54 * 10^(-5) ***
当我们只研究非西班牙裔黑人婴儿死亡的例子时,相关性更高,模型总体上更适合。如预期的那样,在这个模型上运行诊断程序会产生相当不错的结果。
Breusch-Pagan p = 0.4146038 | No heteroskedasticity!
Score test p = 0.2699911 | No heteroskedasticity!
Shapiro-Wilk p = 0.3525 | Normal distribution!
Kolmogorov-Smirnov p = 0.8966 | Normal distribution!
Anderson-Darling p = 0.5787 | Normal distribution!
Durbin-Watson p = 0.44 | Uncorrelated errors!
不出所料,支持克林顿的州的趋势正好相反:
Figure 12.: A scatterplot relating rate of non-hispanic black infant deaths (per 1,000 live births) to percentage of people voting for Clinton in each state.
R²_adj = 0.3361
p_F = 0.0001565 ***
p_t[𝝱0] = 2.85 * 10^(-12) ***
p_t[𝝱1] = 0.000156 ***Breusch-Pagan p = 0.5336099 | No heteroskedasticity!
Score test p = 0.3860135 | No heteroskedasticity!
Shapiro-Wilk p = 0.2888 | Normal distribution!
Kolmogorov-Smirnov p = 0.4213 | Normal distribution!
Anderson-Darling p = 0.2453 | Normal distribution!
Durbin-Watson p = 0.514 | Uncorrelated errors!
西班牙裔婴儿死亡率(每 1,000 名活产婴儿)与投票给特朗普的人的比率(%)
Figure 13.: A scatterplot relating rate of hispanic infant deaths (per 1,000 live births) to percentage of people voting for Trump in each state.
R²_adj = 0.09937
p_F = 0.03432 *
p_t[𝝱0] = 1.74 * 10^(-5) ***
p_t[𝝱1] = 0.0343 *
在 2016 年大选中支持特朗普的州与拉美裔婴儿死亡率之间存在疏忽的关系。
关于婴儿死亡率的结论
根据死亡率数据,婴儿死亡率也趋向于更高的特朗普支持率。在非西班牙裔黑人婴儿死亡率方面尤其如此,这种关系非常明显,模型拟合得非常好。
衣原体感染率(每 10 万人)与投票给特朗普的人数(%)
Figure 14.: A scatterplot relating rates of Chlamydia (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.01594
p_F = 0.6329
p_t[𝝱0] = 1.7 * 10^(-8) ***
p_t[𝝱1] = 0.633
特朗普的支持度和衣原体感染率之间似乎没有明显或显著的关系。
淋病率(每 10 万人)与投票给特朗普的人(%)
Figure 15.: A scatterplot relating rates of Gonorrhea (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.02107
p_F = 0.1582
p_t[𝝱0] = 1.13 * 10^(-15) ***
p_t[𝝱1] = 0.158
特朗普的支持率和淋病发病率之间似乎也没有明显或显著的关系。
梅毒发病率(每 10 万人)与投票给特朗普的人(%)
Figure 16.: A scatterplot relating rates of Syphilis (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.04053
p_F = 0.08614
p_t[𝝱0] < 2 *10^(-16) ***
p_t[𝝱1] = 0.0861
特朗普的支持率和梅毒发病率之间似乎也没有明显或显著的关系。
关于性传播疾病的结论
性传播疾病和特朗普的支持率之间似乎没有明显的联系。
19-35 个月儿童的估计 MMR 疫苗接种覆盖率(%)与投票给特朗普的人(%)
Figure 17.: A scatterplot relating estimated MMR vaccination coverage among children aged 19–35 months (%) to percentage of people voting for Trump in each state.
R²_adj = 0.07459
p_F = 0.03083 *
p_t[𝝱0] = 0.00221 **
p_t[𝝱1] = 0.03083 *
在不太理想的拟合模型上存在非常小的相关性,表明特朗普支持度和 MMR 疫苗接种覆盖率之间存在潜在的负相关性。
19-35 个月儿童的 DTaP 疫苗接种覆盖率(%)与投票给特朗普的人群(%)
Figure 18.: A scatterplot relating estimated DTaP vaccination coverage among children aged 19–35 months (%) to percentage of people voting for Trump in each state.
R²_adj = 0.2246
p_F = 0.0003003 ***
p_t[𝝱0] = 1.33 * 10^(-6) ***
p_t[𝝱1] = 3 * 10^(-4) ***
有适度的证据表明,各州在 2016 年总统大选中支持特朗普,并降低了 DTaP 免疫的覆盖率。模型诊断似乎没有发出任何危险信号。
Breusch-Pagan p = 0.6658235 | No heteroskedasticity!
Score test p = 0.6299109 | No heteroskedasticity!
Shapiro-Wilk p = 0.7211 | Normal distribution!
Kolmogorov-Smirnov p = 0.7435 | Normal distribution!
Anderson-Darling p = 0.6068 | Normal distribution!
Durbin-Watson p = 0.296 | Uncorrelated errors!
19-35 个月儿童中 HepB 疫苗接种覆盖率(%)与投票给川普的人群(%)
Figure 19.: A scatterplot relating estimated HepB vaccination coverage among children aged 19–35 months (%) to percentage of people voting for Trump in each state.
R²_adj = 0.05479
p_F = 0.05585
p_t[𝝱0] = 0.1628
p_t[𝝱1] = 0.0558
没有明显或显著的证据表明 HepB 疫苗接种覆盖率与 2016 年总统选举中对特朗普的支持之间存在关系。
19-35 个月儿童 HepA 疫苗接种覆盖率(%)与投票给特朗普的人群(%)
Figure 20.: A scatterplot relating estimated HepA vaccination coverage among children aged 19–35 months (%) to percentage of people voting for Trump in each state.
R²_adj = 0.01044
p_F = 0.4857
p_t[𝝱0] = 4.1 * 10^(-5) ***
p_t[𝝱1] = 0.486
就像 HepB 的情况一样,HepA 数据也缺乏与 2016 年总统选举数据的关系。
19-35 个月儿童轮状病毒疫苗接种覆盖率(%)与投票给特朗普的人群(%)
Figure 21.: A scatterplot relating estimated Rotavirus vaccination coverage among children aged 19–35 months (%) to percentage of people voting for Trump in each state.
R²_adj = 0.08274
p_F = 0.02417 *
p_t[𝝱0] = 2.22* 10^(-5) ***
p_t[𝝱1] = 0.0242 *
虽然这是一个可以接受的拟合,但这两个变量之间的相关性太小,无法做出任何推断。
关于疫苗接种的结论
除了 DTaP 疫苗接种覆盖率之外,所有疫苗接种覆盖率都没有随着特朗普的支持数据而变化。另一方面,DTaP 疫苗接种覆盖率似乎与特朗普支持率成反比。
暴力犯罪率(每 10 万人)与投票给特朗普的人的比率(%)
Figure 22.: A scatterplot relating rate of violent crime(per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.009291
p_F = 0.4624
p_t[𝝱0] = 5.1 * 10^(-13) ***
p_t[𝝱1] = 0.462
这两个变量之间没有明显的联系。
谋杀和非过失杀人的比率(每 10 万人)与投票给特朗普的人的比率(%)
Figure 23.: A scatterplot relating rate of murder and non-negligent manslaughter (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.04231
p_F = 0.08158
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 0.0816
这两个变量之间没有明显的联系。
强奸率(每 10 万人)与投票给特朗普的人(%)
Figure 24.: A scatterplot relating rate of rape (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.05454
p_F = 0.05627
p_t[𝝱0] = 8.62* 10^(-13) ***
p_t[𝝱1] = 0.0563
这两个变量之间没有明显的联系。
抢劫率(每 10 万人)与投票给特朗普的人(%)
Figure 25.: A scatterplot relating rate of robbery (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.07853
p_F = 0.02741 *
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 0.0274 *
尽管模型拟合良好,但这两个变量之间没有明显的联系。
严重袭击率(每 10 万人)与投票给特朗普的人(%)
Figure 26.: A scatterplot relating rate of property crime (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.05783
p_F = 0.05096
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 0.051
这两个变量之间没有明显的联系。
财产犯罪率(每 10 万人)与投票给特朗普的人的比率(%)
Figure 27.: A scatterplot relating rate of property crime (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.008801
p_F = 0.2368
p_t[𝝱0] = 2.45 * 10^(-9) ***
p_t[𝝱1] = 0.237
这两个变量之间没有明显的联系。
入室盗窃率(每 10 万人)与投票给特朗普的人(%)
Figure 28.: A scatterplot relating rate of burglary (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.08126
p_F = 0.02526 *
p_t[𝝱0] = 1.1 * 10^(-13) ***
p_t[𝝱1] = 0.0253 *
尽管模型拟合良好,但这两个变量之间的相关性太低,无法对它们之间的关系做出结论。
盗窃率(每 10 万人)与投票给特朗普的人的比率(%)
Figure 29.: A scatterplot relating rate of larceny-theft (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.0008896
p_F = 0.3121
p_t[𝝱0] = 3.96 * 10^(-8) ***
p_t[𝝱1] = 0.312
这两个变量之间没有明显的联系。
机动车辆盗窃率(每 10 万人)与投票给特朗普的人的比率(%)
Figure 30.: A scatterplot relating rate of motor-vehicle theft (per 100,000) to percentage of people voting for Trump in each state.
R²_adj = 0.01918
p_F = 0.7815
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 0.781
这两个变量之间没有明显的联系。
关于暴力和财产犯罪的结论
暴力和财产犯罪与 2016 年总统选举中对特朗普的支持之间似乎没有关系。
WalletHub 教育程度和教育质量得分(1-100)与投票给特朗普的人(%)
Figure 31.: A scatterplot relating WalletHub Educational Attainment and Quality of Education Score (1–100) to percentage of people voting for Trump in each state.
R²_adj = 0.4414
p_F = 8.66 * 10^(-8) ***
p_t[𝝱0] < 2 * 10^(-16) ***
p_t[𝝱1] = 8.66 * 10^(-8) ***
有相对证据表明,各州在 2016 年总统大选中支持特朗普,并降低了教育程度和教育质量。模型诊断似乎没有发出任何危险信号。
Breusch-Pagan p = 0.7193591 | No heteroskedasticity!
Score test p = 0.7333875 | No heteroskedasticity!
Shapiro-Wilk p = 0.6670 | Normal distribution!
Kolmogorov-Smirnov p = 0.9474 | Normal distribution!
Anderson-Darling p = 0.5443 | Normal distribution!
Durbin-Watson p = 0.812 | Uncorrelated errors!
根据这些结果,对特朗普的热情似乎与教育程度和教育质量成反比。
最终总结
- 特朗普的热情与教育程度和教育质量呈负相关。
- 特朗普热情与 DTaP 疫苗接种覆盖率负相关。
- 特朗普的热情与非西班牙裔黑人婴儿和整体婴儿死亡率正相关。
- 特朗普的热情与恶性肿瘤、心脏病、机动车事故、自杀和凶杀死亡率呈正相关。
- 克林顿的热情与自杀死亡率呈负相关。
- 特朗普的热情与性传播疾病之间,或者特朗普的热情与暴力和财产犯罪之间,不存在明显的联系。
来源:
- 联邦选举委员会(2017 年)。2016 年联邦选举:美国总统、美国参议院和美国众议院的选举结果。
- 徐,J.Q .,墨菲,S.L .,科查内克,K.D .,巴斯蒂安,b .,阿里亚斯,E. (2018)。死亡人数:2016 年最终数据。国家生命统计报告,67(5)。国家健康统计中心。
- 疾病控制和预防中心(2017 年)。2016 年性传播疾病监测。亚特兰大:美国卫生与公众服务部。
- 罗森,L.M .,巴斯蒂安,b .,华纳,m .,可汗,d .,崇,Y. (2017)。药物中毒死亡率:美国,1999-2016 年。国家健康统计中心。
- Hill,H. A .,Elam-Evans,L. D .,Yankey,d .,Singleton,J. A .,& Dietz,V. (2016)。19-35 个月儿童的疫苗接种覆盖率——美国,2015 年。MMWR。发病率和死亡率周报,65(39),1065–1071。
- 美国司法部联邦调查局。(2018).美国的犯罪,2017。
- 贝尔纳多河(2018)。2018 年美国受教育程度最高和最低的州。钱包枢纽。
.CSV and .description files available [here](http://www.franjoivankovic.com/2018/12/09/linear-correlations-of-2016-presidential-election-data-to-various-arbitrarily-chosen-data)!
线性回归—详细概述
有人问我 为什么我们使用线性回归?我回答了,对于的预测。他又问我什么是预测?** 我用一个情况回答“假设你和我走在一条路上。我们来到了十字路口,现在我告诉你,我们将直走。这种情况会发生五次。现在在第六个十字路口。我问你我们将走哪条路。你的回答会是,我们会直走。这你说的就叫预测。他问我下一个问题我们是怎么做到的?我解释说,每当我们处于十字路口时,我们会查看数据,或者在这种情况下,我以前的回答,并考虑我们假设我们将直走。****
什么是线性回归?这是一种对因变量和自变量之间的关系进行建模的方法。又一个问题什么是自变量和因变量?现在下图有一些关于房子的数据。我们有“房子的面积”和“房子的成本”。我们可以看到,成本取决于房子的面积,当面积增加时,成本也会增加,当面积减少时,成本也会减少。所以我们可以说成本是因变量而面积是自变量。在线性回归的帮助下,我们将对房屋成本和房屋面积之间的关系进行建模。****
Figure 1 : Example of House(Area vs Cost) Data set
模拟这种关系的最好方法是绘制一张成本和房子面积之间的图表。X 轴表示房屋的面积,Y 轴表示造价。回归会怎样?它将尝试通过这些点拟合直线。左图显示绘制的点,右图显示拟合这些点的线。
Figure 2 :Plotting Area of the house (X-axis) Vs Cost of house(Y-axis)
如果我们想借助上图预测房屋面积为 1100 平方英尺的房子的成本,可以按照下图所示进行,因为你可以看到 1100 平方英尺房子的成本大约是 35。
Figure 3 : Finding Cost of House when Area of house is 1100sq feet
在深入之前,我们应该理解一些术语,我将用它们来推导和解释数学解释。
Figure 4: Terms and Notations
- M :=训练样本
- x :=输入特征/变量。这些可以不止一个。
- y :=输出特征/变量。
- (x,y) :=训练示例。例:(1000,30)
这条线在数学上是如何表示的?
Figure 5: Hypothesis h(x)
h(x)在数学上表示线,因为现在我们只有一个输入特征,该方程将是线性方程,它也类似于线方程 "Y = mx + c "。现在我们来看看选择θ的值会对行产生什么影响。
Figure 6 : The value of theta will have effect the slope and intercept of the line. As you can in left and right images.
**为什么是线性的?**线性是基本的构建模块。我们将在后面讨论更复杂的问题,这些问题可能需要用到非线性函数或高次多项式
**如何最好地拟合我们的数据?**为了最好地拟合我们的数据,我们必须选择θ的值,使得 h(x)和 y 之间的差异最小。为了计算这个,我们将定义一个误差函数。正如你在下图中看到的。-
- 误差函数由 h(x) — y 之差定义。
- 我们将绝对误差作为误差的平方,因为有些点在线的上方和下方。
- 为了得到所有点的误差,我们使用了求和法。
- 平均,然后除以 2,以使计算更容易。它对总误差没有影响。
Figure 7 : Error Function Derivation(source : www.google.com/images))
现在来看一下θ和误差函数(J)之间的关系。我们将绘制θ和误差函数之间的图表。右下角的图像显示了 X 轴代表θ,Y 轴代表 J(θ)误差函数的图形。我们将假设θ0 为零。这意味着直线将始终通过原点。
Figure 8.1 : Plotting h(x) when theta_0 = 0 and theta_1 = 1
- 我们假设了一些点(1,1),(2,2),(3,3),并假设θ0 = 0,θ1 = 1。我们计算了误差,显然它将是零。
Figure 8.2 : Calculation Of Error for Figure 8.1
Figure 8.3 : Plotting h(x) when theta_0 = 0 and theta_1 = 0.5
- 然后,我们用值 0 和 0.5 重复相同的过程,我们得到的误差是 0.58,你也可以在图像中看到。这条线与给定点不太吻合。
Figure 8.4 : Calculation Of Error for Figure 8.3
Figure 8.5 : Graph between Error Function and Theta_1
- 现在,如果取更多的θ值,我们会得到一些类似手绘的图(右下角),因为我们可以最小化θ1 = 1
但不幸的是,我们不能总是让θ0 = 0,因为如果我们可以,一些数据点就像下图所示,我们可以采取一些截距,或者我们永远无法达到最佳拟合,而θ0 有一些值,我们将绘制一个 3D 图,如右图所示。它将永远是保龄球形的图形。
Figure 9 : 3D plot while considering both Theta(source : www.google.com/images))
3D 再现很难研究。所以我们不会研究它们。我们将在 2D 绘制它们也被称为等高线图
在下图中,你会看到假设的等高线图。这些日食在图像中代表了什么?
- 同一次月食中的任何一点都会给我们相同的误差函数值,因为左下图中用粉色表示的三个点会有相同的误差函数值。
- 红点描述了左侧图像的假设,您将得到θ0(intecept)= 800 和θ1(slope)=-0.5,而在右下图中,θ0(intecept)= 500 和θ1(slope)= 0。所以你可以画一条平行于 x 轴的线。
- 在左图中,红点远离椭圆的中心,线也不是很适合,但在右图中,读数更接近椭圆的中心,线也比左图更适合。因此,我们也可以得出结论,椭圆的中心将是θ的最小值或最佳值,这将最适合给定的数据点
Figure 10 : Contour Plots(source : www.google.com/images)
我们已经写了成本函数,但是如何最小化它呢?所以我们有解决问题的方法
- 梯度下降
- 正规方程
梯度下降
我们站在山顶,360 度环视四周。我们想朝着走下坡路的方向迈出一小步。在最佳方向的情况下,应该是最陡下降的方向。然后,我们到达一个点,我们遵循相同的步骤,直到我们到达地面的情况下,如下图。
Figure 11 : Gradient Descent (source : https://codesachin.wordpress.com/tag/gradient-descent/)
还有一件事。**你确定你会一直达到同样的最小值吗?**我可以保证你不确定。在梯度下降的情况下,你不能确定。让我们来看看山的问题。如果你从右边开始走几步,完全有可能到达完全不同的最小值,如下图所示
Figure 12 : Problem with Gradient Descent(source : https://codesachin.wordpress.com/tag/gradient-descent/)
我们将讨论梯度下降的数学互穿,但让我们理解如下一些术语和符号:
- 阿尔法是学习率,描述你迈出的步伐有多大。
- 导数给出了‘theta’切线的斜率,可以是正的也可以是负的,导数告诉我们将增加或减少‘theta’。
- 同时更新意味着应该同时更新两个θ。
推导将由下式给出
Figure 13 : Gradient Descent Derivation
正规方程
由于梯度下降是一个迭代过程,正规方程有助于一次找到最优解。他们使用矩阵乘法。图像中解释了公式和符号。下图将解释我们的例子中的 X 和 y。X 的第一列总是 1,因为它将乘以θ0,我们知道θ0 是我们与轴的截距。
Figure 14 : Normal Equation with Example
下图解释了法线方程的推导过程。他们使用矩阵符号和性质。
这张图片解释了
- θ矩阵
- x '矩阵
- 假设被扩展
- 使用这些矩阵,我们可以重写上一步给出的假设
Figure 15: Notations in Normal Equations
图 16 解释了以下内容
- 我们将在误差函数中替换我们的假设。
- 我们假设 z 矩阵如步骤 2 所示
- 误差函数可以重写为步骤 3。所以如果你把 Z 矩阵的转置和 Z 矩阵相乘。我们会得到第一步的等式
- 我们可以分解步骤 2 中的 z,如步骤 4 所示。
- 根据步骤 6 中给出的属性。我们将重写步骤 7 中给出的 z。大写 X 也被称为设计矩阵是小 X 的转置
Figure 16 : Normal Equation Derivation Part 1
- 在等式中代入 z
- 展开误差方程,然后对θ求导,使其等于 0。
- 我们会找到解决办法的。如下图所示
Figure 17: Normal Equation Derivation Part 2
梯度下降法与正规方程的比较
- 在梯度下降的情况下,我们需要选择α,θ的初始值,但是正规方程我们不需要选择α或θ。
- 梯度下降是一个迭代过程,而正规方程马上给你答案。
- 随着要素数量的增加,法线方程的计算速度会变慢,但梯度下降在要素数量非常大的情况下表现良好。
我们已经看到,线性回归是一种强大的算法,可用于建立关系模型并基于该关系预测值。我们还讨论了最小化误差的方法,以便我们可以获得我们的参数的最佳值。线性回归在分类问题上表现不佳。我们将在下一篇文章中讨论是什么算法克服了这个限制。继续读。
如果你想和我交流。请随时在 LinkedIn 上与我联系。
[## Sameer Negi —自动驾驶汽车培训生— Infosys | LinkedIn
查看 Sameer Negi 在全球最大的职业社区 LinkedIn 上的个人资料。Sameer 有 3 份工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/sameer-negi-356881115/)