TowardsDataScience 博客中文翻译 2016~2018(二百六十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

超级简单的机器学习—简单线性回归第 2 部分【数学和 Python】

原文:https://towardsdatascience.com/super-simple-machine-learning-simple-linear-regression-part-2-math-and-python-1137acb4c352?source=collection_archive---------3-----------------------

这是我正在撰写的一系列文章的一部分,涵盖了 ML 算法,以简单轻松的方式进行了解释,以便于理解。 我确实会掩饰更多的技术方面和术语,因为这里的目标是创造一些以最基本的方式推动理解概念的东西,而不是仅仅遵循步骤和盲目地抛出术语。然而,如果我的解释根本不正确,请告诉我。

第 1 部分 对于简单的线性回归可以在这里找到。

现在,您已经从第 1 部分中了解了简单线性回归的基本概念,让我们来看看本质。

在这篇文章中,我将深入一些 Python 编码及其背后的数学知识,并触及数据集的某些特征。

我们开始吧!

奇妙的参数/统计数据以及在哪里可以找到它们

***编辑!!!!!

我想先弄清楚一些术语。

一个朋友告诉我,我之前对参数的定义不正确。

参数是群体的特征(例如所有可能的结果)。很可能无法导出。

统计数据是样本的特征(例如我们可以记录的结果)。统计数据允许您估计参数:“推断统计数据允许您对总体参数进行有根据的猜测”

到目前为止,您应该已经熟悉的特征示例如下:

  • **平均值:**平均值
  • **中位数:**中间值
  • 方差:每个 x 与平均值 x 之间的平方差的平均值。它描述了数据的分布范围。如果方差很大,你的“低数值”很低,你的“高数值”很高,想象一个弹性带被拉得越来越远,方差相应地增加。方差越低,越“稳定”,因为它收敛于均值。
  • 标准差:方差的平方根。基本上找到 x 的分布有多宽,这与方差相同,但是单位的问题。如果你在看一个身高(厘米)的数据集,方差会给你平方厘米,但标准差是它的平方根,会给你一个厘米的答案,这有时更好计算,更适合你的强迫症。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

the two different standard deviation formulae

首先弄清楚方差和标准差,因为你会在统计建模中遇到 ALOT。这个解释挺好的……另外还有小狗!

超参数:

值得注意的是,机器学习中有称为超参数的参数,这些参数基本上是您必须决定使用的值,这些值无法从算法中“学习”,但会影响您的模型。

超参数优化/调优是一个完全不同的话题,关于你如何决定你的超参数应该是什么值。我将在下一次解释 K-最近邻分类时谈到这一点。或者你可以在这里阅读

非常感谢 Michael Chia Wei Aun 澄清了什么是参数!

好吧,那么…回归?

还记得在第 1 部分中,我说过如何绘制不同的线以找到误差平方最小的线,以及 R 和 Python 包如何能帮你解决这个问题吗?

好吧,让我们看看这些包在做什么。

请记住这一点:

y = ax + b

直线方程。

让我们看看寻找最佳拟合线背后的数学原理。

普通最小二乘法背后的等式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: ???

第一个方程是不是很眼熟?那是因为它和我在上面提到的方程完全一样——一条线的方程,只是写法不同

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,第二个和第三个方程是您需要找到 a 和 **b、**的方程,这基本上是我们在 R 和 python 包中尝试做的事情。

a 和 b 在线性回归中被称为“β”,并被视为学习参数,因为它们在运行线性回归算法后最终被“学习”。

你可以在这里找到上面的方程式及其背后的数学可以在这里找到**

那些公式/公式是怎么回事?

他们试图最小化误差平方和(实际值和预测值的平方差)。如果不确定,请参考第 1 部分您是否注意到了?!).

要做到这一点,a 和 b 的偏导数必须为 0。因为 0 是曲线最小时的拐点。是的是的衍生品。

导数不是我要解释的,但是你可以在这里快速修改一下。

x 和 Y 有比你妈妈更酷的头饰

你会注意到图 1 的第二个和第三个方程,x 和 y 的头上有有趣的东西。

x̄ = x 酒吧

̅y = y 酒吧

除了是一个总屁股打字,酒吧基本上意味着,意味着。所以 x̄指的是 x 的均值

所以(x- x̄)是 x 的值和所有不同 x 值的平均值之差。

这被称为偏差分数,意思是偏离值有多远。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A quick explanation on x- xbar

(xi-x̄)看起来真的很熟悉,不是吗?这是因为它也用于计算方差和标准差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看看平均值有多有用!这解释了为什么参数/统计如此重要。

另一个需要注意的符号是帽子

ŷ = y 帽

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

how I remember y-hat: guy with fedora, always assuming, trying to predict things, most likely wrong

这是指预测方程中 y 的预测值。

换句话说,更准确地说,

y = ax + b

应该是

ŷ = ax + b

误差基本上是

真实 Y -预测 Y

可以写成

y - ŷ

这也被称为残差。(** 还记得 第一部分 中关于检查你的残差是随机的,不应该显示出一个模式的那一步吗?)**

总之,因为生活是艰难而复杂的——预测的误差平方和被写成 SSE

但也可以称为:

  • 残差平方和
  • 残差平方和(SSR)

好了,酷的编码从这里开始

既然我们已经解决了所有这些数学问题,让我们来编写代码吧。

我们将从使用 Python 中的 sklearn 库中的线性回归模块开始。这类似于我在第 1 部分中给出的 R 的一行代码,其中我使用已经预先编码的东西来寻找我的回归线。

我不会在这里讨论 Python 编码,因为我不认为我是合格的 lol,但我尽力在代码本身的#注释中解释了每个步骤。

耶,你完成了建模!

看那条华丽的线。这是不是一个好的线还没有决定(等待第三部分…就等着吧),不过目前已经决定了这一行有最少的 SSE(或者 RSS,或者 SSR)** 。**

然而,由于我花了大量时间研究 LinearRegression()方法背后的等式,我想证明它实际上是我们刚刚使用的 python 模块背后的数学。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1 makes a 2nd appearance!

注意:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

python 里的权力符号不是“^”,是“”**

两者给出完全相同的结果:

回归方程为 y = 1.37x + 4.27

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们结束了。

希望你现在对简单线性回归的工作原理有了更好的了解:)我当然知道。

这只是线性回归的第一步,但是你可以自己尝试。我用这篇文章作为指南,它被证明是非常全面的,尤其是数学部分。

你可以在 Jupyter 笔记本中设置和编码,或者只使用 Python IDE

在下一集,我将会谈到评估模型的准确性,以及如何从中得出预测。

敬请期待!

额外额外!!语境很重要!!

在第一部分中,我举的关于‘流泪’和‘考试分数’的例子事后看来很糟糕。

尽管统计数据可以证明这种相关性,但请永远记住

***相关性不是因果关系 ***

对着镜子念 6 遍,希望相关的鬼魂出现给你祝福~

也许流泪的次数会影响分数,因为我花在学习上的时间越多,哭得越厉害(在这种情况下,更好的方法是建立学习时间与考试分数的模型),但这都是假设,可能只是巧合。

流泪次数与考试成绩之间的相关性可能是一个重要的因素。

鼓声

虚假相关

这就是商业知识和常识发挥作用的地方,也是防止机器偷走你工作的地方。什么是相关的,什么是不相关的,不仅仅是由程序定义的。特征选择在很大程度上是人类和计算机的工作。

查看泰勒·维根的超级有趣的虚假相关性。

我们已经到了第 2 部分的结尾!谢谢你坚持到现在。请在第 3 部分继续关注,如果发现任何错误,记得告诉我。

超级 SloMo 的乐趣。或者你如何用人工智能制作超赞的 YouTube 视频

原文:https://towardsdatascience.com/super-slomo-fun-or-how-you-can-make-awesome-youtube-videos-with-ai-2d6459f6de14?source=collection_archive---------17-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想获得灵感?快来加入我的 超级行情快讯 。😎

你有没有想过 YouTubers 或者国家地理是怎么制作那些超级慢动作视频的?它们太酷了,简直就像魔术一样!

过去制作这样的视频非常昂贵。唯一干净利落的方法就是用超高 fps 的相机。

幸运的是,现在不再是这样了!过去几年发生的人工智能爆炸改变了一切。要制作一个史诗般的慢动作视频,你只需要下载一点代码,安装一两个库,剩下的就交给计算机视觉了。

超级慢动作

Super SloMo 是一种新的计算机视觉技术,用于帧间插值。它来自 Nvidia,并在去年的 CVPR 会议上发表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Super SloMo Optical Flow

简而言之,Super SloMo 试图计算视频中的中间帧。给定 2 帧,我们如何在没有任何进一步信息的情况下准确估计它们之间的帧(如果我们有一个高 fps 的摄像机)。它通过深度卷积神经网络来实现这一点,训练该网络来预测帧之间的光流

光流是由物体或摄像机的运动引起的图像物体在两个连续帧之间的表观运动模式。通过这种光流,Super SloMo 将知道图像中的每个像素如何从一帧移动到另一帧。一旦它知道了移动路径,它就可以确定如果我们真的有一个中间帧,每个像素会在哪里。一旦你知道所有的像素应该在哪里,你就可以简单地将它们组合起来形成中间帧!

Results from Super SloMo, courtesy of Nvidia

让你的视频慢下来

感谢 AI 社区中开放源代码思想的美丽,这里有一个公开可用的超级 SloMo 实现!这是你如何使用它。

首先克隆存储库

git clone [https://github.com/avinashpaliwal/Super-SloMo.git](https://github.com/avinashpaliwal/Super-SloMo.git)

安装所需的库

pip install torch torchvision
pip install tensorflow-gpu
pip install numpy
pip install matplotlib
sudo apt install ffmpeg

你可以从这里下载预先训练好的模型。将该检查点放在 Super-SloMo 目录中。

要将您的视频从常规转换为慢动作,您只需运行一个小脚本!

python video_to_slomo.py --video=test.mp4 \
                         --sf=4 \
                         --checkpoint=SuperSloMo.ckpt \
                         --fps=25 \ 
                         --output=output.mp4

视频参数是输入视频的路径。 sf 控制你想让视频慢下来多少,在这种情况下是 4 倍。关卡是通往预训练模型关卡的路径。 fps 是原始视频的帧率;你可以通过右击视频并进入“属性”找到答案。输出是您希望输出视频的名称。

如果你在一台 Ubuntu 机器上,你可能需要注释掉下面两行,就像我在我的机器上一样:

FILE_ATTRIBUTE_HIDDEN = 0x02ctypes.windll.kernel32.SetFileAttributesW(extractionDir,                FILE_ATTRIBUTE_HIDDEN)

自己尝试代码,这很有趣!看看你是否能制作自己的超赞 SloMo 视频。欢迎在下面发布链接,与社区分享您的视频。

Results from Super SloMo, courtesy of Nvidia

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!

增压词向量

原文:https://towardsdatascience.com/supercharging-word-vectors-be80ee5513d?source=collection_archive---------13-----------------------

一个在你的 NLP 项目中提升快速文本和其他单词向量的简单技术

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在过去的几年中,单词向量在创建单词间语义联系的能力方面具有变革性。现在,将这些输入到深度学习模型中进行分类或情感分析等任务已经成为常态。

尽管如此,我一直对基于词频分析的简单能力印象深刻。术语频率逆文档频率 (TF-IDF)可以很容易地向非技术受众解释,结果也很容易解释。

本文探讨了如何将 TF-IDF 与单词向量相结合,从而得到既易于解释又能捕捉语言中存在的微妙语义关系的输出。

虽然互联网上充斥着使用 TF-IDF ( 见此处)和词向量方法(见此处)进行“词袋”分析的例子,但这些几乎总是被视为相互排斥的技术。本文探讨了如何将 TF-IDF 与单词向量相结合,从而得到既易于解释又能捕捉语言中存在的微妙语义关系的输出。使用 fastText 方法创建单词向量,我们还将能够创建一个模型,该模型可以处理词汇表之外的单词,并对拼写错误和打字错误具有鲁棒性。

快速文本单词向量

本文假设读者对单词向量有一定的了解,但是值得一提的是 fastText,以及它与更广为人知的 word2vec 创建单词向量表示的方法有何不同。FastText 由脸书开发,2017 年开源了一个稳定版本。

fastText 和 word2vec 之间最明显的区别是 fastText 使用 n-gram 字符拆分单词。例如,“林肯郡”(英国的一个郡)将被分为:

Lin, inc, nco, col, oln, lns, nsh, shi, hir, ire

其中 n=3。这种方法是对 word2vec 的重大改进,原因有二:

  1. 推断词汇外单词的能力。例如,上述模型会理解“兰开夏郡”(也是英国的一个县)与林肯郡相关,因为这两个词之间有“shire”(或“shi”、“hir”和“ire”)的重叠。
  2. 对拼写错误和错别字的鲁棒性。很容易看出,相同的字符级建模也意味着 fastText 足够健壮,可以处理拼写变化。这在分析社交媒体内容时特别有用。

关于 fastText 如何工作的详细回顾可以点击这里查看。

给我看看代码!

本文的其余部分将介绍一个简单的例子,该例子将在一系列文档上训练一个 fastText 模型,将 TF-IDF 应用于这些向量,并使用它来执行进一步的分析。

有问题的文件是公司提交的现代奴隶制声明,以解释它们正在内部和供应链中采取的消除现代奴隶制的步骤。下面的文章展示了在分析之前如何清理这些数据:

[## 使用无监督的机器学习清理您的数据

清理数据不一定是痛苦的!这篇文章是一个如何使用无监督机器学习的快速例子…

towardsdatascience.com](/clean-your-data-with-unsupervised-machine-learning-8491af733595)

如果你想继续下去,可以在这里找到包含所有代码的 colab 笔记本。

第一步。标记文本并创建短语

我们将使用 spaCy 将每个文档分割成一个单词列表(标记化)。我们还将通过删除停用词、标点符号并使用 Gensim 库转换为小写来清理数据:

#The dataframe is called 'combined' it has a column called 'text' containing the text data for each company#creates a list of documents with a list of words inside:
text = []
for i in combined.text.values:
  doc = nlp(remove_stopwords(strip_punctuation(strip_non_alphanum(str(i).lower()))))
  tokens = [token.text for token in doc]
  text.append(tokens)

然后我们将共同的术语粘在一起。例如,当每个文件都提到现代奴隶制时,将这两个词合并成一个短语“现代 _ 奴隶制”是很有用的。Gensim 库使这变得简单,代码如下:

common_terms = ["of", "with", "without", "and", "or", "the", "a"]
# Create the relevant phrases from the list of sentences:
phrases = Phrases(text, common_terms=common_terms, threshold = 10, min_count=5)
# The Phraser object is used from now on to transform sentences
bigram = Phraser(phrases)
# Applying the Phraser to transform our sentences is simply
tokens = list(bigram[text])

我们现在有一个文档列表,每个文档包含一个单词列表。常用短语已被组合成词。

第二步。训练快速文本模型

这只需要使用 Gensim 库的 fastText 模型的一行代码。您可以设置 n 元大小(“窗口”)以及向量的维度大小(“大小”)。这里,我们创建了 100 维的向量,并使用了 3:

model = FastText(tokens, size=100, window=3, min_count=1, iter=10, sorted_vocab=1)

我们可以使用以下内容来检查模型:

similarities = model.wv.most_similar(restrict_vocab=10000, positive=['contract'])

这将返回:

subcontract   0.9493274688720703 
sub_contract  0.9349175095558167 
contractual   0.9346154928207397 
contracts     0.9312876462936401 
contractor    0.9068889617919922

为了展示 fastText 如何处理不在词汇表中的单词,我们可以试着将 contract 拼错为’contract’。从下面,我们可以看到模型没有问题解释这个词,即使它从来没有见过!

contract      0.9389102458953857 
contracts     0.9058693051338196 
contrary      0.9027011394500732 
contractor    0.8995087742805481 
contractual   0.885408341884613

第三步。将 TF-IDF 应用于矢量

这一步首先使用 Scikit 为每个文档创建 TF-IDF 信息。然后,它将权重应用于文档中的每个单词向量,然后对整个文档进行平均:

#TF-IDF 
text = []
for i in tqdm(tokens):
  string = ' '.join(i)
  text.append(string)
tf_idf_vect = TfidfVectorizer(stop_words=None)
final_tf_idf = tf_idf_vect.fit_transform(text)
tfidf_feat = tf_idf_vect.get_feature_names()#Applying TF-IDF scores to the model vectorstfidf_sent_vectors = []; # the tfidf-w2v for each sentence/review is stored in this list
row=0;
errors=0
for sent in tqdm(tokens): # for each review/sentence
    sent_vec = np.zeros(100) # as word vectors are of zero length
    weight_sum =0; # num of words with a valid vector in the sentence/review
    for word in sent: # for each word in a review/sentence
        try:
            vec = model.wv[word]
            # obtain the tf_idfidf of a word in a sentence/review
            tfidf = final_tf_idf [row, tfidf_feat.index(word)]
            sent_vec += (vec * tfidf)
            weight_sum += tfidf
        except:
            errors =+1
            pass
    sent_vec /= weight_sum
    #print(np.isnan(np.sum(sent_vec)))tfidf_sent_vectors.append(sent_vec)
    row += 1
print('errors noted: '+str(errors))

现在,我们的语料库中的每个文档都有了超级 TF-IDF 单词向量!是时候测试一下了…

结果

现在我们有了与 TF-IDF 权重相结合的快速文本向量,使用余弦相似性来检测结果就很容易了。下面的代码根据查询字符串找到一个匹配的公司,然后根据它们的 Modern Slavery returns 生成一个最相似的公司列表。

compName = 'Deloitte'query = [combined.loc[combined.Company.str.contains(compName)].iloc[0]['FT_tfidf']]
query = np.array(list(query))
query = np.nan_to_num(query)vectors = np.array(list(combined.FT_tfidf.values))
vectors = np.nan_to_num(vectors)cosine_similarities = pd.Series(cosine_similarity(query, vectors).flatten())for i,j in cosine_similarities.nlargest(10).iteritems():
  print(str(i) + '-' + combined.Company.iloc[i] + " " + str(j))

这里的例子是专业服务公司德勤。从下面的结果我们可以看到,最相似的回报来自相关公司(即德勤自己的另一个财政年度的回报,以及 DLA 律师事务所和安永会计师事务所,另一家“四大”会计师事务所):

Deloitte LLP                  1.0000000000000002 
Deloitte LLP                  0.949480726712043 
DLA Piper International LLP   0.8635928917765654 
Travers Smith LLP             0.8495683187822698 
EBSCO International Inc.      0.8405915834557236 
Vink UK                       0.8356471225683573 
Ernst & Young LLP             0.8345225966043321 
IFS UK Ltd                    0.8288755547154663 
First Central Insurance       0.8279939308519769 
TalkTalk Telecom Group PLC    0.8260778120395709

希望这篇文章展示了将单词向量与 TF-IDF 技术结合起来可以产生强大的结果,并且也易于解释和说明。在此演练中生成的文档向量现在可以用于文本分类、聚类以及进一步分析(例如,发现公司回报如何随时间或跨行业变化的趋势)。

超收敛——内置正则化的快速训练

原文:https://towardsdatascience.com/superconvergence-with-inbuilt-regularization-49f914173cd8?source=collection_archive---------13-----------------------

你有像我一样在训练大型神经网络时陷入局部极小值的恐惧症吗?等待长时间用大量的 epocs 训练网络,以获得对你的测试数据的良好准确性。

并且仍然得到一个像哑巴一样坐在局部最小值中的模型,以及如何尝试越来越多的正则化方法并再次等待很长时间的开销。

你需要这个家伙一个超级收敛的魔术,节省你的时间,把你从深度学习实践者生活中的问题中拯救出来,如局部最小值,泛化错误,训练数据过度拟合等。

超收敛-

通常,在超收敛方法中,我们试图以大的学习速率学习到一个比传统的低学习速率学习更少的总迭代次数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left: getting fast progress in starting, Right: in valley areas very little progress on a large number of epochs

从较小的学习速率开始,在正确的方向上获取梯度,然后我们增加学习速率以快速通过平坦的山谷区域,在平坦区域之后,我们再次使用较低的学习速率来收敛到最佳损失值。这样在更少的时间内找到一个更好的超收敛解。

但是在固定学习率的情况下,我们可能会在开始时迅速减少损失,但是当我们停留在山谷区域时,我们会在大量迭代中取得一些进展,如右图所示。

自动正规化背后有什么魔力-

有几种方法,如辍学,下降连接,噪声与大学习率和批量大小等。超参数这种方法给我们提供了梯度噪声。另一方面,我们可以用我们的神经网络的输入来添加一些正则化,如数据增强或添加噪声,这种正则化提供了梯度多样性。

核心是,我们需要一种既能提供梯度噪声又能提供多样性的方法来训练神经网络模型以获得良好的泛化能力。

下面是实验结果来了解一下——

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,当我们从较低的学习率开始,但逐渐增加它们,并在训练期间达到较高的学习率时,我们将梯度噪声赋予我们的优化方法,这些方法充当我们模型的正则化器,如图所示,可能我们的训练损失增加了,但我们的验证损失降低了。最后对学习率进行退火处理,得到更平坦、更好的极小点。

这支持了*【Wu et al .,2017】*的论文,该论文指出宽的、平坦的局部极小值产生比尖锐极小值概括得更好的解。

我们可以利用这一点与数据扩增,以获得梯度经验噪声和多样性。

为什么我使用这种方法而不是其他的正则化方法-

因为我已经很快完成了训练部分,这对我一直都很有效。当我第一次在 FastAI【杰瑞米·霍华德】 中了解到这个方法,第二次看了 Sylvain Gugger 的这个博客时,我就对这个方法印象深刻。

为了更好地理解和实际使用,推荐阅读-

有监督、无监督和深度学习

原文:https://towardsdatascience.com/supervised-unsupervised-and-deep-learning-aa61a0e5471c?source=collection_archive---------0-----------------------

机器学习已经成为,或者仅仅是,人工智能,特别是计算机科学的一个重要分支,所以数据科学家是一个非常受欢迎的职位。今天,每个人都可以使用一些机器学习工具,如 TensorFlow 或其他工具,开始编写代码,并说“Ehy 我编写了具有机器学习功能的 bla bla”,但如果不知道这些算法是如何工作的,就很容易犯下巨大的错误。因此,了解机器学习的基础知识,然后建立其他技能非常重要。

这篇介绍首先要让我记住这一点。

让我们从 be 基础知识开始:机器学习中的第一个概念之一是有监督的,无监督的和深度学习的区别。

监督学习

监督学习是最常见的机器学习形式。使用监督学习,在训练阶段将一组示例(训练集)作为输入提交给系统。每一个输入都标有一个期望的输出值,这样系统就知道输入来的时候输出如何。例如,考虑一些可以分为 N 个不同类别的实验观察。所以我们有一个训练集(一系列对){(x1,y1),(x2,y2)……其中是输入,yi 是相应输出的类。通过最小化特定的成本函数来执行训练,该成本函数表示来自输入 xi 和期望输出 yi 的界限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Supervised learning schema

监督机器学习应用的一个典型例子是垃圾邮件检测器,这个算法是用一些垃圾邮件,而不是垃圾邮件以及它们属于哪个组来训练的。当您将邮件标记为“垃圾邮件”或当您将垃圾邮件文件夹中的邮件标记为“非垃圾邮件”时,此训练过程将继续。

无监督学习

另一方面,无监督学习,由系统提供的训练样本没有用所属类别来标记。因此,系统开发和组织数据,搜索它们之间的共同特征,并根据内部知识进行更改。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsupervised learning schema

无监督学习的一个例子是聚类分类:算法试图将相似的东西放在一个簇中,将不相似的东西放在另一个簇中,相似性的概念取决于相似性度量。

深度学习

深度学习(DL)技术代表了机器学习向前迈出的一大步。DL 是基于人类大脑处理信息和学习的方式。它存在于一个由若干级表示组成的机器学习模型中,其中每一级都使用来自前一级的信息进行深度学习。在这个模型中,每一层都对应于大脑皮层的一个不同区域,每一层都以与人脑相同的方式提取更多的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Deep learning schema

参考文献:

  • 机器学习在行动——彼得·哈灵顿
  • 【TensorFlow 入门— Giancarlo Zaccone

监督与非监督学习

原文:https://towardsdatascience.com/supervised-vs-unsupervised-learning-14f68e32ea8d?source=collection_archive---------0-----------------------

理解两种主要机器学习方法的区别

在机器学习领域,有两种主要类型的任务:监督的和非监督的。这两种类型之间的主要区别在于,监督学习是使用基本事实完成的,或者换句话说,我们事先知道样本的输出值应该是多少。因此,监督学习的目标是学习一个函数,该函数在给定数据样本和期望输出的情况下,最接近数据中可观察到的输入和输出之间的关系。另一方面,无监督学习没有标记输出,因此它的目标是推断一组数据点中存在的自然结构。

监督学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们希望将输入映射到输出标签时,监督学习通常在分类环境中完成;当我们希望将输入映射到连续输出时,监督学习通常在回归环境中完成。监督学习中的常见算法包括逻辑回归、朴素贝叶斯、支持向量机、人工神经网络和随机森林。在回归和分类中,目标是在输入数据中找到特定的关系或结构,使我们能够有效地产生正确的输出数据。请注意,“正确的”输出完全是由训练数据决定的,因此,虽然我们确实有一个我们的模型将假设为正确的基本事实,但这并不是说数据标签在现实世界中总是正确的。嘈杂或不正确的数据标签将明显降低模型的有效性。

当进行监督学习时,主要考虑的是模型复杂性和偏差-方差权衡。请注意,这两者是相互关联的。

模型复杂性指的是您试图学习的函数的复杂性,类似于多项式的次数。模型复杂性的适当级别通常由训练数据的性质决定。如果您有少量的数据,或者如果您的数据没有均匀地分布在不同的可能场景中,那么您应该选择低复杂度的模型。这是因为一个高复杂度的模型如果用在少量的数据点上会过度拟合。过度拟合指的是学习一个非常适合你的训练数据的函数,但不推广到其他数据点——换句话说,你严格地学习产生你的训练数据,而没有学习导致这个输出的数据中的实际趋势或结构。想象一下试图拟合两点之间的曲线。理论上,你可以使用任何次数的函数,但在实践中,你会吝啬地增加复杂性,并使用线性函数。

偏差-方差权衡也与模型泛化有关。在任何模型中,偏差(恒定误差项)和方差(不同训练集之间的误差变化量)之间都有一个平衡。因此,高偏差和低方差的模型在 20%的时间里都是错误的,而低偏差和高方差的模型在 5%-50%的时间里都是错误的,这取决于用来训练它的数据。请注意,偏差和方差通常彼此反向移动;增加偏差通常会导致较低的方差,反之亦然。在制作模型时,您的具体问题和数据的性质应该允许您在偏差-方差谱的哪个位置做出明智的决定。通常,增加偏差(和减少方差)会导致模型具有相对保证的基线性能水平,这在某些任务中可能是至关重要的。此外,为了生成具有良好泛化能力的模型,模型的方差应与训练数据的大小和复杂性成比例-小而简单的数据集通常应使用低方差模型来学习,而大而复杂的数据集通常需要高方差模型来完全学习数据的结构。

无监督学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无监督学习中最常见的任务是聚类、表示学习和密度估计。在所有这些情况下,我们希望了解数据的内在结构,而不使用显式提供的标签。一些常见的算法包括 k 均值聚类、主成分分析和自动编码器。由于没有提供标签,所以在大多数无监督学习方法中,没有特定的方法来比较模型性能。

无监督学习的两个常见用例是探索性分析和降维。

无监督学习在探索性分析中非常有用,因为它可以自动识别数据中的结构。例如,如果分析师试图对消费者进行细分,无监督聚类方法将是他们分析的一个很好的起点。在人类不可能或不切实际地提出数据趋势的情况下,无监督学习可以提供最初的见解,然后可以用于测试个人假设。

降维是指使用较少的列或特征来表示数据的方法,可以通过无监督的方法来实现。在表征学习中,我们希望学习个体特征之间的关系,允许我们使用与初始特征相关的潜在特征来表示我们的数据。这种稀疏潜在结构通常使用比我们开始时少得多的特征来表示,因此它可以使进一步的数据处理不那么密集,并且可以消除冗余特征。

TLDR:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3 分钟内监督与非监督学习

原文:https://towardsdatascience.com/supervised-vs-unsupervised-learning-in-2-minutes-72dad148f242?source=collection_archive---------8-----------------------

机器学习算法一般可以分为两类,有监督的或者无监督的。这是一个二分法的简要概述。

监督学习

监督学习算法获取数据集,并使用其特征来学习与相应标签集的某种关系。这个过程被称为训练,一旦完成,我们希望我们的算法能够很好地预测全新数据的标签,在这些数据中,算法没有真正标签的明确知识。例如,我们可以使用一组常见动物的图像以及它们相应的标签(例如,狗、猫、鸡)来训练一个受监督的算法。该算法将利用图像中的有用特征,如腿的数量颜色,以找到将图像与其正确标签联系起来的有用模式。在成功训练后,我们可以使用完全训练的算法来尝试预测一组全新的未见过的图像的标签。我们通常通过算法在预测这些新的看不见的图像时的准确性来判断算法的性能。监督学习可以应用于广泛的问题,如垃圾邮件检测或股票价格预测。决策树是监督学习算法的一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无监督学习

另一方面,无监督学习算法处理没有明确标记的数据。相反,无监督算法试图在数据中找到某种潜在的结构。一些观察结果是否被分组?不同特性之间有没有有趣的关系?哪些特征携带了大部分信息?与监督学习不同,通常不需要训练无监督算法,因为它们可以直接应用于感兴趣的数据。此外,与监督学习相比,评估无监督学习算法的性能有些主观,并且很大程度上取决于任务的具体细节。无监督学习通常用于文本挖掘和降维等任务。 K-means 是非监督学习算法的一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

打破二分法

近年来,出现了许多不太适合监督和非监督标签的范例。半监督学习听起来就像是一种结合了一些标记数据和一些未标记数据的方法。标注通常是一个昂贵且耗时的过程,因此在很多情况下,我们希望使用来自少量已标注数据和大量未标注数据的信息。与这种情况相关的还有主动学习,其中学习算法可以询问用户来标记将添加最多信息的特定观察。一个稍微不同的情况是,我们希望算法从经验中学习。例如,在像国际象棋这样的游戏场景中,我们可能希望通过玩许多游戏并使用每场游戏结果的某种标签来学习算法。在一个非常高的层面上,我们可能希望好的举措会被贴上赢的标签,而坏的举措可能与输相关联。这被称为强化学习,近年来受到了很多关注。大多数机器学习方法在它们可以完成的任务方面都非常狭窄,而元学习关注的是通用性或学会学习。一个例子可能是一种算法,它应该识别图像中的动物,但只对猫和狗进行训练。在这种情况下,一个好的元学习算法将能够识别它尚未见过的全新动物。有很多其他的方法并不完全适合有监督或无监督的学习,但是我希望这篇文章对这个主题有一个有用的介绍。

所有图片均为本人所有。

支持向量机——机器学习算法简介

原文:https://towardsdatascience.com/support-vector-machine-introduction-to-machine-learning-algorithms-934a444fca47?source=collection_archive---------0-----------------------

从零开始的 SVM 模式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

我猜现在你已经习惯了线性回归和 T2 逻辑回归算法。如果没有,我建议你在学习支持向量机之前先看看它们。支持向量机是另一种简单的算法,每个机器学习专家都应该拥有它。支持向量机是许多人的首选,因为它以较少的计算能力产生显著的准确性。支持向量机,缩写为 SVM,可用于回归和分类任务。但是,它被广泛用于分类目标。

什么是支持向量机?

支持向量机算法的目标是在 N 维空间(N-特征的数量)中找到一个超平面,该超平面清楚地分类数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Possible hyperplanes

为了分离这两类数据点,有许多可能的超平面可供选择。我们的目标是找到一个具有最大余量的平面,即两类数据点之间的最大距离。最大化边缘距离提供了一些加强,以便可以更有把握地对未来的数据点进行分类。

超平面和支持向量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hyperplanes in 2D and 3D feature space

超平面是帮助分类数据点的决策边界。落在超平面任一侧的数据点可以归属于不同的类别。此外,超平面的维数取决于特征的数量。如果输入特征的数量是 2,那么超平面只是一条线。如果输入特征的数量是 3,则超平面变成二维平面。当特征的数量超过 3 时,变得难以想象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Support Vectors

支持向量是更接近超平面并影响超平面的位置和方向的数据点。使用这些支持向量,我们最大化分类器的余量。删除支持向量将改变超平面的位置。这些是帮助我们建设 SVM 的要点。

大幅度直觉

在逻辑回归中,我们采用线性函数的输出,并使用 sigmoid 函数压缩[0,1]范围内的值。如果挤压值大于阈值(0.5),我们将其指定为标签 1,否则将其指定为标签 0。在 SVM,我们获取线性函数的输出,如果该输出大于 1,我们将其识别为一个类,如果输出为-1,我们将其识别为另一个类。由于在 SVM 阈值被改变为 1 和-1,我们获得了这个值的加强范围([-1,1]),其作为余量。

成本函数和梯度更新

在 SVM 算法中,我们希望最大化数据点和超平面之间的间隔。有助于最大化裕量的损失函数是铰链损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Hinge loss function (function on left can be represented as a function on the right)

如果预测值和实际值符号相同,则成本为 0。如果不是,我们就计算损失值。我们还在代价函数中加入了一个正则化参数。正则化参数的目标是平衡余量最大化和损失。添加正则化参数后,成本函数如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Loss function for SVM

现在我们有了损失函数,我们对权重求偏导数来求梯度。使用梯度,我们可以更新我们的权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradients

当没有错误分类时,即我们的模型正确地预测了我们的数据点的类别时,我们只需要根据正则化参数更新梯度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient Update — No misclassification

当存在错误分类时,即我们的模型在预测我们的数据点的类别时出错,我们将损失与正则化参数一起包括进来以执行梯度更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gradient Update — Misclassification

Python 中的 SVM 实现

我们将用来实现 SVM 算法的数据集是虹膜数据集。可以从这个链接下载。

由于 Iris 数据集有三个类,我们将删除其中一个类。这给我们留下了一个二元类分类问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visualizing data points

另外,有四个特性可供我们使用。我们将只使用两个特征,即萼片长度和花瓣长度。我们把这两个特征画出来。从上图中,你可以推断出可以用一条直线来分隔数据点。

我们提取所需的特征,并将其分成训练和测试数据。90%的数据用于训练,剩下的 10%用于测试。现在让我们使用 numpy 库来构建我们的 SVM 模型。

α(0.0001)是学习率,正则化参数λ被设置为 1/历元。因此,正则化值减少了历元数的增加。

我们现在裁剪权重,因为测试数据只包含 10 个数据点。我们从测试数据中提取特征并预测值。我们获得预测值,并将其与实际值进行比较,打印出我们模型的准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Accuracy of our SVM model

还有另一种简单的方法来实现 SVM 算法。我们可以使用 Scikit 学习库,只需调用相关函数来实现 SVM 模型。代码的行数明显减少太少行。

结论

支持向量机是一种优雅而强大的算法。明智地使用它:)

支持向量机——概述

原文:https://towardsdatascience.com/support-vector-machines-a-brief-overview-37e018ae310f?source=collection_archive---------8-----------------------

有多种方法可以用机器学习对数据进行分类。你可以运行一个逻辑回归,使用决策树,或建立一个神经网络来完成这项任务。1963 年,Vladimir Vapnik 和 Alexey Chervonenkis 开发了另一种分类工具,即支持向量机。Vapnik 在 20 世纪 90 年代完善了这种分类方法,并扩展了支持向量机的用途。支持向量机已经成为数据科学家的一个很好的工具。

在这篇博文中,我计划提供一个关于支持向量机的高层次概述。我将谈论支持向量机背后的基本理论,为什么它们是相关的,以及这种分类器的优点和缺点。我还向您展示了一个用 Python 实现 SVM 的快速示例。我还提供了一个资源列表,这些资源有助于理解支持向量机。如果你想理解数学,我鼓励你查阅更多的支持向量机深度指南。这些信息的大部分是从 Tibshirani 的统计学习导论中提炼出来的。

:

支持向量机试图通过数据集传递一个线性可分的超平面,以便将数据分为两组。这个超平面对于任何维度都是线性分隔符;它可以是直线(2D)、平面(3D)和超平面(4D+)。请看统计学习简介中的这张图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用无限多的超平面来分离红色和蓝色物体。哪个超平面最好?好吧,最好的超平面是最大化边际的超平面。边缘是超平面和几个接近点之间的距离。这些接近点是支持向量,因为它们控制超平面。下图显示了红色和蓝色物体的最佳超平面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是最大间隔分类器。它使超平面的边缘最大化。这是最好的超平面,因为它最大程度地减少了泛化误差。如果我们添加新数据,最大间隔分类器是正确分类新数据的最佳超平面。最大间隔分类器是我们的第一个 SVM。但是这个 SVM 要求两个类完全线性分离。情况并非总是如此,因此在 1993 年,Vapnik 开发了他的另一台机器。

下图显示了不完全可分的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这种情况下,最大间隔分类器将不起作用。Vapnik 开发了一个软余量,允许对数据进行一些错误分类。这被称为软边界分类器或支持向量分类器。它还试图最大限度地扩大两个阶层之间的差距。下图说明了这个 SVM。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

支持向量分类器包含一个调整参数,以便控制它将允许多少错误分类。当希望最小化误差时,这个调谐参数是重要的。和所有监督学习一样,有一个偏差-方差权衡。当调整参数(通常表示为 C)较小时,分类器只允许少量的误分类。支持向量分类器将具有低偏差,但是可能不能很好地概括,并且具有高方差。如果我们的调整参数太小,我们可能会过度拟合训练数据。如果 C 很大,则允许的错误分类数会增加。这个分类器可以更好地进行归纳,但是可能会有很大的偏差。当调整参数为零时,不可能有错误分类,并且我们有最大间隔分类器。下图说明了这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果数据不是线性可分的,则支持向量分类器可能会失败。1992 年,Vapnik 开发了一种处理非线性可分类的方法。这个方法使用内核技巧。我们需要“扩大特征空间,以适应类别之间的非线性边界”(统计学习介绍)。核是量化观察值之间相似性的函数。用于分离非线性数据的常见类型的核是多项式核、径向基核和线性核(与支持向量分类器相同)。简单地说,这些核转换我们的数据,以便通过一个线性超平面,从而对我们的数据进行分类。下面是各种内核类型的一些可视化指南。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【http://svmcompbio.tuebingen.mpg.de/img/poly.png 号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

支持向量机的扩展可以用来解决各种其他问题。我们可以使用一对一分类或一对所有分类来建立多个类别的支持向量机。在统计学习简介中可以找到对这些的简要描述。此外,支持向量回归机存在的回归问题。你也可以研究支持向量聚类、SVM 排名、直推式 SVM 等等。

那么,我们应该什么时候使用支持向量机呢?当组被清楚地分开时,支持向量机在分类方面做得很好。当我们的数据非线性分离时,它们也能做得很好。您可以转换数据以线性分离它,或者让 SVM 转换数据并线性分离这两个类。这是使用支持向量机的主要原因之一。您不必自己转换非线性数据。支持向量机的一个缺点是这些函数的黑盒性质。使用核来分离非线性数据使得它们很难(如果不是不可能的话)解释。

下面是一个用 Scikit-Learn 在 Python 中快速实现 SVM 的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的代码中,我用特定的内核函数实例化了 SVM,并使用交叉验证来检查模型的平均准确性。正如您所见,使用 SVM 可以非常简单。

总的来说,支持向量机是针对特定情况的优秀分类器。理解它们将会给你一个替代 GLMs 和决策树的分类方法。一定要看看我下面的引用,尤其是如果你想要更深入的支持向量机的数学解释。如果您有在这些资源中尚未找到答案的问题,请向 Vapnik 发送消息。他目前在脸书人工智能研究所工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资源:

加雷斯·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼的《统计学习导论》

【https://www.svm-tutorial.com/ 号

【http://www.yaksis.com/

Joseph Nelson 和 Matt Speck 在 DC SVM 大会上的演讲

麻省理工学院 6.034 人工智能,2010 秋季课程——导师:帕特里克·温斯顿

支持向量机(直观理解)——第一部分

原文:https://towardsdatascience.com/support-vector-machines-intuitive-understanding-part-1-3fb049df4ba1?source=collection_archive---------2-----------------------

与逻辑回归和铰链损失的比较

网上关于这个话题的大部分材料都是用数学和很多细节来处理的,人们很容易失去对更广泛概念的理解。这里试图用很少的数学处理来直观地理解 SVM 的大部分细节。唯一的基本假设是,读者已经知道一些数学基础、逻辑回归以及机器学习的基本术语和概念。我计划在 3 个部分中涵盖这个主题"支持向量机(直观理解)"。在第一部分,我们将看看 SVM 的损失函数。

让我们从我们对逻辑回归的理解以及 SVM 与逻辑回归的区别开始。

在逻辑回归中,线 L1 定义了输入空间的概率分布。如果与 L2 线定义的分布相比,平均而言,L1 定义的分布在等级“-1”点较低,在等级“+1”点较高,则称 L1 线优于 L2 线。

SVM 的几个主要观点在概念上不同于逻辑回归—

第一部分:损失函数

第 2 部分:最大边际分类——在非常基本的层面上,在 SVM,如果 L1 的“边际”更大,即 L1 离这两个类别更远,则 L1 线被认为是比 L2 线更好的分类器。

第三部分:使用内核技巧的特征转换

让我们一个一个地看——

损失函数:首先,让我们从损失函数开始

让我们以一个简单的二元分类任务为例。然后,对于给定的输入特征“X”和目标“y”,SVM 算法的目标是为每次观察预测接近目标(“实际 y”)的值(“预测 y”)。来做这件事—

  1. 我们对一个可以计算“预测 y”的方程感兴趣。该等式取决于输入 x 的一些加权值,可以写成:

'预测 y ’ = f(X 的加权值)。

让我们用 w 来表示我们的重量。

  1. 我们可以通过绘制随机决策边界(又名。这与预测“预测的 y”)的一些随机值是相同的,并且这正是当我们用随机值初始化上述等式中的权重时所发生的。
  2. 确定成本/损失函数。损失函数的任务是量化“预测 y”和“实际 y”之间的误差。简而言之,这定义了您想要对错误分类的观察进行惩罚的数量。因此,直觉上,“预测的 y”离“实际的 y”越远,惩罚就应该越大,反之亦然。给定我们在特定迭代中产生的总误差量,我们试图通过调整下一次迭代的权重来减少该误差。这种情况一直持续到我们无法再最小化总误差/成本**。**总误差/成本函数如下:

总误差/成本=迭代中每个观测值所有损失的总和。

4.在所有迭代结束时,我们得到的最终权重形成了我们用于预测未知数据的最终模型。

因此,对于 SVM,使用了一个称为“铰链损失”的损失函数——参考下图(来自维基百科)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plot of hinge loss on y-axis and ‘predicted y’ on x-axis.

注意,从上面的图(蓝线)可以看出,当

  • “预测的*y”*≥1 且
  • 实际的 y’ 和预测的*'*y '具有相同的符号(意味着‘预测的 y’ 预测正确的类)

但当’实际 y ','预测y '符号相反时,铰链损耗随 y 线性增加(单边误差)。

SVM 使用铰链损失作为逻辑回归,使用逻辑损失函数优化成本函数并得出权重。铰链损失不同于逻辑损失的方式可以从下面的图中理解(来自维基百科——紫色是铰链损失,黄色是逻辑损失函数)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plot of various loss functions — Purple is the hinge loss function. Yellow is the logistic loss function.

请注意,黄线逐渐向下弯曲,不像紫色线,紫色线的“预测 y”值≥1 时,损失为 0。通过观察上面的图表,曲线的这种性质揭示了逻辑损耗和铰链损耗之间的一些主要差异

  • 请注意,逻辑损失比铰链损失发散得更快。所以,一般来说,它会对异常值更敏感——为什么?因为,假设在我们的数据中有一个异常值,逻辑损失(由于其发散的性质)与异常值的铰链损失相比将非常高。这意味着对我们的权重进行更大的调整。
  • 请注意,即使该点被充分自信地分类,逻辑损失也不会变为零——水平轴是“预测 y”值的置信度,如果我们在 x 轴上取值为“1.5”,则相应的逻辑损失(黄线)仍会显示一些损失(从上面的图中接近 0.2,因此对我们的预测仍不太有信心),而铰链损失为“0”(这意味着没有损失,我们对我们的预测更有信心)。逻辑损失的这种性质可能会导致准确性的轻微下降。
  • 逻辑回归有更多的概率解释。

基于对 SVM 铰链损失函数的理解,让我们在成本中加入一个正则项(L2 范数)。正则化项背后的直觉是,如果权重值很高,我们会增加成本损失。因此,在尝试最小化成本的同时,我们不仅调整权重,还尝试最小化权重的值,从而减少对训练数据的过度拟合,并使模型对异常值不那么敏感。

因此,添加正则化项后,总成本函数最终看起来像:

总成本= ||w ||/2 + C(每次观测的所有损失之和)*

其中“C”是控制正则化量的超参数。

根据我们选择的“C”的值,我们可以有一个硬边界分类器和一个软边界分类器。

  • 如果 C 选择得足够小,使得总成本中的第二项可以忽略,那么我们称之为硬边界分类器。在这种情况下,我们在每次迭代中只最小化第一项(||w ||/2),以达到调整后的权重。
  • 如果 C 选择得足够大,则第二项不能被忽略,并且我们得到软边缘分类器。

在下一部分,我们将看看到底是什么原因导致 SVM 超平面远离自己(又名。最大化边缘)以便实现最大边缘分类器的概念。我们还将了解保证金的价值。

支持向量机(直观理解)——第二部分

原文:https://towardsdatascience.com/support-vector-machines-intuitive-understanding-part-2-1046dd449c59?source=collection_archive---------1-----------------------

最大差值分类的概念

[## 支持向量机(直观理解)——第一部分

网上关于这个话题的大部分材料都是用数学和很多细节来处理的,其中一个…

medium.com](https://medium.com/towards-data-science/support-vector-machines-intuitive-understanding-part-1-3fb049df4ba1)

这是关于这个主题的第一部分的延续。如果你愿意,请参考以上部分。

这里我们将讨论 SVM 固有的最大利润分类背后的直觉。问题陈述如下—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理想情况下,我们希望我们的分类线看起来像上图中的粗线。请注意,与虚线相比,粗线离其最近的数据点更远。那么,SVM 是如何做到这一点的呢?

首先,让我们复习一些基础知识来理解这一点。我们知道一个简单的线性方程由 a* x +b* y +c = 0 给出。我们将对 2D 使用这个简单的等式,这可以很容易地扩展到对 n D

一些基本假设—

  • 我们将只考虑两个特性 x1,x2
  • 一个目标类 y ,对于正类可以取+1,对于负类可以取-1。
  • 设 *x1i,x2i(对于 i = 1 到 n,*组观察值 ) 代表个体’ n’ 对这些特征中的每一个的个体观察值 x1,x2

那么我们可以把我们的简单线性方程改写为 w1 *x1+w2 *x2+w0 = 0——只是代入:a = w1,b = w2,c = w0,x = x1 ,y =x2;其中 w1、w2 和 w0 是我们的优化算法将最终计算出的权重。

然后,对于任何观察说,( x1 i, x2 i) —

  • w1 x1i+w2 x2i+w0+0、** if ( x1 i、 x2 i)位于直线的一侧(当( x1 i、 x2 i)属于 y = +1 目标类时发生)

  • w1 x1i+w2 x2i+w0<0,如果( x1 i, x2 i)位于直线的另一侧(当( x1 i, x2 i)属于 y = -1 目标时发生**

将两个等式合并为一个:y*(w1 *x1i+w2 *x2i+w0)>0,当 y =-1 或+1(仅在两边乘以目标值, y (+1 / -1)时,该等式适用于上述两种情况,因此该等式适用于正负两种分类

从几何学中,我们知道从点( x1 i, x2 i)到直线 w1* x1 +w2*x2+w0 = 0 的垂直距离(姑且称之为’ m ')由下式给出

m=(w1 x1i+w2 * x2i+w0)*/**sqrt(w1+w2

请参考下面的链接,了解为什么会这样的简单推导

[## 点到一条线的垂直距离

展示了如何找到一个点到一条线的垂直距离,以及公式的证明。

www.intmath.com](https://www.intmath.com/plane-analytic-geometry/perpendicular-distance-point-line.php)

考虑到归一化权重( w1 + w2 = 1),我们可以去掉上一个等式中的分母,它简化为以下等式

w1 *x1i+w2 *x2i+w0 =m

通过在任一侧乘以目标值, y (+1 / -1),该等式可以概括为对正类和负类进行分类。给定这一点,然后下面的内等式,y (w1 *x1i+w2 *x2i+w0)≥m**,*保证对于阴性/阳性目标类,每个观察值( x1 i, x2 i)位于/超出分类线两侧的距离“ m ”。在这里,‘m’被称为边距。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Margin = m

那么现在下一个问题来了,是什么原因导致 SVM 将利润最大化?答案在于优化第一部分中讨论的成本/损失函数。

  • 正如我们从第 1 部分的图中注意到的,当“预测的y”≥1 时,铰链损失变为 0。
  • 如第 1 部分所示的“预测的 y ”等于 w1* x1 + w2*x2 + w0(输入值的加权平均值,X)。

综合以上,当 w1* x1 + w2*x2 + w0 ≥ 1 时,铰链损耗为 0。同样,通过在任一侧将此乘以 y (+1 / -1)的目标值,使得该等式可以概括为分类正类和负类。这样,我们得到:y*(w1 *x1+w2 * x2+w0)≥1。与之前的等式(粗体)相比,我们可以看到裕量 m 等于 1。根据我们使用的铰链损耗函数,我们可以将这个裕量更改为我们想要的值。优化算法将计算出权重,使得上述等式成立,以便最小化损失函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

margin value on x-axis vs loss on y-axis

从上面的图中,请注意—

  • 对于离分类线相当远的所有点,余量, m 大于 1。所以他们的损失= 0(蓝线)。因此,只有在分类线附近( m ≤1)的点才真正影响权重。
  • 对于更远的点( m > 1),无论如何损失函数是 0,因此当优化算法遇到这样的更远的点时,不对权重进行调整。
  • 为此,( m ≤1)的点称为 支持向量 ,因为它们支持/影响分类线。为什么是矢量?—因为任何点都是数据空间中的向量。

这里需要注意的重要一点是,第 1 部分中“预测 y”的概念只不过是边缘值的概念, m. 如果“*m”*高(=“预测 y”高),那么该点离分类线更远,因此我们更确信观察值肯定属于所识别的类别。这正是最大间隔分类器背后的概念。

最后,通过控制我们在第 1 部分中讨论的成本函数中的正则化参数“C ”,我们间接操纵每个观察值的裕量*‘m’(x1I, x2 i ),从而调整缓冲/松弛量,我们同意,在对数据进行错误分类时。如果“C”选择得更高,那么我们允许更多的缓冲数据被错误分类,反之亦然。我们可以直观地理解这一点,考虑一个让‘C’= 0 的极限情况,这意味着我们不允许任何缓冲。然后,请注意,损失函数只是简化为优化成本=||w ||/2(我们在第 1 部分中讨论了这一点作为硬间隔分类器),这意味着我们需要取得平衡以减少权重(使上述成本函数最小),同时实现 1 的间隔(因为我们希望 w1 x1 + w2*x2 + w0 ≥ 1)。组合的这种性质不允许任何错误分类的缓冲,因此被恰当地称为硬边界分类器。

在下一个也是最后一个部分,我们将看看如何使用内核技巧来完成特性转换。

支持向量机(SVM)

原文:https://towardsdatascience.com/support-vector-machines-svm-c9ef22815589?source=collection_archive---------0-----------------------

简介:

支持向量机可能是最受欢迎和谈论最多的机器学习算法之一。它们在 20 世纪 90 年代开发的时候非常流行,并且仍然是几乎不需要调整的高性能算法的首选方法。在这篇博客中,我们将描绘 SVC 的各种概念。

映射的概念:

1。什么是 SVM?

2。SVM 背后的意识形态。**

3。直觉发展。

4。SVM 使用的术语。

5。超平面(决策面)。

⑥。硬保证金 SVM。

7。软利润 SVM。

8。SVM 的损失函数解释。

9。SVM 的双重形式。

10。什么是内核诡计?**

11。内核的类型。**

12。SVM 的利与弊。**

13。为 SVM 准备数据。**

14。模型应用**

1.什么是 SVM?

被称为 SVM 的支持向量机是一种 监督学习算法 ,可用于支持向量分类(SVC)和支持向量回归(SVR)等分类和回归问题。它用于较小的数据集,因为处理时间太长。在这一集中,我们将关注 SVC。

2.SVM 背后的意识形态:

SVM 是基于寻找一个超平面的想法,该超平面最好地将特征分成不同的域。

3.直觉发展:

考虑以下情况:

有一个跟踪者正在给你发邮件,现在你想设计一个函数(超平面)来明确区分这两种情况,这样无论何时你收到一封跟踪者发来的邮件,它都会被归类为垃圾邮件。下面是绘制超平面的两种情况,你会选择哪一种,为什么?花点时间分析一下情况……

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我猜你会选无花果。你想过你为什么要选无花果吗?因为图(a)中的电子邮件是明确分类的,与图(b)相比,你对此更有信心。基本上,SVM 是由提出一个 最优超平面 的想法组成的,它将清楚地分类不同的类(在这种情况下,它们是二元类)。

4.SVM 使用的术语:

离超平面最近的点称为 支持向量点 ,向量离超平面的距离称为 边距

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里要发展的基本直觉是,SV 点离超平面越远,在它们各自的区域或类中正确分类这些点的概率就越大。SV 点在确定超平面时非常关键,因为如果向量的位置改变,超平面的位置也会改变。技术上这个超平面也可以称为边缘最大化超平面

5.超平面(决策面):

在这篇文章中,我们已经讨论超平面很久了,让我们在继续讨论之前证明它的意义。超平面是用于区分特征的函数。在 2-D 中,用于在特征之间分类的函数是一条线,而用于在 3-D 中分类特征的函数被称为平面,类似地,用于在更高维度中分类点的函数被称为超平面。现在,既然你知道了超平面,让我们回到 SVM。

假设有“m”个维度:

因此,“M”维中超平面的方程可以表示为=

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在哪里,

Wi =向量(W0,W1,W2,W3……Wm)

b =有偏项(W0)

X =变量。

6.硬利润 SVM:

现在,

假设 3 个超平面,即(π,π+,π),使得‘π+’平行于穿过正侧支持向量的‘π’,而‘π’平行于穿过负侧支持向量的‘π’。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个超平面的方程可以被认为是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于点 X1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:当点 X1 时,我们可以说该点位于超平面上,并且方程确定我们的实际输出和超平面方程的乘积为 1,这意味着该点被正确地分类在正域中。

对于 X3 的观点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:当点 X3 时,我们可以说该点远离超平面,并且该方程确定我们的实际输出和超平面方程的乘积大于 1,这意味着该点被正确地分类在正域中。

对于点 X4:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:当点 X4 时,我们可以说该点位于负区域中的超平面上,并且该方程确定我们的实际输出和超平面方程的乘积等于 1,这意味着该点被正确地分类在负区域中。

对于点 X6:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:当点 X6 时,我们可以说该点远离负区域中的超平面,并且该方程确定我们的实际输出和超平面方程的乘积大于 1,这意味着该点被正确地分类在负区域中。

让我们看看未分类的约束条件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于点 X7:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:当 Xi = 7 时,点被错误地分类,因为对于点 7,wT + b 将小于 1,这违反了约束。所以我们发现了由于违反约束而导致的错误分类。同样,我们也可以说对于点 Xi = 8。

由此从上面的例子中,我们可以得出,对于任意一点 Xi,

如果易(WTXi +b) ≥ 1:*

那么 Xi 被正确归类

其他:

Xi 被错误归类。

因此,我们可以看到,如果这些点是线性可分的,那么只有我们的超平面能够区分它们,如果引入任何异常值,那么它就不能将它们分开。所以这些类型的 SVM 被称为 作为硬边界的 SVM (因为我们有非常严格的约束来正确地分类每一个数据点)。

7.软利润 SVM:

我们基本上认为数据是线性可分的,这可能不是现实生活中的情况。我们需要更新,以便我们的函数可以跳过一些异常值,并能够对几乎线性可分的点进行分类。为此,我们引入一个新的 松弛变量( ξ),称为 Xi。

如果我们把ξ it 引入前面的方程,我们可以把它改写为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Introduction of Xi

如果ξi= 0,

这些点可以被认为是正确分类的。

其他:

ξi > 0,错误分类分。

因此,如果ξi> 0,这意味着 Xi(变量)位于不正确的维度,因此我们可以认为ξi 是与 Xi(变量)相关的误差项。平均误差可由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

average error

因此我们的目标,在数学上可以描述为;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中ξi = ςi


这种方法被称为软边界技术。

8.SVM 的损失函数解释:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

when Zi is ≥ 1 then the loss is 0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

when Zi < 1 then loss increases.

因此,可以解释为铰链损耗最大(0,1-Zi)。

9.SVM 的双重形式:

现在,让我们考虑当我们的数据集根本不是线性可分的情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本上,我们可以像在逻辑回归中一样,通过向数据点添加相关的特征,将数据点投影到更高的维度中,从而分离每个数据点。但是有了 SVM,就有了一种强大的方法来完成将数据投射到更高维度的任务。上述公式是 SVMT3 的 原形。另一种方法是对偶形式的 SVM,它使用 拉格朗日乘数 来解决约束优化问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注:

如果αi > 0,则 Xi 是支持向量,当αi=0 时,则 Xi 不是支持向量。

观察:

  1. 为了解决实际问题,我们不需要实际的数据点,而只需要每对向量之间的点积就足够了。
  2. 为了计算“b”偏差常数,我们只需要点积。
  3. SVM 对偶形式相对于拉格朗日公式的主要优点是它只依赖于 α

10.什么是内核诡计?

即将来到 SVM 最著名的主要部分, 内核绝招 。核是在某些(非常高维)特征空间中计算两个向量 xy 的点积的一种方式,这就是为什么核函数有时被称为“广义点积”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

try reading this equation…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

s.t = subjected to

应用核技巧意味着用核函数替换两个向量的点积。

11.内核类型:

  1. 线性核
  2. 多项式核
  3. 径向基函数核(RBF)/高斯核

我们将集中在多项式和高斯核,因为它是最常用的。

多项式内核:

一般来说,多项式核定义为;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

b = degree of kernel & a = constant term.

在多项式核中,我们简单地通过增加核的幂来计算点积。

示例:

假设最初 X 空间是二维的

Xa = (a1,a2)

Xb = (b1,b2)

现在,如果我们想将数据映射到更高维度,比如说在六维的 Z 空间中,看起来可能是这样的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了求解这个对偶 SVM,我们需要(转置)Za ^t 和 Zb 的点积。

方法 1:

传统上,我们会通过以下方式解决这个问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将花费很多时间,因为我们必须在每个数据点上执行点积,然后计算点积,我们可能需要做乘法,想象一下对数千个数据点这样做…

或者我们可以简单地使用

方法二:

使用内核技巧:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这种方法中,我们可以通过增加幂的值来简单地计算点积。简单不是吗?

径向基函数核(RBF)/高斯核:

高斯 RBF(径向基函数)是另一种流行的核方法,用于 SVM 模型。RBF 核是一个函数,它的值取决于到原点或某个点的距离。高斯核具有以下格式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

||X1 — X2 || = Euclidean distance between X1 & X2

使用原始空间中的距离,我们计算 X1 和 X2 的点积(相似性)。

注:相似度是两点之间的角距离。

参数:

  1. c:正则化强度的倒数。

行为:随着“c”值的增加,模型变得过拟合。

随着“c”值的减小,模型的拟合度降低。

2.γ:γ(仅用于 RBF 核)

行为:随着“ γ ”值的增加,模型变得过拟合。

随着’ γ 的值减小,模型欠拟合。

12.SVM 的利与弊:

优点:

  1. 在更高维度真的很有效。
  2. 当特征数多于训练样本数时有效。
  3. 类可分时的最佳算法
  4. 超平面仅受支持向量的影响,因此异常值的影响较小。
  5. SVM 适合极端情况下的二元分类。

缺点:

  1. 对于较大的数据集,需要大量的时间来处理。
  2. 在重叠类的情况下性能不佳。
  3. 适当选择 SVM 的超参数,以获得足够的泛化性能。
  4. 选择合适的内核函数可能很棘手。

13.为 SVM 准备数据:

1。数值转换:

SVM 假设你的输入是数字的,而不是分类的。所以你可以用一个最常用的"one hot encoding、label-encodingetc"来转换它们。

2。二进制转换:

由于 SVM 只能对二进制数据进行分类,所以您需要使用( 一对一对其余的 方法/ 一对一对一方法 )转换方法将多维数据集转换为二进制形式。

14.模型应用:

由于这个帖子已经太长了,所以我想到把编码部分链接到我的 Github 账号( 这里 )。

参考资料:

导师:

Harshall Lamba,新潘韦尔皮莱工程学院助理教授。

Riot API 的第 2 部分:表层故事。

原文:https://towardsdatascience.com/surface-level-stories-14f672d83947?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从我的上一篇文章继续,我已经扩展了我的数据集很多,在修补和清理数据后,我创建了一个 98 场比赛的 CSV,每场比赛包含 10 名球员数据(5 v 5)。

更新*虽然我第一次尝试使用 Riot API 是为了适应一般的 API,但我从玩家 Doublelift 那里获得的数据集太小,无法对其进行任何重要的建模(最近 10 场游戏)。所以下一步是撒下更大的网来合作。结果是一个由 98 场比赛组成的数据集,每场比赛由 10 名球员组成。我没有选择基于一个特定玩家的数据子集,而是收集了 25 个游戏,并在这些游戏中收集了一系列游戏 id,以便将这些数据子集化为玩家数据的匹配项(说起来容易做起来难)。所以我们来分解一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

980x by 61x

我的目标是得到一个包含 1000 个匹配的数据集,但是我承认只有 980 个。我仍然习惯于速率限制,并一度设置了一个定时器,在每 10 个请求后暂停。我想提到的是,我对将匹配数据分割成由匹配 ID 链接的单独的行有所保留,因为我的意图是使用二进制“赢家”目标将特征拟合到逻辑回归模型中。我不想在特性中执行数据泄漏,所以我必须删除将每一行链接在一起的列。因此,我觉得像“团队”这样的功能必须放弃。

df.drop('Team',inplace=True,axis=1)
df.drop('combatPlayerScore',inplace=True,axis=1)
df.drop('unrealKills',inplace=True,axis=1)
df.drop('firstInhibitorKill',inplace=True,axis=1)
df.drop('Player:',inplace=True,axis=1)# Later on I took out the item features 
feat = [c for c in df.columns if not c.startswith("item",0,4)]
df_no_items = df[feat]

我还做了一个 bool 到 int 的转换

df['winner'] = df['winner'].map({True:0,False:1})
df['firstBloodAssist'] = df['firstBloodAssist'].map({False:0,True:1})
df['firstBloodKill'] = df['firstBloodKill'].map({False:0,True:1})
df['firstTowerAssist'] = df['firstTowerAssist'].map({False:0,True:1})
df['firstTowerKill'] = df['firstTowerKill'].map({False:0,True:1})
df['firstInhibitorAssist'] = df['firstInhibitorAssist'].map({True:1,False:0})

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在下一个问题是处理冠军 Id,它是由我想要虚拟的 int 组成的。这是我开发数据的第一个分支。每个数字对应一个特定的 Lol 冠军,每个冠军包含一个类。为了简单起见,我决定把每个冠军的 ID 和它的相关职业(刺客、坦克、战士、法师、射手、支援)分开,并把这些类别虚拟出来。为此,我将主数据帧映射到一个单独的静态字典,该字典由 Champion ID 及其关联的类组成(这可以在 API 的静态数据中找到,不会计入您的总请求限制)。现在我们可以虚拟这些类,并开始绘制数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,随着类被转换为虚拟类,我们现在可以开始建模了。(放下刺客假人以避开假人陷阱。。。)

我的第一个问题是想看看死亡的分布。在 python 和 seaborn 中,我做了一个简单的直方图。一个相当健康的正左倾分布,这是有道理的。我注意到一些山谷表明,玩家要么不杀任何人,当他们做的时候,大约是 5-8 人。但总的来说,这些数据并不能真正说明问题。让我们深入下去。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入画面,我们现在可以建立一个叙事,看看谁在做所有的杀戮。从我的观察中,我们可以看到支援和坦克职业与重型[刺客,战士,法师,神射手]之间的良好关系。(你希望你的核心 DPS/Carries 获得击杀,因为它会产生更多的黄金和经验,这应该与胜利相关。简而言之,你不希望你的支援职业从你的核心玩家那里流失可能的资源(然而我们可以在柱状图中间看到一些顽固的坦克和支援,可能是杀贼)

我的下一个问题是查看黄金的平均分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在《英雄联盟》中,一个吸引人(取决于你问的是谁)的游戏特色是,你不会因为死亡而受到惩罚,但当你真的死亡时,你会给你的对手一个优势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

快速观察显示,大买家是战士、射手和刺客(他们通常携带武器,需要花费更多来完成更大的物品集)。高收入者似乎是神枪手/战士,因为他们更频繁地占据外侧右侧。我假设拥有一套专注于伤害的技能可以转化为更高的黄金产量。支撑物和坦克位于坚固的中间区域,这暗示着玩家正在相应地适应他们的角色。

有一点让我印象深刻,那就是法师职业在花费和收入上的频率,这表明这个角色在物品购买上比坦克和支援角色更灵活。理想情况下,你不会希望支持者购买高端物品,因为这毫无意义,而且你也不会希望你的核心玩家浪费时间和金钱去建造像病房这样的实用物品。

总的来说,我做了一些表面模型,但还没有像我希望的那样深入研究数据。下周我将探索建模能力,尝试一些逻辑预测。到目前为止,它只是加强概念,稍微深入一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于我的树莓 pi 3 项目,我已经让相机工作。现在我只需要设置好 OpenCV,就可以开始了!神经网络我们来了!!!

视觉工作的惊人方式

原文:https://towardsdatascience.com/surprising-ways-visual-perception-works-8f624218fba0?source=collection_archive---------10-----------------------

…不像卷积神经网络看到的那样。

“我一直坚信,让人工智能工作的唯一方法是用类似于人脑的方式进行计算……”——杰弗里·辛顿

在一位同事分享他遇到的一些关于感知的令人惊讶的事实之前,我对视觉感知的大多数了解都来自于研究应用于不同领域图像的卷积神经网络(CNN)的变体。

CNN 没有模仿所有人类视觉感知系统的属性,也没有模仿(没关系)。研究是要突破今天的界限,有时是看似很小的一步。

颜色感知是一项空间任务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Adelson’s Checker-shadow³. To most viewers, area A appears to be a darker color than area B (top figure) when in fact both areas have identical color (seen clearly in bottom figure)

想想这些阿德尔森的棋盘格影子人物。对于大多数观众来说,区域 A 看起来比区域 B(上图)更暗,而实际上两个区域的颜色相同(下图清晰可见)。下图与上图相同,只是去掉了 B 区周围的方块,而 B 区保持不变。移除 B 区域周围的方块会改变观察者的感知——A&B 区域看起来颜色相同。颜色感知是一项空间任务。改变一个区域的环境可以改变我们对该区域颜色的感知。

色觉是空间任务的另一个例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Top figure: Small grey squares are perceived to be colored differently when in fact they are same color. Bottom figure: The added context (spatial information) removes the perception of color difference among small grey squares. (Just to be clear, the small grey squares are indeed identically colored in both top & bottom figures.)⁴

认为人类仅仅从一个区域反射的光来感知一个区域的颜色很有诱惑力,但这是错误的。事实上,我们的感知系统也处理来自该区域周围的光,以确定该区域的颜色。

起初,这似乎令人惊讶。但是考虑到照明的光谱组成在我们生活的环境中变化的事实。从一个小区域反射回来的光总是被照明的变化所混淆。**我们的感知系统依赖于对来自邻近区域的光的相对量的理解来忽略照明的变化。因此,即使在变化的光照下,我们也能更准确地感知颜色。**这种观察的技术术语是颜色恒常性

脚注

  • 在本小节中,更准确的说法是指一个区域的反射特性而不是一个区域的颜色。
  • 颜色恒常性指的是观察到颜色在光照发生较大变化时保持不变。⁵ ⁶

每个人都是色盲

同色异谱是指不同光谱成分的光可以给观察者产生完全相同的外观(看起来是相同的颜色)的现象。⁷

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Response curves of the 3 types human cone receptors (denoted S, M, L). Y-axis is response. X-axis is wavelength(nm).⁸

人类眼睛里有三种视锥受体。这三种受体对可见光谱中的短波(S)、中波(M)和长波(L)做出反应。

当光线照射到眼睛时,L、M 和 S 受体分别被长、中和短波长的光子激发。

假设单一波长的光源 x 导致产生与完全相同的 L、M 和 S 响应*,另一个光源包括两个波长 yz 。这两种光源看起来是相同的颜色!这种现象叫做同色异谱*。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Illustration of a light source of single wavelength x causing identical responses as another light source comprising two wavelengths y & z. Only M & L receptor response curves shown for simplicity. ⁹

更具体地说,同色异谱出现在这种情况下是因为:
M-cone 输出为 x = M-cone 输出为 y + M-cone 输出为 z
L-cone 输出为 x = L-cone 输出为 y + L-cone 输出为 z

为了简单起见,省略了 S 受体。此外,为简单起见,仅讨论了 3 种波长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Different spectra perceived as same color. ⁹

同色异谱在日常生活中的一个例子是衣服在不同的光线下会变色(例如,在商店灯光下与阳光相比颜色不同)。在许多情况下,这是因为衣服被带有⁰.同色异谱特征的染料染色

脚注

  • 这个在线实验通过让你调整红色、绿色和蓝色强度来匹配所显示的色块,来确定你对条件配色现象的主观等同点
  • 有些人是四色视者,这意味着他们有 4 种视锥受体,而不是通常的 3 种,这些人比大多数人看到更多的颜色。有些动物,如螳螂虾,拥有 12 种锥状感受器。

咬合印痕

当一个物体在另一个物体后面时,后面的物体被前面的物体遮挡

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

From left to right, increasing impression of a white rectangle occluding black objects.¹¹

左图微弱地给观众留下一个白色物体挡住(遮挡)黑色矩形的印象。咬合的印象在中图中加强,在右图中最强。尽管这些图没有明确显示物体相互遮挡,我们还是感觉到了遮挡。这些遮挡的印象是由于我们的感知系统以独特的方式对待物体边界

感知不是物理现实

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Müller-Lyer illusion. Most viewers perceive the top horizontal line as being longer than the bottom horizontal line. Actually, both lines are the same length.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ebbinghaus illusion or Titchener circles.Most viewers perceive the center circle of the left cluster to be smaller than the center circle of the right cluster. Actually, both center circles are the same size.¹²

上述错觉表明,我们所感知的可能会偏离物理现实。这证明了感知不仅仅是关于进入我们眼睛的视觉阵列(物理光)。感知包括更高层次的过程。

交替感知

考虑以下导致我们的感知在解释之间交替的演示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Necker’s cube. Most viewers alternate between interpretations of these cubes’ orientations.¹³

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Spinning dancer. Center figure: Most viewers flip back and forth between interpretations of the dancer’s spin direction (clockwise or anti-clockwise). Left & right figures have added contours that help the viewer’s perception stabilize on a clockwise and anti-clockwise spin interpretation respectively.¹⁴

当观看这些演示时,注意到你的感知是如何在不同的解释中交替变化的吗?还要注意你如何一次只能持有一种解释(而不是同时感知两种解释)?这些观察表明感知伴随着类似于选择的认知过程。

脚注
多稳态感知双稳态感知是这种现象的专业术语。

来自上述假设的光线

下面的论证表明,我们的感知偏向于相信光来自上方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

To most viewers, the left sphere appears convex and right sphere appears concave. But the right sphere is merely a 180 degree rotation of the left sphere.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

To most viewers, the left crater appears concave and the right crater appears convex. But the right crater is merely the image of the left crater rotated 180 degrees.¹⁵

仅仅通过旋转上面的图像就获得了不同的解释,这是因为我们的感知偏向于光来自上方的信念。这种偏见是由我们适应环境统计规律的感知系统建立起来的。

脚注
更准确地说,这种偏置假设的光线方向是“左上”而不是正上方。这与我们是左撇子还是右撇子无关。⁶

结论

这篇文章中提到的惊喜源于我们的感知系统已经进化到适应我们的环境。进化/适应(类似于机器学习)已经产生了一些怪癖,可以通过研究这些怪癖来更好地理解人类感知并改进感知的现代实现(例如卷积神经网络)。

  1. 罗杰斯,布莱恩(2017)。观感:一段很短的介绍。牛津大学出版社,2017 年
  2. https://www . utoronto . ca/news/u-t-computer-scientist-takes-international-prize-grounding-work-ai
  3. 爱德华·阿德尔森(2005 年)。【方格阴影错觉】
  4. 来源https://www . ted . com/talks/beau _ lotto _ optical _ imaginations _ show _ how _ we _ see
  5. 贾德博士(1940 年)。彩色照明下表面颜色的色调饱和度和亮度。 JOSA30 (1),2–32。
  6. E.Hering,Grundzuge der Lehre vom Lichtsinn,Graefe-Samischs《第十二届妇女大会手册》(1905 年和 1907 年)。
  7. 桑顿 W. A. (1998)。同色异谱干扰色彩空间有多强。颜色研究&应用:由国际社会颜色委员会、颜色组织(英国)、加拿大颜色学会、日本颜色科学协会、荷兰颜色研究学会、瑞典颜色中心基金会、澳大利亚颜色学会、法国颜色中心 23(6),402–407 批准。
  8. 来源 https://en.wikipedia.org/wiki/Cone_cell
  9. 改编自http://Jim-stone . staff . shef . AC . uk/psy 305/Lectures _ pdf/L10 _ colour theory _ v4 . pdf
  10. https://blog.1000bulbs.com/home/what-is-metamerism
  11. Gillam 和 p . j . Marlow(2014 年)。比较 Kanizsa 正方形和线性边缘对齐的主观轮廓(“纽约泰坦尼克号”图)。感知43 (9),977–988。
  12. 来源https://www . research gate . net/figure/The-Ebbinghaus-Illusion _ fig 1 _ 310505100
  13. 洛杉矶内克(1832 年)。“观察在瑞士看到的一些显著的光学现象;以及在观察晶体或几何立体图形时出现的光学现象”。伦敦和爱丁堡哲学杂志和科学杂志1(5):329–337
  14. 来源https://imgur.com/gallery/kcaw8OI。最初由网页设计师 Kaya hara Nobuyuki(2003)http://www.procreo.jp/labo.html
  15. 来源https://en.wikipedia.org/wiki/Crater_illusion
  16. 马马西安,p .&古彻,R. (2001 年)。照明位置的先验知识。认知81 (1),B1-B9。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source https://www.deviantart.com/vintagexxrose/art/evil-eye-329099696

理想的工作生活平衡是怎样的?

原文:https://towardsdatascience.com/survey-says-this-is-the-ideal-work-life-balance-e7ae22627042?source=collection_archive---------3-----------------------

时间和金钱哪个更重要?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一份工作

每天,全世界有数百万人去找一份叫做工作的工作。前提很简单。给一家公司你的时间、劳动和智力,他们会给你一种叫做钱的东西。然后你可以用这些钱去购买生存所需的东西:食物、住所、动感单车课程等等。

我最近读了一篇文章,说平均每周工作时间是 47 小时。我想起了大三的一堂英语课,老师让全班同学在五份工作中做出选择:

  1. 每周工作 40 小时,年薪 4 万美元
  2. 每周工作 50 小时,年薪 5 万美元
  3. 每周工作 60 小时,年薪 6 万美元
  4. 每周工作 70 小时,年薪 7 万美元
  5. 每周工作 80 小时,年薪 8 万美元

尽管我的班级很小——只有 12 个人——但我是唯一一个想每周工作 80 小时,年薪 8 万美元的人。当时,我很困惑——难道我的同学不明白,如果他们赚了更多的钱,他们就可以买更多的东西吗?

从那以后,我意识到赚更多的钱通常是以花更少的时间为代价的。尽管如此,由于相对年轻,现在有了选择,我的一部分仍然倾向于选择第五个选项,因为,说实话,我还能利用空闲时间做什么呢?

但是我想知道其他人是否也有这种感觉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

调查时间到了

所以我发出了一份调查。

我在网上招募了 411 人,女性 260 人,男性 151 人。

我让参与者想象他们正在他们目前居住的城市或城镇开始一份新的工作。他们可以在 5 份他们喜欢但不喜欢的几乎相同的工作中做出选择。我向他们展示了我的英语老师提供的五小时工资选项,并告诉他们,他们选择的工作将是他们在可预见的未来会得到的相同工资。

我首先让参与者选择一份工作,假设他们是单身。为了混淆视听,我让他们选择一份工作,假设他们的丈夫每周工作 50 小时,年薪 6 万美元,但没有孩子(现在或可预见的将来)。

那么大家是怎么想的?

结果如下:

不管婚姻状况如何,大多数人都希望工作时间更短,收入更少。

无论是单身还是已婚,超过四分之三的人表示,他们更愿意每周工作 40 或 50 个小时,年薪 4 万或 5 万美元。很明显,我想把醒着的所有时间都花在工作上的愿望并不是大多数人都有的想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果人们更年轻,他们更愿意工作更长时间。

我把人们分成三个年龄组——20 到 39 岁,40 到 59 岁,60 到 79 岁。最年轻年龄段的人总是愿意比其他两个年龄段的人工作更长时间。在单一情景中,31.1%的 20-39 岁的人选择每周工作 60 小时以上,而 40-59 岁和 60-79 岁的人分别为 19.5%和 11.5%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当人们结婚后,选择每周工作 60 小时以上的 20-39 岁人群的比例下降到 25.2%。然而,这仍然高于其他两个年龄组。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

男性选择工作更长时间。虽然女性的工作偏好在婚后保持不变,但男性的偏好向中间靠拢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与女性相比,更多的男性更喜欢每周工作 60 小时以上。不管他们是单身(32.4%的男性对 21.3%的女性)还是已婚(29.2%的男性对 18.2%的女性),情况都是如此。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结婚后,女性的反应略有变化,而最初选择 40 和 80 小时工作周的男性倾向于 50 和 60 小时工作周。很明显,有些人想通过工作来躲避他们的配偶(这是个笑话)。实际上,有些男人可能想多工作,因为他们不想挣得比配偶少,而另一些男人可能只是想在经济上多支持他们的配偶,

我梦想工作与生活的平衡

大多数人都不想像我高中时那样拼命工作。我不知道工作 80 小时是什么感觉。工作几年后,我梦想着减少工作量,即使这意味着减薪。这就是我决定研究工作与生活平衡的原因:它意味着什么,它是否实际存在,以及如何实现它。

你可能喜欢的其他文章

如果你喜欢这篇文章,请访问LateNightFroyo.com,阅读关于爱情、生活等话题的话题。

什么时候去参加聚会比较合适?

如何走出去?

多年轻才算年轻到不能约会?

探索 Python 中客户流失的生存分析

原文:https://towardsdatascience.com/survival-analysis-in-python-a-model-for-customer-churn-e737c5242822?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生存分析是指一套统计技术,用于推断*、【寿命】、或事件时间序列,而无需观察训练集中每个受试者感兴趣的事件。感兴趣的事件有时被称为受试者的【死亡】*,因为这些工具最初被用于在临床试验中分析药物治疗对患者存活率的影响。

同时,客户流失(定义为 c 客户保持的反义词)是许多面向客户的企业渴望最小化的关键成本。没有预测哪些客户会流失的银弹方法(在如何定义客户是否已经流失非订阅产品时,必须小心谨慎),但是生存分析为探索时间-事件系列提供了有用的工具。

为什么我们不能用 OLS 线性回归呢?

OLS 通过绘制最小化误差平方和的回归线来工作。然而,对于未观察到的数据,误差项是未知的,因此不可能使这些值最小化。

简单地将审查的日期作为所有受试者已知的有效最后一天,或者更糟的是,删除所有被审查的受试者会使我们的结果产生偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Not all deaths have been observed by t1, the time of observation. Image by author.

在上图中,U002 从损失到跟进都经过了审查(例如,可能是由于账户上的一个未解决的技术问题导致客户在数据提取时的状态未知),而 U003 和 U004 经过了审查,因为它们是当前客户。截止到 t1 ,只有 U001 和 U005 都观察到了出生和死亡。如图所示,删除未观察到的数据会低估客户的寿命,并使我们的结果产生偏差。

生存分析处理事件审查完美无缺。被审查的客户,是死亡没有被观察到的客户。发生这种情况的主要原因是在观察时客户的生命周期尚未结束。(注意:在临床试验中,失访或退出研究的患者也被视为审查对象。)

卡普兰-迈耶曲线

对于每个主体(或顾客,或用户)只能有一个“出生”(注册、激活或签约)和一个“死亡”(不管是否被观察到)的任何问题,第一个也是最好的起点是卡普兰-迈耶曲线。这将允许我们估计一个或多个队列的“生存函数”,这是生存分析中最常用的统计技术之一。

生存分析可以作为一种探索性的工具,用来比较不同群体、不同客户群或不同客户原型之间的客户寿命差异。在 Python 中,我们可以使用 Cam Davidson-Pilon 的生命线库来开始。

以这个 IBM Watson telco 客户演示数据集为例。通过对单条电话线与多条电话线的二元特征进行分段,我们得到以下 Kaplan-Meier 曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Customers with one phone line have a steeper survival curve initially, but by ~4 years 3 months customer lifetime the error bars make the two groups indistinguishable. Image generated using matplotlib by author.

我们可以看到,在只有一条电话线的用户中,有 1/4 的用户在第 25 个月时发生了变化。相比之下,在拥有多条电话线路的用户中,1/4 的用户在 43 个月前流失,相差 18 个月(额外 1.5 年的收入!)

相关性不是因果关系,因此这张图本身不能被认为是“可操作的”。然而,我们可能会看到这一点,并开始怀疑一些可能性,如拥有多条电话线的客户更“固定”,因此比单电话线用户更不容易流失。另一方面,也许更忠诚的客户首先倾向于选择多条电话线。

谁应该得到更多的投资?如果这两个集团的利润相当,那么花更多的钱来让单线电话用户满意可能是值得的,因为他们目前倾向于更快地流失。或者,一个实验性设计可以揭示一些激励措施可以使*所有客户、*的生命周期翻倍,并且由于多线路用户的生命周期最初往往更长,这种倍增效应实际上会为该细分市场带来更多利润。

如果没有更多的背景,以及可能的实验设计,我们无法确定。

卡普兰-迈耶曲线的利弊

优点:

  • 需要最少的功能集。Kaplan-Meier 只需要事件发生的时间(死亡或审查)和出生与事件之间的生命周期。
  • 许多时间序列分析很难实现。卡普兰-迈耶只需要所有的事件都发生在感兴趣的同一时间段内
  • 自动处理类别不平衡(死亡与审查事件的任何比例都可以)
  • 因为它是一种非参数方法,所以很少对数据的基本分布进行假设

缺点:

  • 无法估计感兴趣的生存-预测关系差异的大小(无风险比或相对风险)
  • 无法在事件发生时间研究中同时考虑每个受试者的多个因素,也无法控制混杂因素
  • 假设删截和存活之间是独立的,这意味着在时间【that,那些已经删截的人应该和那些没有删截的人有相同的预后。
  • 因为它是一个非参数模型,在底层数据分布已知的问题上,它不如竞争技术有效或准确

现在自己试试吧!

要查看我是如何制作这个卡普兰-迈耶图的,并开始你自己的生存分析,从我的 Github 账户下载 jupyter 笔记本

Lauren Oldja 是纽约布鲁克林的一名数据科学家。

最快的生存者

原文:https://towardsdatascience.com/survival-of-the-fastest-2270ee6d31a6?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo Credit: Martyn Goddard

“即使你有最好的产品,如果你是第三个推出你的产品的人,那么你也只是损失了该产品潜在价值的 50%。”—辉瑞副总裁兼总经理 Peter Stevenson

曾经需要几十年的市场变化现在只需几周甚至几个月就能发生。自动化、分析和人工智能(AI)的不可阻挡的崛起正在加速以前所未有的速度开展业务、创造价值、做出决策、满足客户期望,并在竞争对手之前将产品和服务推向市场。很简单,速度决定了你是破坏还是被破坏,因为在这个快节奏的机器时代,不领先就意味着落后。如今,许多标准普尔 500 公司的股东报告中充斥着“速度”、“快”及其同义词,这并非巧合。

10 年前,随着全球化无情地压低单位成本,企业不得不学会以“中国价格”竞争。今天,你的企业需要通过适应“谷歌价格”和“谷歌速度”来做出另一个改变。随着科技企业家利用数字平台并迅速积累数十亿美元的财富,从而挑战传统的商业模式和行业,任何市场的准入门槛都大大降低了。考虑以下几点:

在我们对 500 名 IT 经理的未来工作调查中,报告的第一个问题是他们的业务太慢,无法有效地利用数字化。

一项新的研究证实,许多零售商在创造竞争优势和新收入来源的领域投资过于缓慢,这使他们面临被行动更快、更具创新性的零售企业超越的风险。

数据是新的石油,但公司充斥着数据。如果你的决策周期需要几个月,即使是关键任务项目,你也无法赶上游戏的速度。使用高级分析和机器学习的公司成为前四分之一财务表现者的可能性是前者的两倍,执行有效决策的可能性是后者的三倍。

一些公司已经在速度要求上展开竞争。他们正在转变行业商业模式,挑战现状,采取行动,承担风险,永远改变游戏规则。例子包括:

Reliance Jio 在印度的成功仅用了 170 天就达到了 1 亿用户,相当于每天每秒 7 个用户,迫使竞争对手降低了价格。

对于阿迪达斯,来说,速度要求围绕着“显著缩短上市时间并与客户保持同步。”为了实现这一目标,阿迪达斯正在彻底重塑其商业模式,从产品系列规划到产品创新、采购、供应链、上市和销售。它的目标是到 2020 年,50%的销售额来自重塑后的业务

ANZ 银行正在利用人工智能实现后台自动化,以缩短无担保和个人贷款审批的上市时间。据该银行的首席技术官称,由于自动化程度的提高,已经减少了 1,000 小时的后台活动。

西班牙电信巨头 telefónica正在改变其业务 DNA 以创建一个全数字、数据驱动的身份。该公司在全球范围内彻底改革了其核心业务流程和系统,目标是转向能够对快速变化的业务环境做出反应的实时业务模式。

荷兰银行 ING 已经设立了一个转型“作战室”来全面了解所有项目的状态,并快速解决问题。目标是加速沟通和决策。

更快的上市时间是竞争的需要,这种压力不会很快消失。商业新陈代谢的速度需要提高。当银行意识到与金融科技初创公司对抗毫无意义时,它们就与它们合作。如今,许多大银行正在向初创公司投入数百万美元。

那么,在这个新的、大胆的世界里,组织如何才能加快速度,赢得胜利呢?你不必一下子就想明白。你只需要愿意开始并做出成功所需的组织变革。在一系列较小的任务中取得成功,远比在试图像大爆炸一样解决转型计划时遭遇惨败更令人向往。设定方向,在沙地上画一条线,明白那条线会动。提前花时间为以后的加速做准备没有错。一个企业成功前进的速度取决于它的起步状态,即它对变化的准备程度及其速度容忍度。

**一句话:**快速应对一切已经成为一项战略要务,未来几年最成功的公司将是那些行动最快的公司。然而,并不是每家公司都能以同样的速度前进,因为在新机器时代,每家公司都有自己的抱负和优先事项。你必须找到你真正的北方,为此你可以参考我们的速度框架,我们开发这个框架是为了帮助领导者找到他们业务的当前速度和他们需要设定的目标来加快步伐。

有这么多的利害关系,公司不能放松油门。

Manish 领导 Cognizant 亚太和中东未来工作中心。作为一名受人尊敬的演说家和思想家,Manish 用他发人深省的研究和咨询技巧引导许多财富 500 强公司走向工作的未来。他住在印度新德里,可以通过 联系到 manish.bahl@cognizant.com|https://www.linkedin.com/in/manishbahl/| @ mbahl

SVM 和内核 SVM

原文:https://towardsdatascience.com/svm-and-kernel-svm-fed02bef1200?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

在本文中,您将了解到 SVM支持向量机,这是最流行的人工智能算法之一(它是十大人工智能算法之一),以及关于内核技巧,它处理非线性更高维度。我们将触及像超平面、拉格朗日乘数这样的主题,我们将有视觉示例代码示例(类似于在 KNN 章节中使用的代码示例)来更好地理解这个非常重要的算法。

SVM 解释道

支持向量机是一种监督学习算法,主要用于分类,但也可用于回归。主要思想是基于标记的数据(训练数据),该算法试图找到可用于分类新数据点的最佳超平面。在二维中,超平面是一条简单的直线。

通常学习算法试图学习一个类的最常见的特征(一个类与另一个类的区别),并且分类是基于那些学习到的代表性特征(因此分类是基于类之间的差异)。SVM 的工作方式正好相反。它找到类之间最相似的例子。这些将是支持向量

作为一个例子,让我们考虑两类,苹果和柠檬。

其他算法将学习苹果和柠檬最明显、最有代表性的特征,比如苹果是绿色的、圆形的,而柠檬是黄色的、椭圆形的。

相比之下,SVM 将寻找与柠檬非常相似的苹果,例如黄色椭圆形的苹果。这将是一个支持向量。另一个支持向量将是一个类似于苹果的柠檬(绿色和圆形)。因此其他算法学习差异SVM 学习相似性

如果我们想象一下上面 2D 的例子,我们会得到这样的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们从左到右,所有的例子将被归类为苹果,直到我们到达黄色的苹果。从这一点来看,新示例是苹果的置信度下降,而柠檬类的置信度增加。当柠檬类置信度变得大于苹果类置信度时,新示例将被分类为柠檬(介于黄色苹果和绿色柠檬之间)。

基于这些支持向量,该算法试图找到分隔类别的最佳超平面**。在 2D,超平面是一条线,所以它看起来像这样:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好的,但是为什么我把蓝色的边界画成上面图片 **的样子?**我也可以画出这样的界限:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,我们有无限的可能性来画出决策边界。那么如何才能找到最优的呢?

寻找最优超平面

直觉上,最佳线是远离苹果和柠檬示例的线**(具有最大的余量)。为了获得最优解,我们必须以两种方式最大化利润(如果我们有多个类别,那么我们必须考虑每个类别来最大化利润)。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,如果我们将上面的图片与下面的图片进行比较,我们可以很容易地观察到,第一个是最优超平面(线),第二个是次优解,因为边缘要短得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为我们想要最大化考虑到所有类的边距,而不是为每个类使用一个边距,我们使用考虑到所有类的“全局”边距、。该边距看起来像下图中的紫色线:****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个边距与边界的正交**,与支持向量的等距。**

那么向量在哪里呢?每个计算(计算距离和最佳超平面)都在矢量空间中进行,因此每个数据点都被视为一个矢量。空间尺寸由示例的属性数量定义。为了理解背后的数学,请阅读这个简单的向量、超平面和优化的数学描述: SVM 简洁地

总之,支持向量定义超平面的位置和边缘的数据点。我们称它们为“支持”向量**,因为这些是类的代表性数据点,如果我们移动它们中的一个,位置和/或边距将改变。移动其他数据点不会影响超平面的边缘或位置。**

为了进行分类,我们不需要所有的训练数据点(像在 KNN 的情况下),我们只需要保存支持向量。在最坏的情况下,所有的点都将是支持向量,但这是非常罕见的,如果发生这种情况,那么你应该检查你的模型的错误或缺陷。

所以基本上学习等同于寻找具有最佳余量的超平面**,所以这是一个简单的优化问题。**

基本步骤

SVM 的基本步骤是:

  1. 选择两个超平面**(在 2D),这两个超平面将数据分开,它们之间没有点(红线)**
  2. 最大化他们的距离(边距)
  3. 平均线(这里是两条红线中间的线)将是**决策边界**

这很好也很容易,但是找到最佳余量,优化问题不是微不足道的(在 2D 很容易,当我们只有两个属性时,但是如果我们有 N 个维度,N 是一个非常大的数字呢)

为了解决优化问题,我们使用拉格朗日乘数**。为了理解这个技巧,你可以阅读下面两篇文章:二元 Langrange 乘数一个关于 Langrange 乘数为什么工作的简单解释。**

到目前为止,我们有线性可分的数据,所以我们可以使用一条线作为类边界。但是如果我们不得不处理非线性数据集呢?

非线性数据集的 SVM

非线性数据的一个例子是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这种情况下,我们找不到一条直线来区分苹果和柠檬。那么如何才能解决这个问题呢。我们将使用内核技巧!****

基本思想是,当一个数据集在当前维度上不可分时,添加另一个维度,也许这样数据将是可分的。想一想,上面的例子是在 2D,它是不可分的,但也许在 3D 中苹果和柠檬之间有一个间隙,也许有一个等级差异,所以柠檬在第一层,苹果在第二层。在这种情况下,我们可以很容易地在 level 1 和 level 2 之间绘制一个分离超平面(在 3D 中,超平面是一个平面)。

映射到更高维度

为了解决这个问题,我们不应该只是盲目地增加另一个维度**,我们应该转换空间,以便我们有意识地产生这种层次差异。**

从 2D 到 3D 的映射

让我们假设我们增加了另一个叫做 X3 的维度。另一个重要的转变是,在新的维度中,使用公式 x1 + x2 来组织点。

如果我们画出由 x + y 公式定义的平面,我们会得到这样的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们必须将苹果和柠檬(只是简单的点)映射到这个新空间。仔细想想,我们做了什么?我们刚刚使用了一个变换,其中我们基于距离添加了级别。如果你在原点,那么这些点将在最低层。当我们远离原点时,这意味着我们正在爬山**(从平面的中心向边缘移动),因此点的高度会更高。现在如果我们考虑原点是中心的柠檬,我们会得到这样的东西:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们可以很容易地将这两个类分开。这些转换被称为内核**。常见的核有:多项式核、高斯核、径向基函数(RBF)、拉普拉斯 RBF 核、Sigmoid 核、Anove RBF 核等(参见核函数或更详细的描述机器学习核)。**

从 1D 到 2D 的测绘

另一个在 2D 更容易的例子是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在使用了内核和所有的转换之后,我们将得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以在转换之后,我们可以很容易地用一行代码来划分这两个类。

在现实生活中,我们不会有一条简单的直线,但我们会有很多曲线和高维数。在某些情况下,我们不会有两个超平面来分隔数据,它们之间没有点,所以我们需要一些权衡,对异常值的容忍**。幸运的是,SVM 算法有一个所谓的正则化参数来配置权衡并容忍异常值。**

调谐参数

正如我们在上一节中看到的,选择正确的内核至关重要**,因为如果转换不正确,那么模型的结果会非常糟糕。根据经验,总是检查你是否有线性数据,在这种情况下总是使用线性 SVM (线性内核)。线性 SVM 是一个参数模型,但 RBF 核 SVM 不是,因此后者的复杂性随着训练集的大小而增长。不仅训练一个 RBF 核 SVM 更昂贵,而且你还必须保持核矩阵在周围,并且投影 这个“无限的”高维空间中,在预测过程中,数据变成线性可分的也更昂贵。此外,您有更多的超参数来调整,因此模型选择也更加昂贵!最后,对复杂的模型进行过度拟合要容易得多!**

正规化

正则化参数(python 中的称之为 C )告诉 SVM 优化你想要避免多少漏分类每个训练示例。

如果 C 比 ,那么优化会选择更小的超平面,所以训练数据的漏检率会更低**。**

另一方面,如果 C 比 ,那么的裕量将会大**,即使有将会漏分类训练数据的例子。这显示在以下两个图表中:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你在图中看到的,当 C 较低时,即使两个苹果被归类为柠檬,边距也较高(因此我们没有太多曲线,直线也没有严格遵循数据点)。当 C 高时,边界充满曲线,并且所有训练数据被正确分类。不要忘记,即使所有的训练数据都被正确分类,这并不意味着增加 C 将总是增加精度(因为过拟合)。

微克

下一个重要参数是伽马**。gamma 参数定义了单个训练示例的影响达到的程度。这意味着高伽玛将只考虑靠近可信超平面的点**,而低伽玛 将考虑距离较远的点**。******

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如您所看到的,减少 Gamma 将导致寻找正确的超平面将考虑距离更远的点,因此将使用越来越多的点(绿线表示在寻找最佳超平面时考虑了哪些点)。

边缘

最后一个参数是余量**。我们已经讨论过利润率,更高的利润率产生更好的模型,因此更好的分类(或预测)。页边距应始终最大化**。****

使用 Python 的 SVM 示例

在本例中,我们将使用 Social_Networks_Ads.csv 文件,该文件与我们在上一篇文章中使用的文件相同,参见 KNN 使用 Python 的示例

在这个例子中,我将只写下 SVM 和 KNN 之间的差异,因为我不想在每篇文章中重复我自己!如果你想要完整的解释关于我们如何读取数据集,我们如何解析和分割我们的数据,或者我们如何评估或绘制决策边界,那么请阅读上一章的代码示例 ( KNN )!

因为 sklearn 库是一个写得非常好、非常有用的 Python 库,所以我们没有太多代码需要修改。唯一的区别是我们必须从 sklearn.svm 中导入 SVC 类(在 sklearn 中 SVC = SVM ),而不是从 sklearn.neighbors 中导入 KNeighborsClassifier 类

**# Fitting SVM to the Training set
from sklearn.svm import SVC
classifier = SVC(kernel = 'rbf', C = 0.1, gamma = 0.1)
classifier.fit(X_train, y_train)**

导入 SVC 后,我们可以使用预定义的构造函数创建新模型。这个构造函数有很多参数,但我将只描述最重要的参数,大多数时候你不会用到其他参数。

最重要的参数是:

  1. ****内核:要使用的内核类型。最常见的内核是 rbf (这是默认值)、 poly 或者 sigmoid ,但是你也可以创建自己的内核。
  2. C: 这是在调整参数部分描述的正则化参数****
  3. ****伽玛:这也在调谐参数一节中描述
  4. 度数:仅当选择的内核是 poly 时使用并设置 polinom 的度数
  5. ****概率:这是一个布尔参数,如果为真,那么模型将为每个预测返回属于响应变量的每个类别的概率向量。所以基本上它会给你每个预测的置信度。
  6. 收缩:这表示您是否想要一个收缩启发式算法用于您的 SVM 优化,该算法用于顺序最小优化。它的默认值是真的,一个如果你没有很好的理由,请不要把这个值改成假的,因为缩小会大大提高你的性能**,对于非常小的损失而言精度在大多数情况下。**

现在让我们看看运行这段代码的输出。训练集的决策界限如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们在调谐参数部分所见,因为 C 值很小(0.1),所以判定边界是平滑的。

现在,如果我们将 C 从 0.1 增加到 100,决策边界中将有更多曲线:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们使用 C=0.1,但现在我们将 Gamma 从 0.1 增加到 10,会发生什么?让我们看看!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里发生了什么?为什么我们会有这么差的模型?正如你在调整参数部分看到的,高伽玛意味着当计算似是而非的超平面时,我们只考虑靠近的点。现在,因为绿色点密度仅在所选绿色区域中较高,在该区域中,这些点足够接近似是而非的超平面,所以选择了这些超平面。小心 gamma 参数,因为如果将其设置为非常高的值(什么是“非常高的值”取决于数据点的密度),这可能会对模型的结果产生非常坏的影响。

对于此示例,C 和 Gamma 的最佳值分别为 1.0 和 1.0。现在,如果我们在测试集上运行我们的模型,我们将得到下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

混淆矩阵看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,我们只有 3 个假阳性4 个假阴性。该模型的准确率93% 这是一个非常好的结果,我们获得了比使用 KNN (准确率为 80%)更好的分数。

注意:精确度不是 ML 中使用的唯一指标,也不是评估模型的最佳指标,因为精确度悖论。为了简单起见,我们使用这个指标,但是稍后,在章节评估人工智能算法的指标中,我们将讨论准确性悖论,并且我将展示该领域中使用的其他非常流行的指标。

结论

在这篇文章中,我们看到了一个非常流行和强大的监督学习算法,支持向量机。我们已经学习了的基本思想**,什么是超平面,什么是支持向量以及它们为什么如此重要。我们也看到了许多视觉表现,这有助于我们更好地理解所有的概念。**

我们接触的另一个重要话题是内核技巧**,它帮助我们解决非线性问题。**

为了有一个更好的模型,我们看到了调整算法的技术。在文章的最后,我们有一个用 Python 编写的代码示例,它向我们展示了如何使用 KNN 算法。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我真的很喜欢咖啡,因为它让我有精力写更多的文章。

如果你喜欢这篇文章,那么你可以请我喝杯咖啡来表达你的欣赏和支持!

作为最后的想法,我想给出一些的优点&缺点和一些流行的用例**。**

****成为媒介上的作家:https://czakozoltan08.medium.com/membership

赞成的意见

  1. SVN 可能非常有效,因为它只使用了训练数据的子集,只使用了支持向量
  2. 较小的数据集、非线性数据集高维空间上运行良好
  3. 维数大于样本数的情况下非常有效****
  4. 它可以有高精度**,有时甚至可以比神经网络表现得更好**
  5. 对过度配合非常敏感

骗局

  1. 当我们有大量数据集时,训练时间很长
  2. 当数据集有更多的噪声**(即目标类别重叠)时,SVM 表现不佳**

流行的使用案例

  1. 文本分类
  2. 检测垃圾邮件
  3. 情感分析
  4. 基于方面的识别
  5. 基于方面的识别
  6. 手写数字识别

参考

  1. 了解 SVM
  2. SVM:一个简单的解释
  3. SVM:理解数学
  4. SVM 理论
  5. Udemy:机器学习 A-Z

符号回归和遗传编程

原文:https://towardsdatascience.com/symbolic-regression-and-genetic-programming-8aed39e7f030?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

符号回归和遗传编程远未成为主流的机器学习技术。然而,他们绝对值得相当多的关注。这篇文章是一个温和而非正式的介绍。

动机

想象一下,有人让你在不使用矩阵或求和符号的情况下,写下单输出神经网络的正向传递。啊?为了使事情变得简单,你可能会想到最普通的神经网络:具有一个隐藏层的多层感知器。所以在矩阵符号中,它看起来像这样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好的,为了去掉矩阵符号,你需要决定输入和隐藏层的大小。假设有 3 个输入特征和 4 个隐藏节点。所以你的矩阵是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后也是最乏味的一步是写出所有的东西,没有任何矩阵和求和符号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管这种表述非常不切实际,但它清楚地表明了一件重要的事情:预测只是对输入要素应用基本数学运算的结果。具体来说,这些操作是加法、乘法和合成。换句话说,我们把一堆代表数学运算的符号表达式组合起来,希望得到正确的预测。

这是一个转折。利用神经网络,人们试图找到所有的 wb 的最优值,使得某个损失函数最小化。然而,另一个想法是修复所有的 wb ,只改变符号表达式 iteself!或者换句话说,改变逼近器的函数形式。这正是符号回归的意义所在。改变自然可以有两种形式。您可以添加新的符号表达式(数学运算)或删除一些现有的符号表达式。

但是怎么做呢?

与优化权重不同,对于符号回归,以可以使用梯度下降技术的方式将问题公式化并不是微不足道的。但是,很容易评估单个表达式的性能。那么我们如何想出这种实现低损耗的神奇表达呢?进入遗传编程

遗传编程(GP)和更臭名昭著的遗传算法(GA)之间的区别在于,GP 将解表示为树,而 GA 表示为字符串。使用树表示的主要原因是能够捕捉解决方案的内在结构。这与我们的应用非常相关,因为每个数学表达式都可以通过树来表示。参见下面的例子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以基于回归度量(如均方误差或平均绝对误差)为每棵树分配适合度分数。对于 GP,还需要决定如何执行交叉和变异。有几种不同的方法可以做到这一点,但让我们只描述一种简单的方法。

对于突变,最简单的程序是所谓的点突变。树的随机节点被选择和改变。需要注意节点类型,因为一个节点可以表示不同的操作(一元、二元、…)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交叉使用 2 个具有高适应值的解决方案,并尝试将它们结合起来。标准的方法是从捐献者那里得到一个随机的子树,并把它插入到父树的随机子树中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

gplearn

当然,你可以自己编码所有的东西,但是已经有一些开源包关注这个主题了。我能找到的最好的一个叫做 gplearn 。它最大的优点是它遵循了 scikit-learn API ( fittransform / predict方法)。

它实现了两个主要的算法:回归和转换。对于回归,适应度函数只是一个度量,如均方误差或平均绝对误差。然而,transformer 通过尝试最大化等于相关性(spearman 或 pearson)的适应度函数,从原始特征中创建新特征。

一旦安装完毕,用户可以通过属性_program检查最佳解决方案。请注意,有多个超参数可以定制演进的所有主要部分。我鼓励你阅读官方文档并熟悉其中的一些,特别是如果你想防止像过度拟合这样的事情发生,或者如果你只是想寻求加速。

脸书度量数据集

为了说明 gplearn 在实践中是如何工作的,让我们从 UCI 机器学习库中取一个名为脸书度量的玩具数据集(链接)。它是根据一个未公开的化妆品品牌脸书·佩奇设计的。参见下面感兴趣的属性。

目标Total Interactions是一个帖子发布后获得的所有赞、分享和评论的总和。我们应用一些预处理,然后训练符号回归器。为了简单起见,只启用默认的二元运算:addsubmuldiv。20 代之后最合适的解决方案如下。

add(add(mul(Post Hour,Post Month),sub(payed _ 1.0,Category_3)),add(add(mul(Post Hour,Post Weekday),div(mul(Post Hour,Post Month),sub(Category_3,Category_1)),mul(add(Post Weekday,Category_1),add(Type_Photo,Post Month))),add(sub(payed _ 1.0,Category_3),sub(Type_Status,payed _ 1.0)))

显然,这种文本格式对于可视化来说不是最佳的。请参见下面的树形图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯,这到底是什么意思?我如何最大化互动?嗯,这并不重要。符号回归的输出很难理解但是加油,真的很酷!

如果你想看实施细节和与标准回归的比较,请随意查看笔记本这里

附言(同 postscript);警官(police sergeant)

我第一次接触符号回归是在 Kaggle ( example_1example_2 )上浏览公共内核的时候。期待一些精心制作的代码片段,当我看到这些可怕的公式设法在官方排行榜上获得非常体面的分数时,我忍不住笑了。

参考

  1. 约翰·科扎,《基因编程是通过自然选择为计算机编程的一种方式》统计与计算 4,第 2 期(1994):87–112
  2. (莫罗等人,2016 年)莫罗,s .,丽塔,p .,&瓦拉,B. (2016 年)。预测社交媒体性能指标和评估对品牌建设的影响:一种数据挖掘方法。商业研究杂志,69(9),3341–3351。
  3. gplearn 文档

**更新:**2018 年 7 月 2 日

原载于 2018 年 7 月 2 日jank repl . github . io

符号拼写与 BK 树:模糊字符串搜索和拼写检查快 100 倍

原文:https://towardsdatascience.com/symspell-vs-bk-tree-100x-faster-fuzzy-string-search-spell-checking-c4f10d80a078?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传统智慧和教科书说 BK 树特别适合拼写纠正和模糊字符串搜索。但这真的成立吗?

在我的博客上关于拼写纠正的评论中,BK-tree 也被认为是一种优秀的模糊搜索数据结构。

所以我决定将 BK-tree 与其他选项进行比较和基准测试。

近似字符串搜索算法

近似字符串搜索允许在字符串列表中查找一个字符串,并根据特定的字符串度量返回那些相近的字符串。

有许多不同的字符串度量,如 LevenshteinDamerau-LevenshteinHamming distanceJaro-WinklerStrike match

我将比较四种不同的算法,根据 Damerau-Levenshtein 字符串度量在最大编辑距离内查找字符串列表中的一个字符串。

对于拼写校正,可以使用与每个术语相关联的额外的词频来进一步对结果(建议)进行分类和过滤。

还可以实现一种 加权编辑距离 ,给予在键盘布局上彼此接近或发音相似的对以更高的优先级(例如Soundex或其他 语音算法 ,其识别相同发音的不同拼写)。同时还有一个 SymSpell 实现带权重的 Damerau-Levenshtein 编辑距离/keyboard-distance 这个带权重的编辑距离超出了本文的重点 。它可以作为一个后处理步骤添加到最近似的字符串搜索算法中,只需根据您的偏好对由 Damerau-Levenshtein 编辑距离过滤的初步结果重新进行优先级排序/排序。

所有算法都努力实现相同的目标,以实现较短的查找时间:减少查找和比较(在单词和/或人工生成的候选词之间),可能进一步减少完整编辑距离计算的数量,最后减少编辑距离计算本身的计算复杂性,同时不损害其准确性。

我想要比较和评测的四种不同算法是:

莱文斯坦编辑距离变化

所有四种算法都使用 Levenshtein 编辑距离的导数。
有三种不同的 levenshtein 距离:

  • Levenshtein 距离:相邻换位(AC- > CA)计为 2 次编辑。三角形不等式确实成立
  • 受限 Damerau-Levenshtein 距离(最优字符串对齐算法):相邻换位计为 1 次编辑,但子字符串不能编辑多次:ed(“CA “,” ABC”) =3。三角形不等式不成立
  • 真实 Damerau-Levenshtein 距离:相邻的变调算作 1 次编辑,子串可以编辑多次:ed(“CA “,” ABC”) =2。三角形不等式确实成立

Norvig 的算法正在使用真实 Damerau-Levenshtein 编辑距离。它可以被修改以使用 Levenshtein 距离。

Xenopax 的 BK 树 实现正在使用 Levenshtein 编辑距离。可以对其进行修改,以使用真实的 Damerau-Levenshtein 编辑距离,而不是受限的 Damerau-Levenshtein 编辑距离,其中 BK 树所需的三角形不等式不成立

符号正在使用受限的 Damerau-Levenshtein 编辑距离。可以修改它以使用 Levenshtein 距离或真实的 Damerau-Levenshtein 距离。

LinSpell 正在使用限制的 Damerau-Levenshtein 编辑距离。可以修改它以使用 Levenshtein 距离或真实的 Damerau-Levenshtein 距离。

搜索结果的详细程度

在我们的测试中,我们区分了搜索结果的三种详细程度,这将导致不同的查找时间:

**0 级:**只返回最大编辑距离内编辑距离最小的结果。如果存在多个具有相同编辑距离的结果,则返回具有最高词频的结果。这允许提前终止搜索,例如,如果找到编辑距离=0 的结果。

**第一级:**返回最大编辑距离内编辑距离最小的所有结果。如果存在多个具有相同编辑距离的结果,则返回所有按词频排序的结果。这允许提前终止搜索,例如,如果找到编辑距离=0 的结果。

**二级:**返回最大编辑距离内的所有结果,按词频排序。这不允许提前终止搜索。

诺维格拼写矫正器

这个想法是,如果我们人为地从拼写错误的术语中生成最大编辑距离内的所有术语,那么正确的术语一定在其中。我们必须在字典中查找它们,直到找到匹配的为止。因此,生成了 4 种拼写错误类型(插入、删除、替换和相邻转换)的所有可能组合。这是非常昂贵的,例如,对于长度=9 和编辑距离=2 的单词生成 114,324 个候选项。

原来是用 Python 写的。对于基准测试,我使用了来自 Lorenzo Stoakes 的忠实的 C#端口,这是 Peter Norvig 的算法,已经扩展到支持编辑距离 3。

BK 树

BK 树利用了三角形不等式,Levenshtein 编辑距离的一个性质:Levenstein(A,B)+Levenstein(A,C)≥Levenstein(B,C)和 Levenstein(A,B)——leven stein(A,C)≤Levenstein(B,C)。

在索引期间,Levenshtein(根节点,子节点)是预先计算好的。

在查找期间,我们计算 Levenshtein(输入,根节点)。三角形不等式用作过滤器,仅递归地跟随那些预先计算的 Levenstein(根节点,子节点)在范围[Levenstein(输入,根节点)-dmax,Levenstein(输入,根节点)+dmax]内的子节点。

有几个有趣的帖子详细讨论了 BK 树:

我比较了 BK 树的三种 C#实现

并决定使用 Xenopax (也是从维基百科链接的)中最快的作为基准。

符号拼写算法

SymsSpell 是一种算法,可以在很短的时间内从一个巨大的字符串列表中找到最大编辑距离内的所有字符串。它可以用于拼写纠正和模糊字符串搜索。

SymSpell 从对称删除拼写纠正算法中获得其速度,并通过前缀索引检查其内存需求。

对称删除拼写校正算法 降低了给定 Damerau-Levenshtein 距离的编辑候选生成和字典查找的复杂性。它比删除+转置+替换+插入的标准方法快六个数量级,并且与语言无关。

与其他算法相反,只需要删除,不需要转置+替换+插入。输入术语的转置+替换+插入被转换成字典术语的删除。替换和插入的开销很大,并且依赖于语言:例如,中文有 70,000 个 Unicode 汉字!

速度来自于廉价的只删除编辑候选生成预计算。在最大编辑距离为 3 的范围内,一个平均 5 个字母的单词有大约300 万个可能的拼写错误,但是 SymSpell 只需要生成 25 个删除来覆盖所有这些错误,在预计算和查找时都是如此。神奇!

前缀索引背后的思想是,附加字符的区分能力随着单词长度而降低。因此,通过将删除候选生成限制到前缀,我们可以节省空间,而不会过多地牺牲过滤器效率。在基准测试中,使用了三种不同的前缀长度 lp=5、lp=6 和 lp=7。它们反映了搜索速度和索引大小之间的不同折衷。更长的前缀长度意味着更高的搜索速度,代价是更大的索引大小

SymSpell 的 C#源代码在 GitHub 上开源发布。

林拼

这基本上是对单词列表的线性扫描,并计算每个单词的编辑距离(稍作调整)。它旨在作为基准的基线度量。令人惊讶的是,尽管它具有 O(n)的特性,但结果却优于 BK-tree 和 Norvig 的算法。

这有几个原因:

  • 不要低估大 O 符号中的常数。仅访问 BK-树中 20%的节点比原子成本仅为 10%的线性搜索更昂贵。
  • 因为 Damerau-Levenshtein 计算非常昂贵,所以重要的不是处理的单词的数量,而是我们需要完整的 Damerau-Levenshtein 计算的单词的数量。如果我们可以从计算中预先过滤单词,或者一旦达到某个编辑距离就终止计算,我们就可以加速搜索。
  • 如果我们将搜索限制为最佳匹配,我们可以利用提前终止搜索的选项。
  • 没有拼写错误的单词是常见的情况。然后可以用 O(1)中的哈希表或 trie 进行查找!如果我们将搜索限制在最佳匹配,我们可以立即终止搜索。
  • 如果 Abs(word ),我们不需要计算编辑距离。长度-输入。Length)>最大编辑距离(或目前为止找到的最佳编辑距离,如果我们将搜索限制为最佳匹配)
  • 如果我们将搜索限制为最佳匹配,那么一旦达到目前找到的最佳编辑距离,我们就可以终止编辑距离计算。
  • 如果我们将搜索限制为最佳匹配,并且我们已经找到了一个编辑距离=1 的匹配,那么如果所讨论的项的计数小于已经找到的匹配的计数,我们就不需要计算编辑距离。

LinSpell 的 C#源代码在 GitHub 上开源发布。

测试设置

为了对的四种近似字符串搜索算法进行基准测试,我们对每种算法进行了 233+2*2 测试

1000 个有随机拼写错误的单词搜索两个字典大小(29159 个单词,500000 个单词)三个最大编辑距离 (2,3,4) 和三个冗长类型 (0,1,2)。对于每个测试,测量总搜索时间

对于两种字典大小 (29,159 个单词,500,000 个单词),测量创建字典和辅助数据结构所需的预计算时间及其内存消耗

对于四种算法中的每一种,已对发现的建议进行了比较,以确保结果的**完整性。**由算法使用的不同 Levenshtein 变量导致的结果差异已被考虑在内。

测试重点和限制

基准测试将最大编辑距离限制为 4,因为对于自然语言搜索,4 的编辑距离已经接近合理范围,因为误报的数量随着最大编辑距离呈指数增长,精度下降,而召回率仅略有提高。

该基准被限制在 50 万字以内,因为即使是 20 卷的牛津英语词典也只有 171,476 个当前使用的单词和 47,156 个过时的单词。

使用较长字符串或位向量(图像、语音、音频、视频、DNA 序列、指纹等)的模糊搜索超出自然语言搜索,可能需要更长的编辑距离和更大的字典大小,并导致不同的结果。

模糊搜索多个单词(产品/事件数据库)或更大的文本片段(剽窃检查)可能需要复合/分解和超出编辑距离的字符串度量,如匹配以考虑缺失和调换的单词。

这两个应用领域都超出了本文的重点。

测试数据

嘈杂 _ 查询 _en_1000.txt

对于查询,我们使用前 1000 个唯一的单词。来自 Norvig 的文字语料库 big.txt

对于每个单词,在范围 0 内的随机编辑次数…选择 Min(word.length/2,4)。对于每个编辑,在单词内的随机位置应用一个随机类型的编辑(删除,插入随机字符,替换为随机字符,切换相邻字符)。编辑后不允许出现长度为< 2 的重复和单词。

frequency _ dictionary _ en _ 30 _ 000 . txt

这些是来自 Norvig 的文本语料库 big.txt 的 29159 个独特的单词,以及它们在该语料库中的频率。

frequency _ dictionary _ en _ 500 _ 000 . txt

这些是来自谷歌图书 Ngram 数据的英语一百万单词列表中最常见的 500,000 个单词,以及它们的频率。

所有三个测试数据文件都在 GitHub 上发布。

如果你想自己重现基准测试结果或者与另一种模糊字符串搜索算法进行比较,你也会在 Github 上找到 基准测试源代码

基准测试结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在当前的基准测试中,我们用一个随机编辑距离 (0…最大编辑距离)。这样可以很好地理解平均 查找时间

之前的基准中,我们用固定编辑距离 (=最大编辑距离)来比较单词。这样可以很好地理解最大 查找时间作为用户体验的衡量标准,平均值有时可能会产生误导。对于编辑距离=3 ,SymSpell 比 Norvig 的算法快 100 万倍

应用

符号拼写非常快。但是我们真的需要这样的速度吗?为什么?对于单个用户或小编辑距离,其他算法可能就可以了。但是对于搜索引擎和搜索即服务搜索 API 来说,您必须为成千上万的并发用户提供服务,同时仍然保持几毫秒的延迟,并且拼写纠正甚至不是主要的处理任务,而只是查询预处理中的许多组件之一,您需要最快的拼写纠正。

摘要

除了教科书和论坛上流传的历史原因和习惯之外,基准测试无法证实 BK-trees 和 Norvig 算法的广泛使用和推荐背后的任何基本原理。对于 SymSpell 和 LinSpell,有两种可供选择的算法,它们总能提供更好的结果,至少在这个测试的范围内。

  • 如果速度很重要,使用符号法术。比 BK-Tree 快 2-3 个数量级,比 Norvig 的算法快 5-6 个数量级。随着字典大小和最大编辑距离的增加,符号拼写查找时间只会适度增加。在所有情况下,它都优于其他三种算法,通常高出几个数量级。这是以更高的内存消耗和预计算时间为代价的。预计算时间仅在程序/服务器启动期间产生一次,或者如果预计算数据被序列化/反序列化,甚至仅在程序开发期间产生一次。
  • 如果内存使用很重要,使用 LinSpell。对于相同的内存使用,它比 BK-Tree 快 10 倍。LinSpell 查找时间随着字典的大小线性增长,但几乎与最大编辑距离无关。它几乎总是优于 BK-tree 和 Norvig 的算法。不会导致额外内存消耗和预计算时间。
  • 使用 BK 树没有明显的好处。在所有情况下,SymSpell 在速度方面优于它,LinSpell 在内存方面优于它。虽然 BK-tree 比 Norvig 的编辑距离算法> 2 快,但它比 LinSpell 或 SymSpell 慢得多。BK-tree 的性能很大程度上依赖于字典的大小,但是随着最大编辑距离的增加,它的增长是适度的。
  • **nor vig 的算法没有明显的好处。在所有情况下,它在速度上优于 SymSpell 和 LinSpell,在内存上优于 LinSpell。**nor vig 算法的查找时间与字典的大小无关,但随最大编辑距离呈指数增长。
  • 始终小心使用 verbose = 2(列举最大编辑距离内的所有建议,而不仅仅是编辑距离最小的建议)。它要慢得多,因为它防止了搜索的提前终止!

更新:

我收到了一封电子邮件,其中表达了对基准测试结果的一些怀疑,并暗示该结果是由于所选 BK-tree 糟糕的 C#实现,而不是 BK-tree 和 SymSpell 之间的算法差异**。我认为我已经非常小心地选择了 C#中最快的 BK-tree 实现**来防止这种怀疑。但是不可否认的是,有时确实很难区分算法或其实现对性能的贡献有多大。

我将添加一些客观数据:在字典中搜索期间完成的 Levenshtein 计算的平均次数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于 Levenshtein 计算是 BK-tree 和 SymSpell 中搜索的最昂贵的组成部分,在给定大小的字典中搜索期间所需的 Levenshtein 计算的平均数量应该是算法、的真实性能的相当可靠的指标,独立于其实现**。**

而对于 BK 树,我们需要计算词汇(字典中的单词)的 17%到 61%的 Levenshtein 距离, SymSpell 只需要计算词汇的 0.0042%到 0.016% 的 Levenshtein 距离。这就是为什么 SymSpell 的速度源于算法的设计,而不是实现。

顺便说一下,我还测试了一个将 BK-tree 三角形不等式原理集成到 SymSpell 中的集成,作为进一步减少/过滤所需 Levenshtein 计算数量的附加步骤。性能提升很少,但是由于字典生成期间的 Levenshtein 计算,增加了内存需求和预计算成本。

拼写纠正速度提高 1000 倍

原文:https://towardsdatascience.com/symspellcompound-10ec8f467c9b?source=collection_archive---------0-----------------------

亚毫秒复合感知自动拼写纠正

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: https://www.flickr.com/photos/theredproject/3968278028

最近我被指向了两个关于拼写纠正的有趣帖子(这里)。他们应用了一种深度学习方法,即现代的魔法石。从 AlphaGo 赢得围棋冠军Watson 赢得 Jeopardy打击假新闻用奇点威胁人类,深度学习的普及程度真的很让人着迷。

问题是深度学习多工具是否会在每个领域超越并取代高度专业化的算法和数据结构,如果它们都值得拥有它们的位置,或者如果它们的互补优势结合起来,它们是否会发光。与此同时,最初对深度学习纠正拼写的热情随之而来的是一些幻灭。

他们求助于深度学习的原因是他们认为传统拼写检查的“糟糕透顶”的性能(估计拼写一个短单词需要 ~0.1 秒)。

虽然到目前为止没有披露深度学习方法的纠正性能和内存消耗,但我知道拼写纠正可以比 0.1 秒快得多。

SymSpell ,基于对称删除拼写纠正算法,在一台旧 MacBook Pro 上仅仅用了0.000033 秒(编辑距离 2)0.000180秒(编辑距离 3)

不过话说回来,他们的方法能够处理更复杂的表达式,比如**“爱在哪里”**!

SymSpell 总是期望单个输入项,并且不能纠正插入到单词中的个空格或者两个单词之间缺少的个空格。

我的好奇心被激起,我决定尝试在 SymSpell 上增加一个算法层来处理它。

symspell 化合物

SymSpellCompound 支持多单词输入字符串的复合感知自动拼写纠正。它建立在比 SymSpell 快 100 万倍的拼写纠正算法之上。

1。复合分裂&分解

SymSpell 假设每个输入字符串都是一个单独的术语。SymSpellCompound 支持复合拆分/分解三种情况:

  1. 错误地在正确的单词中插入空格导致两个不正确的术语
  2. 错误地省略了两个正确单词之间的空格导致了一个不正确的组合术语
  3. 多个输入项有/无拼写错误

拆分错误、连接错误、替换错误、换位错误、删除错误和插入错误可以混合在同一个单词中。

2。自动拼写纠正

  • 大型文档集合使得手动校正不可行,并且需要无人监督的全自动拼写校正。
  • 在单个单词的常规拼写校正中,向用户呈现拼写校正建议。对于长的多单词文本的自动拼写校正,算法本身必须做出有根据的选择。

例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

工作原理

个人代币

输入字符串被分割成标记。然后使用对称删除拼写校正算法来单独获得每个单词的建议。

组合令牌

此外,检查每个二元模型(连续标记的级联对)的建议,但仅当两个连续标记中的一个不提供建议或最佳建议的编辑距离> 1 时。

如果建议(令牌 1+令牌 2 ),则建议组合令牌优先。编辑距离+1 < suggestion(token1).editDistance+suggestion(token2).editDistance

分割令牌

此外,还会生成一个标记的所有子标记对,但前提是该标记未合并,该标记由多个字符组成,并且该标记的最佳建议的 editDistance >0。

字典生成

词典质量对纠错质量至关重要。为了实现这一点,两个数据源通过交集进行了合并:

Google Books Ngram data ,其提供了代表性的词频,但是包含许多带有拼写错误怒容的条目——面向拼写检查器的词表,其确保了真实的英语词汇但是不需要词频来对相同编辑距离内的建议进行排序。

性能

0.0002 秒/字
5000 字/秒(2012 Macbook Pro 上的单核)

应用

对于单个用户或小编辑距离,其他算法可能就可以了。但是对于搜索引擎和搜索即服务搜索 API,您必须为数千个并发用户提供服务,同时仍然保持几毫秒的延迟,并且拼写纠正甚至不是主要的处理任务,而只是查询预处理中的许多组件之一,您需要最快的拼写纠正。

频率字典

词频列表是通过交叉下面提到的两个列表创建的。通过相互过滤,只使用那些同时出现在两个列表中的单词。应用了附加的过滤器,并且结果列表被截断为大约 80,000 个最频繁的单词。

博客文章:算法、基准、应用

1000 倍快速拼写校正算法
快速近似字符串匹配大数据中的大编辑距离
非常快速的数据清理产品名称、公司名称&街道名称

待办事宜

如果一个拼写错误同时是一个有效单词(例如消息 vs .消息),那么它当前没有被纠正

词频可以用于排名,但有时在给定的上下文中,罕见的词可能是正确的。

二元模型概率可以提供上下文,但上下文通常不是来自连续的术语,而是隐藏在文本的更远处。收集和存储滑动窗口内词汇表的所有术语组合的同现概率可能是禁止的。

我们可以求助于语法句子成分语法网

我们可以通过利用键盘接近度语音接近度和作者过去的个人词汇偏好来猜测作者的意图/错误原因。

正确时会出现误报,但未知单词在其他已知单词的 editDistanceMax 内。

将 Jupyter 笔记本图表同步到 Microsoft Word 报表

原文:https://towardsdatascience.com/syncing-your-jupyter-notebook-charts-to-microsoft-word-reports-187fc6cde5b6?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by J-S Romeo on Unsplash

情况是这样的 :你正在 Jupyter 笔记本上做大数据分析。你有大量的图表,你想对它们进行报告。理想情况下,你可以在 Jupyter 笔记本上创建你的最终报告,它具有所有花哨的降价功能,并且能够将你的代码和报告保存在同一个地方。但问题是:大多数人仍然想要 Word 文档报告,并不关心您的代码、可复制性等。报道时,以最有用的形式向人们提供信息是很重要的。

因此,您有大量的图表和图形想要放入 Word 报告中——您如何保持两者同步呢?如果您的图表稍有变化(例如,更改报告中每个图表的样式)会怎样?您不得不从笔记本中复制和粘贴图表,这是一个手动、耗时且容易出错的过程。

在这篇文章中,我将向你展示我对这个问题的解决方案。它包括以下步骤:

  • 用代码将 Jupyter 笔记本上的图表图像保存到你的桌面上。
  • 准备您的 Word 文档报告,在报告的适当位置引用您保存在桌面上的图像名称。
  • 将图像加载到新版本的 Word 文档中。

将 Jupyter 笔记本中的图表图像保存到桌面

第一步是收集您想要加载到报告中的图像,将它们从 Jupyter 笔记本保存到硬盘上的图像文件中。在这篇文章中,我将使用几个月前我的“让我们刮一个博客”文章中产生的数据和分析,在那里我刮了我最喜欢的博客边际革命并做了一些简单的分析。

该分析使用 matplotlib 生成了一些简单的结果图表。为了将这些图像保存到您的桌面,matplotlib 提供了一个名为 savefig 的有用函数。例如,在该分析中生成的一个图表按作者查看了博客帖子的数量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下代码生成此图表,并将其保存到“report_images”文件夹中名为“num_posts_by_author_plot.png”的文件中。

关于这一步的几点建议:

  • 确保给你的图片起一个有用的、描述性的名字。这有助于确保在 Word 文档中放置正确的引用。我个人喜欢遵循这样的惯例,即在代码中给绘图图像取与绘图对象相同的名称。
  • 您的图像必须有唯一的名称,否则第一个图像将被第二个图像覆盖
  • 为了保持有序,请将图像存储在专门为保存报告图像而设计的单独文件夹中

对我的其他图表重复类似的代码,我的 report_images 文件夹中只剩下 5 个图表图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备带有图像引用的 Word 文档报告

有一个流行的微软 Word 文档包叫做 python-docx ,它是一个很棒的库,可以用 Python 代码操作 Word 文档。但是,它的 API 不允许您在文档中间插入图像。

我们真正需要的是类似 Jinja2 for Word Docs 的东西:一个可以在文档中指定特殊占位符值,然后自动加载图像的包。嗯,幸运的是确实有这样一个包存在: python-docx-template 。它构建在 python-docx 和 Jinja2 之上,允许您在 Word 文档中使用类似 Jinja2 的语法(参见我的另一篇关于使用 Jinja2 模板创建 PDF 报告的文章)。

要使用 python-docx-template 将图像导入 Word,很简单:只需在 Word 文档中使用常用的 Jinja2 语法{{ image_variable }}。在我的例子中,我有六张图片,我放在一起测试的 Word 模板看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了让系统工作,您必须在{{ }}中使用与图像名称对齐的变量名(在’之前)。png ')和 Jupyter 笔记本中的绘图变量名。

将图像加载到文档中

最后也是最重要的一步是获取模板中的所有图像。为此,代码大致遵循以下步骤:加载 Word 文档模板,从 image 目录中加载图像作为 InlineImage 对象的 dict,在 Word 文档中呈现图像,并将加载的图像版本保存为新文件名。

下面是执行此操作的代码:

要运行代码,您需要指定 Word 模板文档、将包含图像的新 Word 文档名称以及存储图像的目录。

python load_images.py <template Word Doc Filename> <image-loaded Word Doc filename> <image directory name>

在我的例子中,我使用了以下命令,它接受模板 template.docx ,生成加载了图像的 Word 文档 result.docx ,并从文件夹 report_images 中获取图像:

python load_images.py template.docx result.docx report_images

瞧,加载了图像的 Word 文档看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以在 Github 这里找到我用来创建这个指南的代码。

原载于 2018 年 12 月 2 日【www.marknagelberg.com】。你可以在推特上关注我 这里 。要访问我共享的 Anki deck 和 Roam Research notes 知识库,以及关于间隔重复和提高学习效率的技巧和想法的定期更新, 加入“下载马克的大脑”。

概要报告造就更好的放射科医生和算法

原文:https://towardsdatascience.com/synoptic-reporting-makes-better-radiologists-and-algorithms-9755f3da511a?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我仍然记得我作为放射科医生犯的第一个真正的错误。这是一个很小的错误,几乎不明显,但对病人有很大的影响。这个错误在我犯错的第二天才被发现,尽管如此,也为时已晚…

遗漏的错误

几年前,我在夜班工作的创伤中心报告紧急 CT 扫描。有一些常见的东西,很多 CT 头,一些肾结石的发现,和一些全身外伤的研究。其中会出现来自病房上方的紧急扫描,如术后腹部和 ITU 机构。一切都在以相当快的速度进行着,每次我完成一份报告,一项新的研究就会出现在工作列表中。那天晚上我是高级注册员(培训生),第二天早上我的顾问会仔细检查一切。

外科病房的一项研究是针对一名因阑尾手术破裂而被送进手术室的年轻男子。显然,他手术后败血症的情况很糟糕,团队很有理由想检查他腹部的状况。我调出了他的入院 CT 检查了一遍。右侧髂窝内有大量游离液体,脂肪滞留,如预期的那样,盲肠附近有壁状聚集。阑尾炎延迟表现的典型表现。然后我打开最近的术后扫描,开始口述。收集物已经过手术处理,只剩下一点点游离液体。伤口看起来很好,没有什么新的东西值得注意。我写完报告,继续下一项研究。单子做好之后(嗯,永远做不完,但是我的班做完了),我就回家了。

第二天,我一上班,就像往常一样查看了我的电子邮件。第一条消息的标题为“紧急:升级的放射学错误”。我愣了一会儿——我做了什么?我的大脑想不出会是什么。我打开电子邮件,通读了一遍。它很短,但切中要害。不过,对我来说没有意义,一开始没有。我重读了一遍。

“Harvey 医生,昨天您报告了对患者 x 进行的术后 CT 扫描。根据您的报告,患者被连夜送回手术室进行剖腹探查,但由于手术团队无法将他们的发现与您报告的情况联系起来,手术被迫中止。病人现在在重症监护室,接受术后治疗。请联系首席手术顾问,安排时间对该事件进行调查性审查,该事件已上报管理层。”

问题掠过我的脑海。他们为什么把他带回剧院?我说过他的腹部看起来好多了,不是吗?我报告了错误的扫描吗?

我冲进报告办公室,把我昨天报告的扫描结果装了进去。我向下滚动列表,它就在那里。一名顾问甚至对其进行了反复检查和核实。我打开它,又看了一遍图片——但没什么不同,还是我昨天报道的那项研究。我肯定报告了正确的研究。我又看了一遍我的报告。再一次。根据我的发现,我不明白他们为什么决定去剧院。我说过这些收藏品已经不在那里了,周围的自由流体也已经消散了。

实际上,我没有。

这就是我的错误,白纸黑字写得清清楚楚,这是我的疏忽。有时候最难看到的是那些不存在的东西。我想说的是“之前提到的盲肠旁集合没有被看到。”我实际上报道的是“前面提到的盲肠旁集合可见。”

我漏掉了一个单词。“不是”。仅仅在这个基础上,外科医生就认为这个集合仍然存在,是败血症的源头,并把病人带回手术室切除。

一个词。仅仅一句话就给一个极度不适的年轻病人带来了不必要的伤害,让他冒着再次接受大手术的风险。不仅如此,手术团队连夜完成了这项工作,医院为此付出了巨大的代价,这无疑只会给其他病人的治疗增加延误。我感到羞愧。

我回复了邮件,安排了一次会面,并走完了正式审查的流程。我只能道歉。我可以试着把责任归咎于我的自动听写软件漏掉了一个单词,或者是外科医生没有亲自检查图像,或者是我的顾问在核实之前没有彻底阅读报告。然而,完全正确的是,责任在我身上。我应该更仔细地阅读我的报告。令人欣慰的是,病人最终很好,只在重症监护室呆了很短时间。没有对我采取任何行动。他的败血症是由败血症(血液感染)引起的,他对抗生素反应良好。我从错误中吸取了教训,并养成了认真检查口述报告的习惯,尤其是因为它们是由语音识别软件自动处理的。每当我结束一份报告,我仍然回想起那个年轻人和我给他带来的不必要的痛苦。

词语很重要

我犯的第一个严重错误是许多放射学家都知道的。我并不孤单。一项研究显示,高达 33.8%的未经编辑的报告包含此类错误。我们是一个被我们的话语所束缚的职业,我们的话语是我们患者旅程中的法律记录。词语很重要,我们把它们弄对是至关重要的。尽管像语音识别软件这样的技术很有用,但最终的责任还是在我们人类身上。那么,我们如何减少这些错误呢?在一个工作量不断增加、疲惫不堪、筋疲力尽的放射科医生的世界里,也许我们不能指望每个字都被考虑、检查和验证。

我更担心的是最近在图像感知方面推进的人工智能,它依赖于人类口述的报告,为算法提供学习数据。如果人类的自由文本报告已经包含错误,并且自然语言处理试图解析文本并找到意义,那么这些错误只会被转移。更糟糕的是,来自人类的自由文本报告都非常不同——每个放射科医师都以不同的风格,使用不同的描述符进行报告。我之前在关于 CheXnet 研究的博客中报道过这个话题,并解释了你如何不能真正使用源自人类的自由文本作为基础事实来了解胸部 x 光片中的内容。至少没有人类准确。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image from Modelling Radiological Language with Bidirectional Long Short-Term Memory Networks, Cornugreta et al, 2016.

我不是唯一一个担心这个的人。来自宾夕法尼亚州好时医疗中心的 Huesch 等人最近发表了他们的发现,试图挖掘寻找肺栓塞(肺部动脉中的血凝块)的 CT 扫描文本报告。他们的结论是,自由文本报告“与报告长度和报告术语的广泛可变性相关”。作者继续指出,“这些结果支持对一个完全结构化的报告模板的影响的预期评估,该模板至少具有一些强制性的离散字段,以方便报告的使用和理解”。换句话说,他们建议报告的结构不仅要强制标准化,还要更好地让机器学习理解它们。

这都是关于结构的

二十多年来,人们一直在推动所谓的“结构化报告”。实质上,结构化报告是一个模板,它规定了需要由报告放射科医师填写的某些字段。例如,在胸部 x 光报告中,字段可能包括肺、心脏和骨骼。其目的是创建一个标准化的报告,该报告以相同的格式包含相同数量的有用信息,而不管是哪个放射科医师完成的。

对结构化报告好处的广泛研究令人信服。已经表明,结构化报告绝对"比非结构化报告更加完整和有效",在清晰度方面具有" T2 “优势,提供了” T4 “增强的感知临床影响,它们” T6 “便于信息提取并受到转诊医生的青睐,并且可以” T8 "改进手术计划。在医疗保健行业金钱为王的美国,结构化报告对于识别账单代码非常有价值。此外,结构化报告已被推荐用于任何涉及放射学报告的研究活动,在诊断准确性研究报告标准 (STARD)声明中有明确规定。简而言之,结构化报告比自由文本报告要好。报告更清晰,更好的解释,包含更多的信息,是机器可读的,你的临床同事喜欢它们。

那么为什么不是所有的放射科医生都使用结构化报告呢?这就是棘手的地方。放射科提供商和供应商在很大程度上没有执行结构化报告。有些解决方案就是在空白处写上几个字,告诉你报告的副标题应该是什么。剩下的部分由你来填写,最终,放射科医生只是在标题下放一份自由文本报告,然后就不管它了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sample ‘fill in the blanks’ report from RSNA’s RadReport. These haven’t gone down well with radiologists.

其他结构化报告有太多的部分需要完成,所以最终感觉你在勾选不必要的框,浪费时间回答不相关的问题,减慢你的工作流程。他们不适应,他们是一个尺寸适合所有人,他们会感到束缚和负担。另一个担心是,花在填写结构化报告上的时间是花在而不是看图像上的时间,这是放射科医生不喜欢的!

概要报告

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image courtesy of Smart Radiology

很明显,我们必须减少错误,使医疗数据为人和机器都可以理解。随着放射学标准化词典的兴起,以及将结构化报告集成到 DICOM 格式的工具的出现,我们看到了技术与临床需求的融合,最终可能使结构化报告成为可用的现实,这是通过所谓的“概要报告”实现的。这是直接从输入数据生成机器可读报告的概念。通过这种方式,临床数据在来源处被标记化,附加到您喜欢的任何编码系统(ICD-10、FIHR、SNOMED),然后在结构化模板内被处理成自由文本报告。与传统的纯文本报告相比,底层编码数据更适合计算分析,从而为精确的大规模放射学数据查询打开了大门。

在 RSNA 2017 上,一家供应商智能报告展示了一个优雅的概要报告解决方案。该软件将数据字段转换成人类可读的自由文本,而不是说教式的打勾。使用语音命令(与领先的放射学语音听写软件 Nuance 链接),放射科医生只需说话即可导航模板字段,无需点击鼠标。

每个领域都是完全可定制的,因此每个放射科都可以根据需要设置自己的格式,或者选择使用子专业专家为每个临床用例设计的模板。随着放射科医生的工作进展,会显示实时决策支持(如上面关于肺结节测量的示例所示),确保放射科医生都按照相同的黄金标准工作。“正常”研究可以在几秒钟内以您的科室和转诊临床医生喜欢的格式报告出来。癌症研究尤其受益于详细的标准化,智能报告旨在减少填写此类报告的繁琐。

实际上,该软件从放射科医师提供的数据中创建了自由文本,消除了口述整篇文章的需要。机器学习研究人员的好处是,底层数据已经硬编码,不需要 NLP 筛选。对于那些努力让 NLP 准确一致地工作的人来说,这是个好消息。事实上,它完全否定了 NLP 的必要性。

我们不必再创建我们希望从中获取数据的文档,相反,我们可以从我们的数据中创建清晰、集中的多媒体文档。

对于那些担心失去正常机智报告的细微差别的人,不要担心,你可以随时编辑一个模板来包含你最喜欢的谚语,安全地知道你的报告仍然有足够的结构。您编辑的基础数据点保持不变,但文本是您自己的。更重要的是,你的妙语可以立即翻译成多种语言,甚至有可能从相同的底层结构化数据中创建面向患者的报告,这是我的人工智能在放射学中的五大用例之一。

另一个聪明的功能是,你可以合并人工智能图像感知算法的输出,将相应的文本(根据你的喜好编辑)自动放入报告中。这一技术目前正在荷兰拉德布大学医学中心与 Thirona 成像分析进行测试。还有一个集成的分析套件,所以你可以深入到所有报告的数据中,这是单靠自由文本根本不可能做到的。所有这些数据点都有可能链接到您医院的电子记录中,用于审计、数据分析和机器学习研究。这与当前的热门话题,甚至是医疗技术中更热门的“真实世界数据”业务紧密相关。那些知道如何大规模创造和利用准确的真实世界数据的人正看到巨大的回报;看看今年罗氏以 19 亿美元收购的熨斗就知道了。创建和管理自己的数据湖的价值显而易见。现在,它取决于放射科医生接受它。

摘要

如果我们要开发真正的放射学人工智能系统,那么我们需要数十亿个干净的数据点。自由文本和事后 NLP 数据提取在医学等安全关键环境中并不适用,因此我们需要更智能地生产数据,以供我们的算法进行训练。不仅如此,为了我们的患者,我们应该尽我们所能减少我们自己的错误,为了我们的临床同事和患者,我们应该提供清晰、可操作和可读的报告。

相反,随着人工智能在规模和功能上的增长,概要报告将是这些系统产生输出的唯一方式。我们当然不会训练人工智能系统产生没有底层编码数据点的自由文本块!

概要报告有可能提高护理质量,同时改善我们与同事和患者的互动和交流,并确保每个放射科医生都按照最高标准进行报告。

这只是更聪明的做事方式。

如果你和我一样对放射学人工智能的未来感到兴奋,并想讨论这些想法,请保持联系。我在推特上 @drhughharvey

如果你喜欢这篇文章,点击推荐并分享它会很有帮助。

关于作者:

Harvey 博士是一名委员会认证的放射科医生和临床学者,在英国国民医疗服务体系和欧洲领先的癌症研究机构 ICR 接受过培训,并两次获得年度科学作家奖。他曾在 Babylon Health 工作,领导监管事务团队,在人工智能支持的分诊服务中获得了世界第一的 CE 标记,现在是顾问放射科医生,皇家放射学家学会信息学委员会成员,以及人工智能初创公司的顾问,包括 Algomedica 和 Kheiron Medical。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值