TowardsDataScience 博客中文翻译 2019(二百三十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

我如何用特征工程改进我的文本分类模型

原文:https://towardsdatascience.com/how-i-improved-my-text-classification-model-with-feature-engineering-98fbe6c13ef3?source=collection_archive---------3-----------------------

高级文本分析可提高您的模型准确性

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

Photo by William Iven on Unsplash

在本文中,我将向您展示如何进行文本分析,以提高模型的准确性,并发现数据中的几个事实。为此,我将使用在Kaggle可用的数据集。
该数据集由“维基百科的谈话页面编辑”中的评论组成,它提供了发布评论的用户的标识符,但我们没有关于评论页面或用户个人数据的信息。然而,我们有 6 种不同的手写标签(有毒、严重有毒、身份仇恨、淫秽、威胁、侮辱)。

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

为了进行我们的分析,我们将根据标签分离我们的语料库。我们将简要地看看不同标签在数据库中的分布,然后看看这些子集本身,它们对应于上面列出的标签。

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

可以看出,毒性评论的语料库是最大的,并且训练语料库中大约 10%的评论具有该标签,而威胁性评论的语料库较小。然而,这并不意味着 25%的评论是恶意的,因为一个评论可以有几个标签。我们可以看到,不到 5%的评论只有一个标签,大约 7%的恶意评论至少有两个标签。

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

为了创建相关指标来改进我们的模型,我们将关注我们语料库的内在特征,以我们对不同语料库的假设词汇和语法分布的先入之见为指导。我们会问自己,是否有重复出现的模式可以作为标志来丰富我们的模型。我们将定义一些属于每个评论的统计特征。

统计分析

在开始分析这些文本统计数据之前,我假设制作这些统计数据会很有趣,可以将这些数据与我的预想进行比较。也就是说,我假设(根据经验)一个意图恶意的评论,会有更高比例的大写单词,更不发达的词汇和更多数量的感叹号。带着这些想法,我计算了一些变量的中值,并把它们放在同一个刻度上,为了图的可读性,我没有取所有的变量,所以我保留了我最感兴趣的变量。我用感兴趣的变量创建了第一个雷达图,以获得我的语料库之间的相关标志。这里的形状比已经标准化的值更重要(即,变量已经被转换以使它们的平均值集中在 0 上,它们的方差集中在 1 上),以获得变量之间一致的图形。

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

因此,在这张图上我们清楚地看到,我的一些先入之见是正确的。与没有恶意的评论分布相比,大写单词与句子长度的比率是显而易见的。我们还注意到,没有不良意图的评论,有更高数量的独特词,更多的句子和更长的句子。这证实了不怀好意的评论可能提供了不太丰富的词汇,我们稍后将试图证实这一假设。另一方面,大多数评论差
有类似的分布,除了严重中毒的语料库,这是这种词汇贫乏的一个案例。

此外,真实数值显示,平均而言,恶意评论中感叹号的数量是合规评论中感叹号数量的十倍。还有一种不太发达的标点符号。在不符合的语料库中,句子的长度缩短了 20%,大写字母的单词数平均为 43 个大写字母,是符合的评论的 14 个的 2.5 倍。与平均句子长度相关,在不符合的评论中,平均 11%的单词是大写字母,而在符合的评论中,平均只有 4%的单词是大写字母。基于“独特”词的数量的词汇贫乏也是如此,也就是说,在这种类型的语料库中,对于平均 33 个独特的词,不同于其他词的词汇贫乏是 1.5 倍,而在兼容的语料库中是大约 50 个。我们可以问自己一些关于词汇贫乏的更深刻的问题,让我们看看单词唯一百分比更低的评论±30%。

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

这些大多是有害的评论,如果我们查看细节,我们会发现这些
评论通常是“垃圾邮件”。这个信息对我们的模型很有意义,我们将定义一个垃圾邮件指示器。

在第二部分中,我们将在文本数据上使用词性标注器(一种定位属于语料库中每个单词的语法类别的算法),以便以与之前相同的方式提取信息。我认为,恶意评论肯定会呈现出与符合语料库不同的词汇和/或语法结构。我使用了一个由不符合任何标签的评论组成的语料库和一个仅由不存在任何问题的评论组成的语料库。

语言和语法分析

首先,让我们分开我们的语料库,看看我们的词性标注算法的算法部分。

toxic = train[train["toxic"] ==1]
svr_tox = train[train["severe_toxic"] ==1]
identity_hate = train[train["identity_hate"] ==1]
obscene = train[train["obscene"] ==1]
threat = train[train["threat"] ==1]
insult = train[train["insult"] ==1]
clean_com = train.loc[(train['toxic'] == (0)) 
                      & (train['severe_toxic'] == (0))
                      & (train['obscene'] == (0)) 
                      & (train['threat'] == (0))
                      & (train['insult'] == (0))]text_severe_tox = " ".join(svr_tox.comment_text)
text_tox = " ".join(toxic.comment_text)
txxt_identity_hate = " ".join(identity_hate.comment_text)
txxt_obscene = " ".join(obscene.comment_text)
txxt_threat = " ".join(threat.comment_text)
txxt_insult = " ".join(insult.comment_text)
clean_text = " ".join(clean_com.comment_text)

感谢nltk 库,我们不需要从头开始写所有东西,我们将标记我们的语料库。

splitter = Splitter()
#example
print(txxt_threat[:30])
'Hi! I am back again!\nLast warn'
print(splitter.split(txxt_threat[:30]))[['Hi', '!'], ['I', 'am', 'back', 'again', '!'], ['Last', 'warn']]

然后,我们将应用我们的词性标注算法。

lemmatizer = WordNetLemmatizer()
splitter = Splitter()
lemmatization_using_pos_tagger = LemmatizationWithPOSTagger()
tokens = splitter.split(txxt_threat)
treat = lemmatization_using_pos_tagger.pos_tag(tokens)
print(treat[:30])[[('Hi', 'Hi', 'NN'), ('!', '!', '.')],
 [('I', 'I', 'PRP'),
  ('am', 'be', 'VBP'),
  ('back', 'back', 'RB'),
  ('again', 'again', 'RB'),
  ('!', '!', '.')],
 [('Last', 'Last', 'JJ'), ('warning', 'warning', 'NN'), ('!', '!', '.')],

我们可以看到,我们的算法做了三件事,它标记化,它引理化(给定一个转换的动词,它返回动词的词根),他给我们标记的动词/语法参考。然后,给定已标注语料库,我们可以突出显示语料库的动词/语法分布。我们将对每个标签进行计数,并对它们进行加权。

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

令我惊讶的是,我们注意到这两个语料库非常相似,它们在常规语料库中使用过去分词和决定因素的比率上有所不同,并且通常常规语料库的语法丰富度更高。唯一有很大不同的一点是,在语料库的句子语法结构中,人称代词的使用。这只证实了我的一个假设,而否定了其他的。

因此,我们将特别关注这些代词,在这种情况下,它们将表征恶意评论的语料库。现在,我们将对来自词性标注的数据进行更微观的分析。根据这个图表,我想看看子标签中最常用的词会很有趣:动词、名字、人名和外来词。

让我们创建一个大字典,它将包含我们研究中感兴趣的几个变量。

然后,我们将定义一个函数,找出这些动词形式中最常见的 25 个单词,并绘制出来。

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

对外来词的微观分析给了我们更多兴趣点的一瞥,我们看到了几个东西,与语料库相关联的词,将它们集成为变量会很有趣,例如“puta,Nazi,mother,fukkin”。还有一些符号是作为重复出现的单词出现的,说明上面创建的符号数量的文本统计一定会对以后的算法产生影响。

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

在所有语料库中出现频率最高的动词中,只有 killsuck 突出,否则动词出现在整个语料库中基本上是相同的,这并没有给我们提供非常有趣的信息,但仍然可以证实我对语料库之间动词差异的先入为主的看法是错误的。

我们将对此标签分析进行重复数据删除,以找到适合最终模型的相关变量。我们将直接分析二元模型,三元模型。

单|双|三元分析

为此,我们将使用[TFIDF](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)方法构建一个单词矩阵,通过限制 ngram 的数量并引入[Logistic Regression](https://en.wikipedia.org/wiki/Logistic_regression) 来查看变量的重要性。

分数越高,特征就越重要(我按毒性值排序,这意味着第一个词属于排序的标签越高)

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

例如,在评论中出现“他妈的”这个词会增加 52%的属于有毒标签的概率,而“你”对整个语料库的强烈影响在于,它是作为威胁标签的单字的主要触发器。

var_imp = get_feature_importances(model, analyzer='word', ngram=2, ngram2 =2, lowercase=True)
var_imp.head(10)

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

在二元语法分析中,我们总是发现单词“fuck”,有趣的是,我们发现我们的人称代词在标签分析中是有区别的。因此,我们可以看到,它们通常是由“滚开”组成的侮辱,或者与“未来”的人身伤害“你是”区分开来。然而,我们注意到大框架在模型中已经不那么重要了。

var_imp = get_feature_importances(model, analyzer='word', ngram=3, ngram2 =3, lowercase=True)
var_imp.head(10)

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

通过向三元组发展,我们注意到你的优势,三元组中的重要词主要是单词和双词的延续。有趣的是,在术语频率中发现的重复出现的单词不一定是对影响语料库的概率具有最大影响的单词,这可能是由于在文档中出现的频率较低。

我们的整个分析将允许我们创建新的训练变量,我认为这些变量将对我们的模型产生重大影响。因此,我们将首先仅使用文本作为变量来对我们的数据进行建模,我们将用文本分析的行话创建一个[Bag of Word](https://en.wikipedia.org/wiki/Bag-of-words_model) ,并将其用作我们的分类器的训练基础。这个矩阵是以这样的方式构建的,单词变成列,评论 id 是行,每行由 0 或 1 组成,这是单词存在的指示符,所以我们面对的是一个稀疏矩阵。然后,我们将使用我们的文本知识来提高对我们的分类器的理解,并看看这对我们的模型是否有真正的影响。

并用作我们的分类器的训练基础。这个矩阵是以这样的方式构建的,单词变成列,评论 id 是行,每行由 0 或 1 组成,这是单词存在的指示符,所以我们面对的是一个稀疏矩阵。然后,我们将使用我们的文本知识来提高对我们的分类器的理解,并看看这对我们的模型是否有真正的影响。

让我们定义我们在分析过程中发现的特征,第一个是本文顶部计算的统计特征,然后我们计算一些词性标记的特征,最后是通过一元二分三元组分析的一些特征。

for dframe in tqdm([train, test]) : 
    regex_features(dframe)

然后我们将创建一个没有特征工程的矩阵和另一个有特征工程的矩阵

因此,我们将我们的算法应用于我们的两个矩阵,并计算模型的准确率。首先,没有特征工程的模型。

terms = vectorizer.get_feature_names()
var_imp = pd.DataFrame(index=terms)
for label in lab:
    print('... Processing {}'.format(label))
    y = sample_train[label].values
    classifier = LogisticRegression()
    classifier.fit(train_text_matrix, y)
    y_pred_X = classifier.predict(test_test_matrix)
    print('Valid Accuracy is {}'.format(accuracy_score(y, y_pred_X)))
    var_imp[label] =  np.sqrt(scaler.var_) * classifier.coef_[0]

var_imp = var_imp.sort_values('toxic', ascending=False)

如果没有特征工程,结果如下:

Toxic | Obscene | Identity Hate | Severe Toxic | Insult 
79.7  | 88.9    | 98.7          |  98.5        | 91.9

使用特征工程:

Toxic | Obscene | Identity Hate | Severe Toxic | Insult 
89.3  | 83.9    | 99.6          |  98.7        | 94.3

可以看出,具有研究变量的模型表现得更好。我们可以看到,该算法对不可忽略的有毒标签的预测高达 9 分以上。这意味着在整个语料库中 9.5%的标记为有毒的评论中,即大约 15,000 条评论中,预测 89.3%的标签而不出错意味着大约 13,500 条评论将被很好地预测,相比之下,在没有文本分析的情况下应用的算法中只有不到 12,000 条评论,即需要避免 1500 条额外的有毒评论。这种新算法在所有标签上执行,并改进了对某些已经非常好的标签的检测,例如仇恨语料库,它仍然获得一个点并接近完美的预测。

我们现在将更精确地查看我们的研究的影响,通过检查我们的逻辑回归系数,我们可以确定从最强到最弱对我们的模型有最大影响的变量。下表总结了影响给定标签从 0 到 1 的评论的每个变量(单词)的能力。也就是说,这些单词在句子中的存在将对算法执行的标注产生累积触发效应。

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

Ranking

那么使用特征工程,特征的重要性就变成了:

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

Ranking

总之,我们可以说,对文本数据的深入分析代表了模型学习中的一个重大挑战,并为我们的数据集带来了一个新的维度。一方面,它可以让你在我们的数据中发现更多,并肯定或否定先入之见。另一个优点是可以从对训练和验证数据的文本分析中生成这些指标,另一方面,这项研究向我们证明了所确定的指标与建模目的相关。

我如何通过一个问题增加我作为数据科学家的影响力

原文:https://towardsdatascience.com/how-i-increased-my-impact-as-a-data-scientist-with-one-question-d0417a1b10cb?source=collection_archive---------12-----------------------

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

How can you level up your impact as a data scientist? Image source.

你如何开始你的数据科学项目?当你听到类似“我们能更好地了解我们的客户如何使用产品”的问题,或者有类似“我如何才能对购买概率建模”的想法时,你会怎么做?当我刚成为一名数据科学家时,听到这些意味着一头扎进我的技术技能库,思考解决方案。

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

Diving into the technical stuff as a data scientist is exciting. Image source.

毫无疑问,这会让你直接进入令人兴奋的领域:将大量数据转化为有意义的东西。这种挑战让我和我在这个领域遇到的大多数了不起的人都想成为一名数据科学家!然而,一些令人沮丧的事情不断发生,最终改变了我开始每个项目的方式。

不管我的输出多么令人印象深刻,人们并不总是使用我创造的东西。有了这种认识,我的心态从“数据科学家使用数据”转变为“数据科学家让数据有用”详细解释在这里但是,简单地说,如果没有人使用我创造的东西就没有多大意义。

“数据科学家让数据变得有用”

从那以后,只要我或我的团队有问题或想法,我就不会浪费精力去想解决方案。我总是通过问一些帮助我产生更大影响的事情来开始谈话:“想象一下我们已经完成了所有的艰苦工作,并开发了一个完美的解决方案。你会用它做什么?”

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

Asking about impact can be a powerful move. Image source.

这直接跳到了计算将会发生什么。它决定了最初的问题是来自短暂的好奇心,还是真正渴望数据驱动。我们会定期监控数据,并在发现与预测有偏差时采取行动吗?如果结果是正面或负面的,我们会做出不同的决定吗?我们会适当地生产和使用模型输出吗?

如果这类问题没有令人满意的答案,那么可能就不会有任何令人满意的影响。同样重要的是要指出,这并没有阻止我从事有趣的项目。这有助于确保我从事的项目既有趣又有影响力!

“想象一下,我们已经完成了所有的艰苦工作,并开发了一个完美的解决方案。你会用它做什么?”

除了帮助指导我的努力,我还发现了问这个问题的一个奇妙的副作用。一个典型的回答是,“我没想过这个”,或者一些现场编造的长篇大论的计划。听了很多次,我注意到这个问题很有挑战性。

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

Asking about impact can be tough, but worth it. Image source.

最初的反应是防御性的,通常很快就会意识到应该有一个好的答案。因此,它不仅节省了我挑选没有影响的项目的时间,还帮助利益相关者和决策者反思他们的目标。这几乎总是以一个更好的问题、更清晰的目的和更大的数据驱动承诺而告终。

所以下次你开始一个数据科学项目时,停下来问问结果会怎样。我希望这个简单的问题对你和对我一样有帮助!

停止广播

感谢阅读,我希望你喜欢这篇文章。想知道如何提高自己作为数据科学家的影响力吗?在 MediumTwitterLinkedIn 上问我你的问题,我很乐意分享我的经历!

我如何学习数据科学以及改变一切的 1 门课程

原文:https://towardsdatascience.com/how-i-learned-data-science-and-the-1-course-that-changed-everything-16912ccbab2b?source=collection_archive---------2-----------------------

如果你不知道从哪里开始

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

Unsplash

如果你正在阅读这篇文章,你可能刚刚开始你的数据科学之旅,不知道该走哪条路才能让你更上一层楼。

我之前在 Quora 上回答了一个关于这个话题的问题,获得了相当多的浏览量,所以它激励我更深入地研究它。

就像你一样,我认为自己是数据科学的初学者,因为我还有很多东西要学,但我已经参加了一些在线课程,并希望记录我迄今为止的过程,包括其起伏。我还想分享一门课程,在我看来,这是每个初学数据的科学家在开始时都应该学习的课程。

让我从我的故事开始。

我为什么要学习

几年前,当我在多伦多大学学习土木工程时,我总是看到一些文章,描述像我一样的人是如何学习编程并能够从头开始创建令人敬畏的项目的。

我想变成那样。

那时,我已经知道工程不太适合我,因为我在技术设计课程上做得不太好。我想学习一些额外的技能,这样我可以更好地区分自己。所以我决定试试编程。如果其他人能做到,这应该不会太难吧?

从 Python 开始

我尝试过不同的编程语言,比如 Ruby、HTML / CSS 和 Java,但最终还是选择了 Python,因为它对我来说最有意义。

我是通过使用 Codecademy 的学习 Python 课程开始学习的,因为当你搜索“如何学习 Python”时,它是首先出现的内容之一。

我刚开始用的时候,一切都是免费的。他们后来增加了收费的特殊课程,但我相信他们仍然有基础课程,你可以用来学习语言的基础,并免费帮助你建立基础。

我还通过 freeCodeCamp 看到了这个学习 Python——初学者的完整课程 YouTube 视频,它带你了解 Python 最重要的概念。作为基本理解 Python 的指南或者作为已经学习过的知识的复习工具是非常棒的。你应该能在一个周末内完成它!

另一个很好的资源是活跃在编码挑战网站上,比如代码大战,在那里你可以使用你的 Python 技能来解决编码挑战。你可以选择挑战的难度,看看其他人的代码以及他们是如何解决的来学习。我曾经试着每天做一个,但是很难坚持,最终完全停止了。

不一致是我面临的一个大问题。

在那几年里,我会受到启发去学习/实践,但随后会失去热情并停止一段时间,只是为了过一段时间后重新开始。

这个循环将会重复。

前前后后是因为我怀疑自己,怀疑自己学习编程的能力。

我会给自己找借口,比如:

  • 有很多服务可以在你不知道的情况下帮助你编码。
  • 我太老了,不能学习全新的东西,应该专注于我所知道的。
  • 竞争太激烈了。
  • 太难了。

不一致和怀疑自己花了我很多时间。我现在意识到,只要你每天都在鞭策自己学习一些东西,哪怕是一点点进步都是好的。

迈向数据科学的旅程

几年过去了,我是一名建筑项目经理,但感觉好像少了点什么。我后悔没有更加努力地学习编程。

我仍然定期阅读关于自学的人的文章,并认为如果我不亲自尝试,我将来真的会后悔。

数据科学是我不断听说的一种趋势,当我发现 Python 是数据科学家的首选语言时,我觉得这是我在这个方向上学习的一个标志。

我在网上搜索如何学习数据科学,发现了这篇文章,互联网上最好的数据科学课程,根据你的评论排名,它向你展示了一条从没有编程经验到机器学习工程师的课程之路。

因为我觉得我需要温习一下我的 Python 基础知识,我开始学习他们推荐的编程入门课程,多伦多大学通过 Coursera 提供的学习编程:基础知识(LPT1)制作质量代码(LPT2) 。这些课程包括鼓励您继续学习的视频讲座,以及在巩固您的 Python 技能的同时让您参与其中的作业。对于初学数据的科学家来说,它们的内容难度和范围都很大。我发现 LTP1 是一个很好的复习课程,因为我之前已经学习了 Python 的基础知识。我也确实学到了很多我不知道的新东西。我喜欢他们教你如何正确地写代码以获得更好的“可读性”。LTP2 更难一些,我在完成课程时遇到了一些麻烦,但我也从中学到了很多。

在 Coursera 课程之后,我继续走推荐的道路,并决定参加一门数据科学入门课程。我选择了 Udacity数据分析简介,因为我被他们专业的网站和出色的布局所吸引。

我不知道为什么,但我开始学习这门课程时遇到了很多困难。一开始,它向我介绍了Anaconda&Jupyter Notebooks,我实际上花了大量时间试图理解它是什么以及如何操作它。我觉得课程上的解释没什么帮助,所以我很难继续学习下去。我发现 Udacity 的课程有时在练习/测验中没有提供足够的指导,并且可以假设你已经有概念的先验知识。因为这个原因,我停止了在球场上的工作。

于是我又开始产生了怀疑。

我想,如果我连《数据科学导论》课程都学不完,我怎么能学习数据科学呢!这让我感到非常沮丧,不知道下一步该做什么。

改变一切的过程

我在查看其他数据科学家的 Instagram 页面时,偶然发现了这个课程。我四处滚动,发现在 Udemy 上提到了何塞·波尔蒂利亚的 数据科学和机器学习训练营的 Python。这似乎是一门很受欢迎的课程,人们在评论中对它赞不绝口,所以我决定进一步研究它。

我起初持怀疑态度,认为我会落入一个花哨而又吸引人的标题的陷阱。所以我做了很多研究,查看了它的评论,并与其他在线学习平台进行了比较。它似乎值这个钱。

我决定冒险一头扎进球场。

这是一门付费课程,但你总能在 Udemy 上找到折扣,所以价格大概在 15 美元左右。这是非常值得的,因为它将数据科学的所有主要方面组织在一个易于理解的包中。

这门课程极大地提高了我对数据科学的理解、技能和信心。

它通过你可以在 Jupyter 笔记本上跟随的讲座,彻底地介绍了 numpy、pandas、matplotlib、seaborn 和许多其他概念,然后让你根据讲座自己做一个项目。你甚至可以为你的投资组合重新安排这些项目!查看我的 Github ,里面包含了课程中的项目。

这门课程的很大一部分致力于向你介绍机器学习,以及你如何开始学习。

我喜欢这门课程注重实践而不是理论,因为这是我通过实践学习的最佳方式。它确实复习了理论,但更简短,这样你就可以获得足够的理解来将其应用到项目中。

我仍在学习这门课程,并希望将学到的知识运用到我自己的项目中去!

包扎

这是一篇相当长的文章。如果你一路走到这一步。感谢您的阅读!

我一直想写这篇文章,因为我觉得它会对开始数据科学之旅的其他人有所帮助。我希望通过分享我的经历和我学习的步骤/课程,可以帮助你发现自己的道路。

还有一点我想补充的是,每个人走的路都不一样。从方法,到他们学习的时间。当事情变得困难时,不要感到沮丧。有很多次我想放弃,但还是放弃了。关键是要持之以恒,小步前进。

这是我关于数据科学的第一篇文章,希望以后会有更多的文章。如果您有任何问题或意见,请在下面留下您的反馈。你也可以在 LinkedIn 、T witter 或 IInstagram上与我联系。

我如何在 2018 年艰难地学习数据科学

原文:https://towardsdatascience.com/how-i-learned-data-science-the-hard-way-in-2018-6ae4aa21cd6?source=collection_archive---------3-----------------------

没有科学学位也开始学习数据科学

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

当你没有科学学位时,你如何开始学习数据科学?在我调查这些工作机会时,几乎所有的工作机会都将数学、统计学、计算机科学或至少一个量化领域的教育列为要求。我没有。

我能打破现状,加入这个我渴望的社区吗?我决定以艰难的方式自学。

一个问题引起了我的兴趣。如果我把自己推向极限,在六个月的时间里我能学到多少?

斯科特·扬的故事一直激励着我。他用一年时间自学了麻省理工开放式课程的四年计算机科学课程,每周工作 35-60 小时。除非你尝试一下,否则你永远不知道自己的极限。有时候,做一些看似不可能的事情甚至很有趣。

今年五月,我开始了自己的麻省理工挑战。我上的第一门课是麻省理工开放式课程的单变量微积分。我很快重新发现了我长期以来对数学的热爱,并沉迷于这些在线讲座。我最喜欢的是吉尔伯特·斯特朗的线性代数课。有几个星期,我会在他幽默的讲座中醒来,感觉就像和一个老朋友在一起。

在强化学习期间,我选择了一个新的主题作为一周的重点,每天尽可能多的时间来研究它。为了最有效地学习,我尝试了不同的学习技巧:设定专门的学习时间,中间有休息时间,通过练习和记笔记积极学习,重复排练以创造长期记忆,结合视觉和听觉材料,并把概念教给一个朋友。这些技巧帮助我实现了每天雄心勃勃的学习目标。

开始是最困难的,然而陡峭的学习曲线可以非常令人满意。到六月中旬,我几乎看完了所有我能在麻省理工开放式课程中找到的数学讲座。打下数学基础只是第一步。但这是一个巨大的进步。

我刚开始时的一个挑战是——你不知道自己不知道什么。

当我偶然看到西班牙的高级统计和数据挖掘暑期项目时,我不知道如何选择课程。我应该做贝叶斯网络还是贝叶斯统计?这些课程的名字对我来说都太陌生了。然而,不管课程是什么,我只是把自己投入到学习环境中。

选择和比我更有专业知识的人在一起——这带来了真正的变化。我遇到了来自电信、计算机科学、金融、数学的不同群体,他们都对机器学习充满热情。我从他们那里学到的和从课程中学到的一样多。

在获得了一些用 Python 编程的实践后,我准备继续学习吴恩达的机器学习课程。他关于机器学习和深度学习的讲座太好了,我几乎看上瘾了。他的课程中提供的练习对测试我对理论的理解和用代码实现算法非常有帮助。

许多其他数据科学和机器学习资源也是一个很大的帮助:数据营,特雷弗·哈斯蒂和罗布·蒂布拉尼的《统计学习导论》,亚塞尔·s·阿布·穆斯塔法的《从数据中学习》,以及麻省理工学院开放式课程的一系列讲座——人工智能,计算思维和数据科学导论,以及算法导论。

我发现,在学习机器学习的时候,几乎不可避免地会遇到一些你不懂的内容。我采纳了康奈尔大学“阅读数学”手册的建议——当你不能马上理解某些东西时,把它放在一边一段时间:

“你可能经常(也许通常)发现,当你回到你不太理解的东西时,它会在你研究的进一步的东西的启发下变得清晰,即使进一步的东西本身是模糊的。”

然后我想我应该让自己参与数据科学社区。所以我搬到了柏林。在这里,我加入了每周一次的数据科学项目小组,参加了各种公司举办的聚会,并自愿参加机器学习会议。

我强烈推荐你作为志愿者申请参加会议,尤其是那些学习预算有限的人。作为回报,我有了一个很棒的机会去见数据科学家,问他们问题,并与正在招聘的公司交谈。我很幸运遇到了良师益友,他们一直与我分享他们的宝贵意见。这真是一个令人惊叹的社区。

然后我来到了卡格尔。我一直推迟在 Kaggle 上做比赛,因为我觉得我可能排名不好。我发现将 Kaggle 视为一个学习平台比视为一个竞争平台要好得多。观察其他人如何在 Kaggle 上处理数据科学项目是我学习的最有效方式之一。

回想起来,在某个时间点,我很害怕。在我的第一次学术会议上,作为一名商科毕业生,我发现很难证明自己的理由。我发现很难坐在一个房间里,在这里我不理解很多介绍的话题。

但是,这是一个很大的但是在这里,事情变得更好,好得多,我几乎忘了我是从哪里开始的。我几乎忘记了半年前,我已经 10 年没有上过数学或科学课了,今天我正在用公共数据集解决不同的数据科学问题。到 2018 年底,我正准备参加一些公司的面试,这些公司是我 6 个月前做梦也想不到会成为数据科学候选人的。

在你踏上了这段旅程之后,你周围的一切似乎都变了。你开始从一个新的角度看待每个问题,并想知道:机器学习会是一个解决方案吗?

活在恐惧中。继续前进。

我是如何学会不再担心并爱上图形数据库的

原文:https://towardsdatascience.com/how-i-learned-to-stop-worrying-and-love-the-graph-database-ef8af4ac7a8?source=collection_archive---------4-----------------------

形象化

有时,关系模型不能解决这个问题

1970 年,为 IBM 工作的英国计算机科学家 Edgar F. Codd 有一个想法,这个想法至今仍然指导着我们的工作方式。这个想法就是“关系模型”,在这种模型下,数据将被存储在具有特殊指定列的表中,这些列用于将一个表中的值与另一个表中的值相关联。

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

Edgar F. Codd (1923–2003). Father of the relational database.

Codd 为他的模型制定了 12 条规则。虽然今天的大多数数据库并没有遵循所有这些标准,但是 Codd 模型仍然在很大程度上规定了数据的建模方式。它非常结构化和数学化,遵循它的人总是使用“元组”、“关系代数”和“第三范式”这样的术语。

如果你在 20 世纪接受过正式的计算机科学培训,你可能已经记住了 Codd 的模型。如果你和我一样,这不是一个愉快的回忆。我的教授在教室的墙上挂了一张 Codd 的照片,像《1984》中的老大哥一样怒视着我们。

但是 Codd 模型是有效的。它增加了数据建模的严谨性,确保了一个干净的行列结构,非常适合 Tableau 这样的可视化工具。所以在我继续之前,向 Codd 博士致敬。

也就是说,至少有一个领域不是很好。

当我们试图理解各种数据点之间的联系时,尤其是那些可能在同一列中的数据点,这个模型就崩溃了。例如,专栏中谁是把关者和影响者?回答这个问题的 SQL 可能会非常复杂。

进入图形数据库,基本上把 Codd 的模型扔出了窗外。

以 Neo4j 等产品为代表的图形数据库基本上是一个连接数据库。这项技术使得脸书或 LinkedIn 这样的社交网站能够在用户之间建立联系。当亚马逊向你推荐一种产品时,是因为图表显示了你和购买该产品的其他人之间的联系。

在这篇文章中,我研究了如何将图形数据库的能力应用于比脸书和 LinkedIn 处理的项目规模更小的数据分析项目。我还研究了一些可视化图形数据库输出的工具。

我其实不太喜欢“图形数据库”这个术语。对于外行人来说,这听起来像是一个设计用来制作条形图或类似东西的数据库。但这是已经决定的名字,所以我会用它。不过,在本文中,我将把从图形数据库创建的可视化称为“网络”。我觉得更有描述性。

在我继续之前,我应该指出两点:

  1. 虽然这里的例子将集中在 Neo4j 和相对较小的一组可视化工具上,但我并不轻视他们的竞争对手。只是 Neo4j,Tableau 等少数几个是我最了解的工具。
  2. 这里给出的数据模型和例子非常简单。你不应该认为它们是图形数据库能够处理的复杂性的极限。

图形数据库基础

为了理解图形数据库,您必须暂时将表、行、列和外键放在一边,考虑以下四个对象:

  1. 节点,大致相当于数据库中的一行。
  2. 关系(也称为边),即节点之间的连接。
  3. 标签,将具有相似属性的节点和边组合在一起。您可能会设想一组节点在一个标签下组合在一起,类似于关系数据库中的一个表。
  4. 属性,它们是与节点和边相关联的名称/值对。

假设我们想要创建一个图表数据库,其中包含人们以及他们首选的数据可视化工具。一个非常简单的实现可能是这样的:

“雷·罗宾逊”将会是聚集在“T2”标签“人”下的多个节点中的一个。他可能有属性,比如他的“城市”或“公司”。

Ray 将通过标签为“TOOLS】的关系连接到其他节点,这些节点分组在标签为下,用于他使用的各种产品,例如 Tableau 和 Neo4j。

每个产品节点都有一个属性,指示它是什么类型的工具,比如“图形数据库”或“可视化”。

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

A simple graph data model

这样,您就有了一个简单的数据模型,它提供了一些在关系数据库中不容易实现的强大查询功能。

想象上面的模型有数千个“Person”节点,每个节点都连接到每个人使用的产品和类型的节点。例如,用户基于与他们有联系的其他用户的偏好而采用某个产品的可能性有多大?

这里需要注意的是,图形数据库不需要像关系数据库那样对数据类型和结构进行严格控制。

例如,一个节点可能与另一个节点具有不同的属性集。节点之间的关系也是如此。并且可以随时添加新的属性和标签。

至于数据类型,不用担心。如果您一直在用整数值填充某个属性,突然决定将它用于文本字符串,那么您的图形数据库不会阻止您。

对于我们这些从 Oracle、Postgres 的 SQL Server 等关系数据库开始职业生涯的人来说,这是一个很难理解的概念。这显然会带来一些风险。您可能很快就会把数据模型搞得一团糟。

但对于试图确定原因、结果和关系的分析师来说,图表模型往往更胜一筹。

简单说说图数据库属于哪一类:

一些人认为,除了文档和键值数据库之外,图形数据库只是另一种类型的“NoSQL”技术。这有一定的逻辑,因为图形数据库不使用 SQL,尽管它们有自己的查询语言。

但是许多图形倡导者认为,图形数据库的独特功能使它们自成一类。我不想在这里解决这个争论。

有了这个(非常)简短的图表解释器,让我们来看一些例子。

一个没有数据库的图形数据库:Gephi

体验可视化图形数据的最简单方法是使用一种工具,严格地说,它根本不是数据库。

Gephi(https://gephi.org/)是一款免费的开源软件,最初由法国贡比涅科技大学的学生开发,现在由非营利的 ge phi 联盟支持和管理。

这是一个 Java 驱动的桌面应用程序,可以在 Windows、Mac OS 和 Linux 上运行,只要你有 Java 7 或 8、足够的内存和专用显卡。

Gephi 是本文中最有趣也最令人沮丧的工具。有趣的是,它允许您开始处理图形数据,而无需设置、配置和学习图形数据库的细节。我们稍后会谈到令人沮丧的部分。

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

The Gephi user interface

为了展示 Gephi 的能力,我使用了一组在杰弗里·爱泼斯坦(Jeffrey Epstein)自杀后三天从 Twitter 上捕捉到的数据。爱泼斯坦被判虐待年轻女孩,与唐纳德·特朗普(Donald Trump)和比尔·克林顿(Bill Clinton)等许多名人有联系。

爱泼斯坦的自杀是一个保证让阴谋论者兴奋的故事,它没有让人失望。几乎立刻,推特上就出现了关于克林顿可能与爱泼斯坦之死有关的猜测,并以#克林顿身体计数为标签进行传播。

没过多久,#ClintonBodyCount 的故事就进入了主流媒体,主流媒体经常使用 Twitter 作为吸引大量公众关注的故事的预警系统。

事实上,在这三天里,只有 48,571 条#克林顿身体计数的推文,按照推特的标准,这并不算多。尽管受到媒体的关注,但这个数字本身就提出了一个问题,即#克林顿体重指数到底有多重要。

但更有趣的是,当数据被可视化为一个带有 Gephi 的网络时,我们发现了什么。

尽管#ClintonBodyCount 的故事受到了所有的关注,但下面的 Gephi 可视化显示,它是由一小群有影响的人推动的,他们的 Twitter 个人资料(“喜剧演员”…“# QA non 研究员”…“红,白和 F You 的主持人”)表明他们几乎不在美国政治讨论的主流中。

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

Gephi visualization of the #ClintonBodyCount network.

Gephi 分析中最重要的一步是将您的数据放入两个电子表格或。Gephi 可以导入和读取的 csv 文件。

第一个称为“节点”文件,基本上是您希望可视化的原始数据。

第二个称为“边”文件,定义节点之间的关系。下面显示的是 edges 文件,它需要数据争论。我用 Tableau Desktop 和 Tableau Prep Builder 创建的。

但是这真的取决于你习惯使用什么工具。如果你熟悉 VLOOKUP 这样的函数,Excel 可能会工作得很好。

您还可以运行一些查询并从任何关系数据库输出文件,或者用 R 或 Python 创建一个列表。

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

Gephi “edges” file for the #ClintonBodyCounty analysis

edges 文件有两个必需的列:“Source”,这是启动某种操作的节点;以及“目标”,它是接收由源列发起的动作的节点。

对于#ClintonBodyCount 分析,逻辑是这样的:

1)发送推文的任何用户都列在源列中。

2)在源列中被用户提及(“@提及”)或转发(“转发”)的任何用户都在目标列中列出。

目标专栏中的用户被提及或转发的次数越多,他或她在#ClintonBodyCount 网络中的影响力就越大。

第三列“权重”在 Gephi edges 文件中是可选的。它表示源节点和目标节点之间的连接强度。在本例中,我通过将“@ reference”和“retweet”列中的值相加来计算。

当节点和边文件被加载到 Gephi 时,有趣的事情就开始了。你首先会看到一个巨大的、难以理解的方块,显示所有的连接。但是通过使用 Gephi 中包含的各种布局算法和统计函数,您将能够将您的可视化处理成类似上面显示的#ClintonBodyCount 图形。

我用来形象化#ClintonBodyCount 网络的统计数据被称为模块性,它衡量网络中社区的强度。

您还可以从 Gephi 导出您的作品,并使用您选择的图形工具增强外观。我使用了 Affinity Designer,这是一个可以在 Mac OS 应用商店买到的图形程序。

这就是 Gephi 的乐趣。现在,关于令人沮丧的部分说几句:

  1. Gephi 崩溃了。很多。由于它不能自动保存你的工作,崩溃会让你付出很多努力。我发现经常存钱很有用。由于没有 Cmd-Z 或类似的函数来回滚您的更改,我还发现在保存时创建新版本很有用。
  2. 这是一个内存和 CPU 猪。我通过关闭一切可以关闭的东西(浏览器、电子邮件客户端等)获得了最好的结果。)并让 Gephi 攫取它想要的所有系统资源。
  3. 它的许多最佳特性都是由独立开发者创建的插件的结果。当一个新版本的 Gephi 出来时,你喜欢的插件可能需要一段时间才能赶上。

所有这些听起来都很原始。尽管如此,对于一个不花你一分钱,也不需要后端数据库的工具来说,它有一些令人印象深刻的功能,这些功能是你在 Tableau 等传统可视化工具中找不到的。

Gephi 资源

要了解更多,网上有很多教程。请确保您正在查看的版本与您的 Gephi 版本一致。最新版本是 0.9.2。

肯塔基大学图书馆制作的关于 Gephi 的最好的视频教程之一,可以在:https://www.youtube.com/watch?v=2FqM4gKeNO4找到

此外,Paul Oldham 有一个很棒的教程,是关于使用 Gephi 来可视化专利网络的,在:【https://www.pauloldham.net/gephi_patent_network/

现在是一个实际的图形数据库:Neo4j

维护数十亿字节企业和政府数据的数据库管理员仍然对图形数据库持相当大的怀疑态度。可以公平地说,在可预见的未来,关系数据库将统治世界。

在图形世界中,似乎最受关注的公司是 Neo4j(【https://neo4j.com/】)公司,该公司 12 年前在瑞典发布了第一个开源图形数据库。如今,它的总部设在加州圣马特奥,客户包括瑞银、易贝和沃尔玛等公司。其政府客户名单包括美国陆军和美国宇航局。

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

The Neo4j desktop (left) and data browser (right).

为了研究 Neo4j 的能力,我选择了由美国司法部维护的外国代理人注册法案(FARA)数据集。FARA 法律实质上要求在美国代表外国政府工作的“代理人”(即游说者)向联邦政府注册。

未能注册者(保罗·马纳福特,下来吧!)可以被起诉,送进监狱。但是起诉很少。所以首先要知道的是数据集可能不完整。

为了让数据更有趣,我加入了由透明国际维护的清廉指数。根据政府和商业专家的观点,该指数根据公众感知的腐败程度对各国进行排名,并在 https://www.transparency.org/cpi2018 做了充分的解释。

合并后的数据会生成一个数据集,显示美国哪些代理代表了被认为腐败最严重和最不严重的县。使用传统的行列数据结构,您可以对数据做一些非常有趣的事情。

例如,这是 Tableau 中的一个可视化图,显示了根据感知的腐败程度进行颜色编码的国家。点击一个国家,用户可以看到谁在美国代表这些国家。我突出显示了俄罗斯。

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

Foreign agents visualization with Tableau.

如果这就是你想要的,那很好。但如果你想调查这些国家和代理商之间的联系网络,你最好的选择是像 Neo4j 这样的图形数据库。这意味着将数据从行列格式迁移到图形数据库所需的节点和边中。

为图表建模数据是一个非常深奥的课题。如果你愿意的话,你可以在 https://neo4j.com/developer/data-modeling/的 Neo4j 建模教程中读到更多关于它的内容。

但我会首先为您的数据建立一组类别,然后考虑每个数据点属于哪个类别。对于 FARA 的数据,很明显有三个类别:

  1. Country,它包括关于某个特定国家的所有数据。
  2. 外国委托人,包括特定外国的企业或政府机构等实体。
  3. 代理人,他们是在美国注册代表外国委托人的说客。

您可以从将节点加载到 Neo4j。csv 文件,使用简单的“从文件加载 CSV…”脚本,这在 https://neo4j.com/developer/guide-import-csv/的的 Neo4j 文档中有详细说明。这非常类似于将数据加载到关系数据库的表中。

这样,您就有了三种类型的节点,每种节点都在各自的标签下分组。很明显,您的数据模型需要两种不同的关系:一种将每个国家连接到基于那里的外国委托人,另一种将外国委托人连接到他们的注册代理。

您可以通过执行图中每个关系所显示的命令来创建这些关系,如下所示。

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

Neo4j data model for the Foreign Agents Registration (FARA) database, including Cypher code to build relationships.

Neo4j 有一个全功能的查询和命令语言“Cypher ”,它本质上是 SQL 的图形数据库版本。我发现它相对直观,容易学习。有关赛弗的详细信息可在 https://neo4j.com/developer/cypher-basics-i/获得。

Cypher 的主要优点是,它允许您只用几行代码就可以完成许多行嵌套 SQL 所需要的工作。

例如,假设您想要创建代表俄罗斯企业和政府机构的代理之间的连接的网络样式视图。上面的可视化表格向您展示了如何处理行和列数据。

但是如果您的数据在一个图模型中,几行 Cypher 就可以创建一个完整的以网络为中心的视图,如下所示。

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

Graph of agents representing Russian interests in the U.S., with the query that produced it.

虽然 Tableau 可以通过一个 API 与 Neo4j 集成,但它不能提供这种数据视图。数据以行列格式返回到 Tableau。因此,除非您愿意经历许多变通办法,否则您仍然无法获得数据的真正网络视图。

Neo4j 数据浏览器很不错,尤其是对于一个免费社区版 Neo4j 自带的工具来说。但相对来说是骨瘦如柴。你在上面看到的是你能承受的极限。

批准

Neo4j 的企业版附带了一个功能更加全面的可视化工具,名为 Bloom。Enterprise Neo4j 还可以容纳其他网络可视化工具,如 Linkurious(https://linkurio.us/)和 Keylines(https://cambridge-intelligence.com/keylines/),这两个工具都是商业许可的。

这就把我们带到了定价问题上。如果您的组织对 Neo4j 的企业版感兴趣,并且符合该公司对初创公司的定义(【https://neo4j.com/startup-program/?ref=subscription】),您可以免费设置 Neo4j 的有限部署。

如果你不是一家初创公司,但仍然需要企业版,价格会变得有点模糊。该公司不公布其定价模式,而是要求潜在客户联系其报价。一位代表告诉我,“配置选项很复杂,定价取决于具体情况。”。

旧的“逐案”定价模式绝不是你想从企业软件公司听到的。但 Neo4j 有一个很棒的产品,显然可以蒙混过关。如果你跟他们追求企业牌照,得到了答案,我很想听听。

GraphXR

一个有趣的新可视化工具是 graph xrhttps://www.kineviz.com/,它可以很容易地与免费的社区版 Neo4j 集成。安装后,GraphXR 只是作为 Neo4j 桌面上另一个可用的数据浏览器出现。

您可以在 GraphXR 浏览器中输入与 Neo4j 中相同种类的 Cypher 查询。但结果更有活力,坦率地说,近乎迷幻。例如,编写以下 Cypher 查询以返回在美国代表中国利益的代理的图表:

MATCH(c:Country)-:BASE->(f:foreign principal)-由 - > (a:Agent)代表

其中 c.Country = “中国”

在 Neo4j 中,结果将类似于我们已经看到的俄罗斯网络。但是在 GraphXR 中,它看起来是这样的:

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

GraphXR visualization of agents representing Chinese interest in the U.S.

GraphXR 提供了一些控件来调整可视化的外观。例如,您可以调整节点的大小和颜色。您还可以放大和缩小您的可视化,移动节点,甚至旋转它,以从不同的角度查看它。

然而,背景颜色仅限于一个选项:黑色。我还发现节点的标签有点模糊不清。在这个时候,似乎没有办法改变这一点。

有趣的是,GraphXR 还支持使用 Oculus Rift 耳机的虚拟现实可视化。我不确定我是否完全理解这个商业案例,但我希望有一天能看到它。显然,虚拟现实数据可视化的美好新世界即将到来。

批准

上面的可视化是用 GraphXR 的“Explorer”版本创建的,该版本是免费的,可以作为 Neo4j 桌面的插件运行。它有三个项目的限制。

下一步是“分析师”版,它有 30 个项目的限制,每年花费 1320 美元。

最后,还有“企业”版,它允许无限

项目。可以通过 GraphXR 了解价格。

最后

我认为可以肯定地说,我们在这方面存在能力差距。一方面,我们有传统的可视化工具,如 Tableau,它内置了强大的分析功能,以及对可视化几乎每个方面的粒度控制。

但是它们的能力在很大程度上受到我们都知道的行列数据模型的限制。对于试图理解个人和组织之间关系的分析师来说,这并不理想。

像 Neo4j 这样的图形数据库解决了这个问题,但是在可视化网络方面有所欠缺。对可视化“外观和感觉”的控制往往是非常初级的。

像 Linkurious 和 Keylines 这样的商业网络可视化工具解决了这个问题,但代价是只为 Neo4j 这样的图形数据库授权一个额外的产品。对于小企业和自由职业分析师来说,这可能会让人望而却步。

国际组织实施 Neo4j/Linkurious 的示例

在 https://offshoreleaks.icij.org/stories/wilbur-louis-ross-jr 可以看到调查记者联盟(ICIJ)。

对于 Tableau 及其竞争对手来说,理想的解决方案是将图形数据库可视化添加到他们现有的功能中。Tableau 目前有一个 Web 数据连接器,允许它向 Neo4j 提交用 Cypher 编写的查询。

你可以在 https://neo4j.com/blog/neo4j-tableau-integration/的了解更多信息。但是数据是以表格格式返回到 Tableau 的,所以我们仍然没有能力生成网络可视化。

我怀疑我们没有从 Tableau 这样的工具中看到这种能力的原因是:a)对它的需求还不存在;b)开发它需要大量的工作。

但就像老歌里说的“我可以做梦,不是吗?”

我是如何用 6 个月的时间在 FAANG 找到一份工作的

原文:https://towardsdatascience.com/how-i-leetcode-for-6-months-and-land-a-job-at-amazon-b76bdfc79abb?source=collection_archive---------0-----------------------

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

My leetcode progress

这篇文章也可以在我的博客上找到

作为例行程序的 Leetcode

2018 年 11 月初,当我在佐治亚理工学院参加在线硕士课程机器学习并有全职工作时,我开始将 Leetcode 作为日常工作。很难找到足够的时间从头开始解决一个问题。所以,我的策略是阅读讨论中的问题和大多数投票赞成的答案,一个标签一个标签地去理解问题。我发现在尝试自己解决问题之前阅读解决方案对我非常有帮助。它节省了我的时间,并允许我在同一个标签中阅读许多问题。所以我将来可以很容易地识别特定类型问题的变体。这也避免了早期不必要的挫折。许多人可能会感到沮丧,因为他们甚至不能在一开始就解决简单的问题。其实这很常见。尽早阅读解决方案实际上有助于避免这种情况。我知道有些人可能不同意这一点。YMMV。(除了 leetcode,我还整理了这个对我有帮助的资源列表

在我看来,这对于大多数不是算法宗师的人来说更有效。但是不要误会我的意思,那几天我还是需要早上 6 点就起床去 leetcode。

注:如果你对大型科技公司的面试流程非常陌生,破解编码面试的是你的朋友。它非常详细地展示了招聘过程,并涵盖了一些准备策略。我个人是几年前从这本书开始的。这帮助我设定了对面试的期望,这样我在面试过程中就不会有太大的意外。

休息和减速

2019 年新年前后,我上了强化学习和高级操作系统两门硬课,开始了我的学期。这两门课程每周耗费 30 多个小时。到那时,我已经简单地“解决”了大多数标签,并且能够通过查看问题来识别问题类型。然后我开始试着不看答案就解决问题。从 1 月到 4 月,我的投稿少了很多。这种放缓对我在面试中将记忆转化为实际解决问题的技巧非常关键。通过编写代码,它确实加强了我对所学算法的理解。

Leetcode 竞赛

从一月到四月,我尽可能尝试每周一次的竞赛。在竞赛中,我从来没有能够解答所有的四个问题。大多数时候,我解决了两个问题,有时是三个。优势在于竞赛提供了面试环境,因为它有时间限制。

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

一个伙伴

幸运的是,我有一个朋友在准备面试,我们一起上了 leetcoded。我们经常讨论和分享资源,比如面试准备材料。一个例子是,当我甚至难以理解像硬币变化这样的 DP 问题时,我的朋友可以分享他在网上找到的 DP 问题总结给我。总结讨论了自下而上和自上而下解决方案之间的区别。此外,有一个伙伴,你不会在旅途中感到孤独,所以你不会轻易放弃。

白板

大多数时候,我在屏幕上做 Leetcode 问题和竞赛。为了模拟更真实的面试,我定期在白板上解决问题。

招聘人员来了

是时候考验我的努力了。它来到了我紧张的学期结束。与此同时,我慢慢听到一些公司的招聘人员打来电话。我得到了 A 公司、微软和优步的面试机会。我意识到这是验证我的实践的最佳时机,并接受了所有的 hr 电话屏幕。这三家公司都很容易通过人力资源筛选。

背靠背面试

电话采访安排得很快。电话会议纯粹是 leetcode 类型的问题。我在电话或在线评估期间完成了所有的编码面试。这部分,leetcode 确实帮了不少忙。在我读完问题后,我能够确定使用什么算法或什么数据结构。有时候,我在执行中遇到困难。但是在挣扎的时候我觉得自己足够自信。

优步让我先去现场邀请。然后亚马逊和微软加快了现场流程。两周内我去了三个地方。当我登陆网站的时候,我购买了 leetcode premium,这样我就可以找到这些公司的问题库。每年 159 美元或每月 35 美元。我继续我的 leetcode 之旅。但这一次,我的策略只关注这三家公司的热门问题。Leetcode 有一个功能,可以显示最近不同时期、6 个月、1 年等公司标记的问题。最近 6 个月的问题应该是最相关的。当我敲打它的时候,大约有 350 道优步题,我计划至少完成一半。这意味着我需要每天练习 10 个问题,因为我的时间有限。这一次,我没有在陷入困境后立即投入到解决方案中,而是尝试用简单的解决方案来解决它,然后尝试优化。(如果你不能马上想到一个最佳解决方案,这也是你在面试中应该做的)。我总是分析我的解决方案的时间和空间复杂性,这在面试中非常关键。

从东海岸两次飞到西海岸对我来说有点残酷。但是 YOLO。令我惊讶的是,在 5 轮面试中,我只得到一个 leetcode 类型的编码问题。其他两轮编码是相当开放的。我相信他们是在测试候选人在设计之初就需求提出问题的能力。当然,领导原则贯穿了 5 次面试。

相比之下,优步和微软的编码问题就像 leetcode 问题一样。问题被清楚地告知,输入和输出的例子被提供。期望分析时间复杂度和空间复杂度。

注意:如果你是数据结构和算法的新手,我发现算法破解编码面试斯坦福在线课程都是很好的开始。对于模式设计知识很少的候选人来说,首先设计模式是理解许多不同模式的良好开端。对于更高级的用户,我强烈推荐 GoF 的设计模式:可重用面向对象软件的元素。这几天在学习或者工作的时候我还在用它做参考。最后但同样重要的是,系统设计,如果没有任何系统设计经验,人们可能会发现研究系统设计很有帮助。这涵盖了你将在工作或面试中看到的许多话题。它训练你如何分析需求。然后,如何根据业务需求选择设计。

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

获得报价

最后,我在一家餐馆找到了一份工作。综上所述,Leetcode 溢价还是物有所值的。这并不是说你一定会在面试中看到完全相同的问题,但是你可以有更好的意识来找到解决问题的正确方向。也在我被一个问题卡住的时候提升了我的信心。

我的帖子:

系统设计面试准备:如何使用长轮询、发布订阅和队列异步处理长时间运行的作业

FAANG Ace 系统设计面试

我如何获得 6 个月的代码并获得 FAANG offer

这些都是帮我找到方工作的资源

系统设计面试的成功步骤

Ace FAANG 系统设计面试:数据库、NoSQL、SQL

系统设计面试准备:缓存

我关于金融和科技的帖子

从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅

全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中

全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据

全栈开发教程:在 Angular SPA 上可视化交易数据

强化学习:Q 学习简介

我如何利用奖学金和免费学习来学习最新技能

原文:https://towardsdatascience.com/how-i-leveraged-scholarships-and-free-learnings-to-learn-latest-skills-5ad26228bb22?source=collection_archive---------12-----------------------

你也可以!

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

任何停止学习的人都老了,不管是三十岁还是八十岁——亨利·福特。

T2:如果你是科技界的名人,这一点尤其正确。几个月前,我完成了我的学位考试,和我一样,我相信你们中的许多人一定有同样的感受——这不是学习的终点;这只是开始。

在这个博客里,我分享了我的学习之旅,贴出了一个传统的大学学位,很少有奖学金&免费学习(还有链接+技巧),你也可以访问它来提升自己的技能。事实上,当我在开始我的旅程三个月后写这篇博客的时候,我的学习追求还没有完成,它已经远远超出了头脑可以伸展的范围,感谢所有的机会!

安全和私人人工智能挑战奖学金由脸书人工智能和乌达城

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

收到 Udacity 的邮件让我兴奋不已,因为我被选中参加这个挑战课程,我确实花了一些时间来摆脱我的“时刻”(准确地说是几天。)

程序的一般演练—

挑战课程分为两个阶段,从第一阶段中选出的参与者有机会进入第二阶段。下面提到的细节会让你对第一阶段有所了解。第二阶段的结果将于 9 月公布。

  1. 该课程历时 3 个月,选定的参与者有机会学习如何将隐私保护工具和技术应用于深度学习,以便您可以利用 Pytorch(脸书的深度学习框架)解决更困难的问题,并创建更智能、更有效的人工智能模型。
  2. 学生们有机会进入 Udacity 充满活力的学生社区,并有机会参与他们的各种社区活动,如#60DaysofUdacity,在这里你可以连续 60 天发布你的学习成果,以及#ama_sessions(向我提问会话),Project Showcase Challenge 等。
  3. 人们也可以选择参加这些# UdacityFacebookScholars 私人举办的竞赛,如黑客马拉松、博客写作竞赛、智力竞赛等。符合比赛的语境。
  4. 被选中的 300 名参与者将有机会免费获得 Udacity 的深度学习或计算机视觉纳米学位,并获得证书!🎁

虽然挑战赛第一阶段的报名已经截止(早在 5 月份),但您可以在这里访问免费课程—https://www.udacity.com/course/secure-and-private-ai-ud 185

如果你对 Udacity 的这些奖学金挑战感兴趣,请在这里报名通知—【https://www.udacity.com/scholarships】

更新:我已经被选为安全和私人人工智能挑战的获胜者,现在将继续深度学习纳米学位!

WorldQuant 大学的数据科学

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

我选择的第二个学位课程是 WorldQuant 大学的数据科学学位课程。它有一个课堂外的方法来教授数据科学,无论你是初学者还是想增加你的知识的人,这个课程都是继续学习的完美选择。

一般演练—

  1. 本课程由两个模块组成,根据您在第一个模块中的表现,您将被选择参加第二个模块。
  2. 要被选中参加学位课程,你可以填写表格,并根据你的 Python 和数学基础知识回答问题。
  3. 一旦选中,你就可以开始你的免费课程了!关于该计划的所有其他详细信息将通过您的电子邮件地址与您分享。
  4. 他们每年开 4 次会。
  5. 如果您愿意申请 9 月 30 日开始的下一期课程,请在 9 月 9 日前申请。快点!

此处适用—https://wqu-apply.thedataincubator.com/

你也可以在这里查看他们的金融工程模块—https://wqu.org/programs/mscfe

谷歌云 30 天

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

一般演练—

使用谷歌云平台免费了解谷歌云架构!

  1. 你必须在每个月底之前完成 3 个任务(注册后你会收到一封关于这些细节的邮件。)
  2. 完成后,你可以期待——得到谷歌开发人员的认可,得到酷酷的 schwags。
  3. 获得 1 个月免费参加 Coursera 的 ML GCP 专业化认证课程
  4. 完成 Coursera 课程后,获得 GCP 认证的折扣。

敬请关注即将到来的 30 天 GCP:【bit.ly/30daysongcp】

跟随@ Google devsin进行全部更新!

一般常见问题和提示

  1. 因为课程的费用是包括在内的,所以你需要投入大量的时间来彻底地学习所有的东西,并且参与他们的社区,如果有的话。
  2. 这些课程不限制任何年龄组或背景的注册,只要你的基础清楚,或者你可以从他们社区的其他参与者那里寻求帮助,你都可以申请。
  3. 每门课程都有专属优惠——有了 WorldQuant,你可以将课程推迟到下一节课,有了 Udacity,你可以接触到社区参与者共享的大量机会。✌

我希望这能帮助任何想学习新东西的人,也许对最新的趋势和技能保持乐观,或者申请一个新的角色——任何理由都是开始的好理由!

祝大家学习愉快!👨‍🎓👩‍🎓

疑问? 把他们引到这里:contact.shubhangijena@gmail.com

在 LinkedIn 上联系我:www.linkedin.com/in/shubhangijena

我如何利用数据科学、机器学习、信用风险和 TALF 贷款在 3 年内获得 37%的年回报率

原文:https://towardsdatascience.com/how-i-made-37-a-yr-in-profits-for-3-yrs-using-data-science-machine-learning-and-talf-loans-6fe8c133e3ec?source=collection_archive---------7-----------------------

在本文中,我将继续我的一系列数据科学的实际应用。这次是一个涉及数据科学、投资管理、保险和金融量化分析的实际应用,分析固定收益工具中的风险/回报机会。

此练习指的是 2009 年初定期资产贷款工具(或“TALF”)产生的机会。TALF 是一项政府计划,旨在以非常低的利率向合格投资者提供高达 1 万亿美元的贷款,最终目的是在 2008 年金融危机后启动经济。

此处说明的练习数据来自于 2009 年 2 月初 TALF 创建后的普遍市场情况。美联储和美国财政部向合格投资者发放的首批贷款已于 2 月底到位。

为了理解这个机会,一些证券化市场(资产支持证券)和金融危机起源的基本知识是必要的,因此这将在下面解释。如果你想了解更多,在我之前的文章**“使用数据科学的阿尔法一代&定量分析——ABS/TALF】中讨论了金融危机关键技术要素的大量背景,你绝对应该阅读(此处为),以获得关于该过程关键要素**的更多知识。事实上,机会的根源在于这些因素:1)世界经济停滞不前,2)世界经济与 ABS 市场的联系。****

导致危机的证券化市场有多大?谁是资产支持型证券市场的领导者?

从 1985 年成立到 2007 年,美国证券化市场经历了几乎 19%的年增长率,达到约 1.2 万亿美元发行的峰值。图 1 显示了证券化市场的增长及其与利率的关系。

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

Figure 1: The availability of a growing supply of fixed income instruments backed by uncorrelated asset classes helped bring down financing costs.

投资银行的美国定量分析师开发的证券化技术允许生产商获得运营和扩张的廉价融资。事实上,从 1985 年到 2007 年,5 年期 AAA 级 ABS 的平均息差从 120 个基点(1.20%)下降到 20 个基点(0.20%)。

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

Figure 2: Fueling the purchase of risky pieces of Asset Backed Securities (and other securities) was the staggering amount of assets under management by hedge funds, which grew from USD $350 bn in 1996 to USD $1.4 tr in 2006 (almost 3% of the world’s GDP that year). Source: SAGA Capital, LLC.

对冲基金管理的资产(AUM)惊人地增长,从 1997 年的约 3500 亿美元增长到 2006-2007 年超过 1.4 万亿美元的峰值,支撑了这种廉价融资的爆炸式增长(图 2)。对冲基金为向全球市场注入大量廉价资本做出了贡献,因为相当数量的对冲基金通过收购风险较高的部分(通常是评级低于投资级的股票)来支持 ABS 发行。

与此同时,对冲基金的 AUM 达到顶峰,证券化交易量在 2006 年达到顶峰,每年发行超过 1 万亿美元。花旗、雷曼兄弟、美国银行、JP 摩根和其他几家美国银行承担了全球 1/3 以上的流量(图 3)。

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

Figure 3: The numbers of dominant banks with the know-how and resources to create ABS grew from less than a dozen in 1996, to more than 50 in 2006. Still the largest players remained the ones shown in the chart, with Lehman Brothers among the leaders. Source: SAGA Capital, LLC.

资产支持型证券对国内和全球经济有什么影响?

从自上而下的角度来看,证券化市场有助于产生新的货币化资产,并间接有助于提高美国和世界其他地区的就业率,以及国内和全球经济的扩张。在美国证券化市场经历增长和创新的同时,普通美国公民的债务负担急剧增加,从 1958 年占个人可支配收入(PDI)的 50.4%增加到乔治·w·布什政府时期占 PDI 的 100%以上。

在同一时期,美国公民降低了个人储蓄率,以支持更高的消费支出,从罗纳德·里根政府时期 PDI 的 11.20%降至乔治·w·布什政府时期的 0.25%。

美国消费者支出在世界经济中的重要性及其与美国 GDP 的关系并不为人所知。2008 年,美国经济是迄今为止世界上最大的经济体,美国消费者支出占美国 GDP 的 70%。为了了解它有多重要,图 4 中的图表显示了美国消费者支出与几个国家 GDP 的对比。

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

Figure 4: Top GPD’s (2007), in billions of USD vs just one of the components of US GDP: consumer spending. Source: SAGA Capital, LLC.

在危机前的 15 年里,美国经历的宽松信贷市场刺激了美国和世界其他地区的大部分 GDP 增长,这是一种我解释为图 5 所示的循环。美国消费者支出推动的工业增长对全球市场的公司利润产生了直接影响,事实上现有的每一家股票交易所的市值增长就是证明。

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

Figure 5: US Consumer Spending & Securitization fueling the world’s economic growth. Source: SAGA Capital, LLC.

美国消费者通过信用卡或即时互联网批准的房屋净值贷款获得的简单、随时可用的信贷,鼓励消费者减少储蓄,增加消费,并通过购买新房、汽车、更好的教育和其他商品和服务来提高生活质量。

在 2007 年中期,证券化市场中一种急剧增长的资产类别开始显示出问题的迹象。该资产类别是次级抵押贷款,这种贷款在一些投资银行、养老基金和对冲基金中非常受欢迎,因为在证券化中,它的一些部分被认为风险低,回报诱人。

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

Figure 6: ABS Outstanding as of 2009. Source: Federal Reserve Bank of Chicago

图 6 显示了从 1995 年到 2008 年末未偿资产支持证券的增长情况。我们可以清楚地看到,“其他”和“房屋净值”占总市场的 2/3 以上。

“其他”类别包括衍生工具,如 ABS of ABS、CDO、CDOs squared 等。一旦某个特定资产类别出现问题,包含该资产类别的资产支持证券就会出现问题,包含该资产的资产支持证券也会出现问题。

下图 7 显示,典型的 3 年期信用卡 AAA 级证券化的利差从 2007 年初的约 0.2%高于 LIBOR,上升至 2009 年 12 月的近 6%。同样,市场上的证券化交易量从 2006 年的 1.2 万亿美元下降到 2009 年第一季度的不到 300 亿美元,与峰值相比下降了 98%。

两家美国金融机构的问题导致了资产支持型证券利差的增加:1)美国第五大银行贝尔斯登,和 2)第四大银行雷曼兄弟。这两家公司都拥有资产支持型证券的自有资本,此外还大量参与了全球各类证券化产品的创建

这种可用于融资的资金的急剧减少及其相关的融资成本的增加造成了全球金融僵局,需要当局加以解决。

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

Figure 7: Spreads for AAA rated credit card ABS (as well as all other ABS) skyrocketed in late 2008 and peaked as Barack Obama became President of the US. Issuance of credit card ABS were fueling the domestic and global economies. Source: SAGA Capital, LLC

为了启动国内经济,并试图扭转其正在经历的普遍趋势,两项新计划开始实施:1)TARP 或问题资产救助计划,在老布什政府的最后几天实施,以及2)TALF 或定期资产贷款工具计划**,在奥巴马总统就职几天后由奥巴马政府宣布。**

问题资产救助计划实质上是对所有人的救助,除了雷曼兄弟,这是布什政府设计的。TALF 是奥巴马政府设计的美国经济再激活计划,但是它对接受 TARP 救助的机构有一个固有的第 22 条军规。

美联储启动了经济

2008 年 12 月 15 日,巴拉克·奥巴马宣誓就任美国总统。2009 年 2 月 2 日,美国美联储宣布了 TALF 的主贷款和担保协议,概述了该计划的规则。

尽管在布什政府执政的最后几天向美国银行系统注入了大量资金,但消费者贷款或支出并没有增加。

奥巴马政府时期的美国美联储和财政部认识到,重振 ABS 市场对于恢复消费者信贷流动至关重要。因此,美联储和财政部推出了 TALF 计划——一项 1 万亿美元的计划,旨在吸引投资者购买由特定资产类别支持的传统和新发行的 AAA 级证券化产品。

通过为投资者的购买提供大部分融资,美联储和财政部希望对 ABS 的新需求将压低发行银行和金融公司的信用利差,并鼓励投资者购买,促进贷款的进一步证券化。反过来,这会让更多的消费者以更低的利率获得更多的贷款。

TALF 计划提供了购买合格债券所需的高达 95%的资金,利率(固定或浮动)为 1-3 年期 LIBOR 加 1%,最低贷款额为 1000 万美元。

TALF 计划通过提供真正的无追索权贷款,提高了投资者的风险回报水平。因此,实质性的杠杆作用是可能的,从而大大提高了潜在回报。损失没有被杠杆化,因为这些是真正的无追索权贷款,不需要提交额外的抵押品或强制赎回抵押品。

为了启动这一流程,一家符合美国政府要求的美国投资公司(无论是新成立的还是现有的)必须在一级交易商处开立账户,并确定投资者想要购买的合格债券。

TALF 采购走查

为了理解当时程序的逻辑,让我们来看一个假设的购买。

首先,让我们假设我们回到了 2009 年初宣布 TALF 计划的第一周。让我们假设高盛公司的一个假设的固定收益投资组合经理(PM)检查他的彭博屏幕,看到类似下表的东西,在数以千计的 TALF 合格证券的第一页下面:

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

A few of TALF eligible securities. Source: SAGA Capital

高盛项目经理认为,花旗集团发行的价值 30 亿美元的 CCCIT 2009-A1 A1 AAA 信用卡贷款证券化是一个值得购买的好债券。检查伦敦银行同业拆放利率和利差的时候,他可能看到过:

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

ABS spreads

高盛的总理决定购买价值 1 亿美元的债券,期望他的 1 亿美元投资在 3 年内获得大约 4.79% (278bps + 201bps)的年回报率。对于固定收益投资组合经理来说,这还不错。

对冲基金经理呢?3 年 4.79%的年回报率不是对冲基金寻求的那种回报,尤其是当最低回报率超过 5%的情况并不少见的时候。

但 TALF 杠杆 彻底改变了风险的分配 ,让低收益的 AAA 级 ABS 安全成为最好的游戏,也是华尔街最不为人知的游戏。

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

After checking all the documentation, requirements, etc., the expected annual returns under no loss scenario when buying TALF eligible securities could be summarized in the above formula.

继续我们假设的高盛 PM,他要求他的 Jr .分析师获得 TALF 杠杆的当前列表,并发现对于 3 年期信用卡 AAA ABS,美联储通过 TALF 可以以 LIBOR 负 100 个基点的利率,以 1000 万美元的最低投资,为他承诺的每 6 美分贷出 94 美分。

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

Actual TALF leverage for eligible securities in February 2009

应用上面的公式,项目经理看到,在接下来的 3 年中,购买该债券的预期年回报率(在零违约情况下)从 4.79%变为 32.67%

((((2.01% + 2.78%)*0.06) + ((2.78%-1.00%)*(0.94)))/0.06) = 32.67%

现在,这种回报甚至对那些连 ABS 都不看的多空对冲基金来说也很有趣。但是,如果对冲基金度过了危机,他们最不想做的事情就是将基金锁定在 3 年的买入并持有策略中。

此外,在多空对冲基金中模拟股票市场运动和/或进行高频算法交易的定量分析师往往不太了解证券化部分、信用迁移模型、二项式扩展模型、copulas 等。他们迷路了,很高兴他们还有工作。“不,谢谢,我过了”可能是他们在偶然遇到机会时的想法。

对投资经理来说,TALF 计划最好的部分是,杠杆资本是一种无追索权的贷款,这意味着在违约的情况下,来自美联储的贷款不必偿还!

所以,也许利用这个机会的最佳人选是我们假设的高盛(或美国银行,或摩根大通,或任何其他公司)的项目经理。)毕竟他们有知识有资金对吧?

不对。由于高盛以及大部分银行业都直接或间接地接受了布什的 TARP 计划的救助,他们被排除在奥巴马的 TALF 计划之外。如果你不知道,布什对高盛的救助计划(通过 AIG 救助)是由时任财政部长和高盛前首席执行官亨利“汉克”保尔森策划的。(几年前,我曾在美国国际集团风险金融部工作过,所以我很了解当时的情况)。

因此,实际上,这个机会最初被少数高净值个人、少数了解资产支持型证券并愿意承担风险的对冲基金和家族理财室,以及更少数量的量化分析师(或数据科学家,尽管他们当时不叫这个名字,而是“特殊机会量化分析师”或“风险金融量化分析师”)所利用,他们了解模型,拥有领域专业知识,并集合他们的资源来满足投资要求。

在机构方面,太平洋投资管理公司和贝莱德是两个最大的资产管理公司,它们确实充分利用了这个机会(在游戏的后期),但这是另一回事了。

系统的 TALF 采购计划的预期收益——使用 Python、Pandas、Numpy、SciPy 和 Statsmodels 时间序列分析的蒙特卡罗模拟

因此,我们回到 2009 年,让我们想象以下场景:我是一名定量分析师/数据科学家,为一家从未投资过低收益率 ABS 的家族理财室提供建议。

家族办公室的投资经理想知道,为什么我认为投资 1 亿美元于 TALF 合格证券是个好主意。为了决定他们是否会为我的想法提供资金,我的模型需要回答以下问题:

  • 如果家族理财室在 4 周内投入 1 亿美元,预期年回报率的分布是什么?我建议第一周 4000 万美元,第二周 3000 万美元,第三周 2000 万美元,第四周 1000 万美元。
  • 如果他们承诺用 1 亿美元的资金购买所有债券,而不考虑购买时的利差,那么亏损的概率有多大?
  • 在 TALF 合格证券中,我们能期待有多少个堕落天使
  • 如果我们根据购买时的利差和杠杆来区分购买哪些债券,那么获得超过 5%的最低回报率的可能性有多大?
  • 假设没有债券违约,这种策略的预期年回报率中值是多少?
  • 在提议的投资组合中,以基点表示的预期违约是多少?
  • 家族理财室能指望什么样的平均杠杆?
  • ABS 的投资组合的平均买入持有期是多少?

我将在本文中回答一些与我的模型在现实生活中的性能有关的最后问题:

  • 我的利率模型有多符合现实?
  • 我的模拟相关性表现如何?

在回答这些问题之前,我要说的是,该模型的行为符合预期,并且实现了回报,您将在本文的其余部分了解到这一点。这不是一次学术练习,而是一次真实的交易,是的,数千亿美元可以以 LIBOR 负 1%的利率借入 3 年期资金。

系统模型化

本文长话短说,我假设 1 年期和 2 年期伦敦银行同业拆放利率与 3 年期伦敦银行同业拆放利率相同,并根据模拟的 3 年期伦敦银行同业拆放利率进行所有计算(保守假设,因为 3 年期利率通常比 1 年期或 2 年期利率更贵)。

一年期 ABS 息差等于三年期 ABS 息差减去这两个期限之间的平均历史差异(截至 2009 年 2 月 18 日)。两年期 ABS 息差将是这一差额的一半。

整个分析的步骤如下:

  1. 模拟信用卡、学生贷款、房屋净值信用额度(HELOC)、汽车贷款和伦敦银行同业拆借利率的 N 条相关 3 年期 AAA 利差路径,每周取样,从 TALF 主贷款协议宣布之日开始。
  2. 从 3 年期价差重新创建 1 年期和 2 年期价差。
  3. 对于为期 4 周的购买计划的每一周,模拟购买 4 种合格资产中的一种,概率由截至 2009 年 1 月的 ABS 未偿资产分布给出。将美联储折减应用于相应的资产,并使用上面 1 和 2 中计算的资产类别的利差来估计无损失预期回报。
  4. 模拟债券从最初的 AAA 评级到其他评级和违约状态“D”的迁移。跟踪债券在其生命周期中的信用质量变化。
  5. ABS 不进行交易,而是由美联储作为贷款的抵押品持有,直到到期或债券违约。
  6. 策略是买入并持有,因此一旦在模拟中收购了一项资产,我们就不需要对市场价格波动建模。没有市价标记。
  7. 展示相关分布回答问题。

训练、测试、分割

2000 年至 2010 年的时间序列如下所示:

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

我将数据分为两部分:TALF 公告之前(用于培训)和 TALF 公告之后。列车数据是我在 TALF 宣布的时候所能得到的。

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

危机时期如下。测试阶段从最后一条黑色虚线开始,在奥巴马总统上任后,息差从峰值开始下降后不久。

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

Milestones of the financial crisis

均值回归和自相关

均值回归是一种假设,即资产价格将趋向于某个长期平均值。这可能会发生在利率、商品、货币等方面。与平均水平的偏差有望恢复到平均值。

自相关或串行相关是信号与自身的相关,作为时间延迟的函数。它常用于信号处理中分析函数或一系列数值。

以下是汽车贷款、信用卡贷款、学生贷款和 HELC 贷款 AAA 级证券化的 LIBOR 和 3 年期利差的自相关图。

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

Auto correlation for LIBOR rate

通过检查伦敦银行同业拆放利率的滞后,我们可以看到有几个滞后具有统计意义的积极和消极的自相关。它们都是基于自身的许多滞后参数来预测未来 LIBOR 利率的良好候选对象。我决定使用一个简单的自回归模型,因为模拟冲击的更复杂的模型可能会显示失真,因为我们已经处于冲击情景中。我可以使用的另一个模型是 Vasicek 模型,它包含了诸如逆转速度等因素。

通过我决定使用的简单自回归模型,今天的 LIBOR 利率可以设置为某个平均值,加上昨天值(phi)的一部分,再加上一些噪声。对于稳定的进程,phi 值需要在-1 和+1 之间。

如果这个过程只是噪声,φ= 0,而如果是一个的随机游走,φ= 1。如果 phi 为负,该过程显示均值回复。如果 phi 为正,过程显示动量。****

下图中,rt 是利率的时间序列。利用上述 LIBOR 利率的自相关数据,我们可以将未来利率定义为其滞后期的函数。第一个是 AR1,第二个是 AR2 等等。

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

以下是 ABS 价差的自相关图:

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

Auto-correlation for auto loans and student loans time series

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

Auto-correlation for HELC and credit cards time series

生成上述自相关和显著性图的代码在下面的要点中,进一步扩展了 pandas 自相关功能,以便返回数据帧以及显著性约为 1.96 标准差的滞后列表:

Auto-correlation and significant lags for time series

通过检查 ABS 和 LIBOR 利率的滞后,我们看到有许多滞后我们可以使用,但我们如何避免过度拟合或欠拟合我们的时间序列模型?

自回归模型的阶数

尽管我们可以对所有资产使用所有有效的滞后,但我们可能会过度拟合我们的模型。

一个解决方案是拟合许多模型(AR1、AR2、AR3 等。),测量每个模型的阿凯克信息准则 (AIC)和/或贝叶斯信息准则 (BIC),并确定 AR 的哪一阶给出我们最低的 BIC 或 AIC。

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

BIC for LIBOR and selected AAA ABS spreads

根据他们的 AIC 或 BIC,高于 AR1 的模型可能会过度拟合我们的模型,因此,我将使用 AR1 模型模拟所有资产的利率。

确定最佳参数的代码如下:

一旦我确定了要使用的最佳滞后,我就为所有 ABS 利差和 LIBOR 利率创建了一个 AR 参数字典。

相关

MC 模拟需要生成保持其历史相关性属性的模拟速率。

为简单起见,我计算了相同到期日的不同资产类别之间的相关性,并假设,例如,3 年汽车 ABS AAA 利差和 1 年汽车 AAA ABS 利差的相关性为 100%(这与现实生活中的行为在大多数情况下是接近的)。

对于多元随机数生成器,我最初使用 scipy 函数这里使用,但是发现使用乔莱斯基分解在计算上更有效。

我还将生成一个 date_index,它将包含我们分析的所有未来日期,直到我们将购买的模拟债券的潜在最长到期日。

代码如下:

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

AAA 级资产在持有期内被降级或违约的概率

为了估计这一点,我创建了一个函数,基于 AAA ABS 在一年内的一般历史转移概率定义了一个转移矩阵,不包括抵押贷款。

这一 1 年的转换矩阵可用于模拟从任何初始状态(AAA、AA、A、BBB、BB、B、CCC)到任何其他状态加上“D”的转换,使用单状态马尔可夫过程。

然后,我们可以通过将 1 年过渡矩阵添加到以时间为参数的递归函数中,来估计给定年限内的过渡概率。有了这个,我们可以在模拟中导出运行函数的许多转移向量,这将帮助我们估计概率。

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

pyabs, credit migration estimation

单一利率情景下的模拟杠杆购买

这里的过程如下:利用模拟的和适当相关的 LIBOR 利率和利差情景之一,我们在第一周模拟购买 4 个合格资产类别中的任何一个,以模拟显示的任何普遍市场利率,并利用美联储提供的杠杆作用。

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

TALF leverage per type of ABS as a function of term (f_risk_capital), probabilities of 1, 2, and 3 years issuance (p_term), and probabilities of acquiring each of the asset classes (p_issuance)

有了这些模拟市场条件,我们可以估计无损失回报,并决定是否购买。然而,我们不知道我们是否会在这些购买中遭受损失。为了了解这一点,我们需要对违约进行建模,但我们不会将这一知识用于我们的购买决策。我们将只使用预期年回报率和最低预期回报率。

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

Example of a run of the simulated purchase program under one of the simulated and properly correlated interest rate and spread scenarios

在上面的模拟场景中,在 2009 年 3 月 6 日的第 3 周(指数 2 ),我们可以购买 2012 年 3 月 2 日到期的 1 . 66 亿美元的 AAA 汽车贷款 ABS,仅承诺 2000 万美元的资本和 1 . 46 亿美元的美联储贷款。在这种普遍的市场条件下,我们的预期年回报率为 7.82%。

假设最低回报率为 10%,我们就不会购买那种特定的债券。此外,我们模拟的 3 年马尔可夫转移表明,债券在其生命周期内保持 AAA 评级。因此,在这个特定的场景中,我们会购买指数为 0,3 和 4 的债券。这些模拟市场条件将允许我们锁定 2.5 亿美元(25.42%)3 年,1.66 亿美元(63.09%)1 年,1 亿美元(20.46%)1 年。结果是只有 6000 万美元资本的 5 . 16 亿美元投资。

这个特定的模拟显示,第一个债券遭受了从 AAA 到 AA 的模拟降级,这可能会轻微影响其在降级之日的市场价格,但这与我们无关,因为 TALF 的购买必须持有至到期,按市场定价不是问题。

以下代码生成了一个熊猫 df 字典,您可以将它传递给解决方案数据框来回答您的所有问题:

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

结果

回报及其百分位数的分布:

  • 如果我们承诺向购买计划投入 1 亿美元,预期年回报的分布是怎样的?

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

  • 如果我们承诺用我们的资本购买每一种债券,而不考虑购买时的利差,那么亏损的概率是多少?
**len(solution[solution['exp_annual_r']<0])/(sims*purchase_weeks)0.049836**
  • 在 TALF 合格证券中,我们能期待有多少堕落天使?(过渡到 BB、B 和 CCC 评级)
**solution['final_rating'].value_counts(normalize='True')

AAA    0.884480
AA     0.101102
A      0.011288
BBB    0.001516
BB     0.000852
B      0.000418
CCC    0.000214
D      0.000130**
  • 如果我们根据购买时的利差和杠杆来区分购买哪些债券,那么获得超过 5%的最低回报率的可能性有多大?
**strategy_df = solution[solution['exp_annual_r']>0.05]
len(strategy_df)/(sims*purchase_weeks)0.881436**
  • 这种策略的无损失年回报率的中位数是多少?
**strategy_df['exp_annual_r'].median()0.37166140387288993**
  • 基点中的预期默认值是多少?
**(strategy_df[strategy_df['final_rating'] == 'D']['total_purchase'].sum()/strategy_df.total_purchase.sum())*100001.2697864542783506**
  • 对于每 1 美元的采购,我们期望投入的平均资本比例是多少?
**strategy_df['risk_capital'].sum()/strategy_df['total_purchase'].sum()0.0854416650602756**
  • 投资组合的平均寿命是多少?
**sum(strategy_df['term']*strategy_df['total_purchase'])/sum(strategy_df['total_purchase'])2.241573279710343**

有了所有这些结果,2009 年 2 月向家族办公室提出的建议是向 TALF 计划投入资金,在不亏损的情况下,预计 2 到 3 年的年回报率为 37%。基本策略是,只有在模拟市场条件下,根据真实定价数据(息差、杠杆和到期日)考虑的债券允许他们获得大于 5%的年回报率时,才进行投资。

预期违约被建模为不到 10 个基点,他们可以预期每 8.5 美分的 TALF 合格资产支持证券的多元化投资组合获得约 91.5 美分的杠杆。

利率和利差保持在模型的置信区间内。

我的利率模型有多符合现实?模拟的相关性表现如何?

下面你可以看到橙色的实际 3 年信用卡 AAA 利差,绘制在许多模拟路径上,虚线代表中间值、第 25 和第 75 个百分点。

虽然购买策略集中在 TALF 的前 4 周,但图表显示了 10 周的结果。实际利率保持在预期范围内。

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

Simulated spreads for 3 years AAA student Loans

所有其他已实现的比率都接近模型的预期。

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

Simulated LIBOR rate

查看上图的另一种方法是绘制购买计划最后一周的价差分布,并将实际值与 AR1 模拟模型的预期中值进行比较。

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

LIBOR

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

student loans, credit card, helc, auto

更好的可视化,伦敦银行同业拆放利率预测值变化分布的动画:

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

Time series: Distribution of forecasted LIBOR rates

随着我们预测时间的推移,我们开始看到分布形状的长尾,但这并不影响我们的短期预测。

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

Animation showing distribution of expected LIBOR rates, from the Monte Carlo simulation and at different points in time

正如我们之前看到的,模拟的中值很好地估计了实际实现的值。

模拟相关性也在预期范围内。下图显示了随机选择的 100,000 个模拟场景中的一个场景与实际场景的相关性。

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

Simulated vs realized correlations

违约和过渡保持在模型预期范围内。

贷款期限约为 3 年;然而,最丰厚的回报是在项目第一年的投资中获得的,当时的利差相对于后来几年来说很高。

据我所知,没有投资者遭受损失。

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

Outstanding TALF loans from inception of program to end. Source: Federal Reserve Statistical Release

回想起来,TALF 计划好吗?

芝加哥联邦储备银行不久前发表的一篇论文得出结论,TALF 计划阻止了美国经济陷入比实际更深的困境。

该论文引用了一些学者的研究,他们在研究中发现,当使用家庭层面的数据和综合数据时,融资条件和汽车销售之间有很强的联系。

具体来说,他们发现 2007 年至 2009 年间汽车销量下降的 38%可以归因于新车贷款利率的上升和家庭对信贷条件不利的看法。

可能面临借贷限制的家庭的购买对信贷条件的变化极其敏感,但对预期的收入变化不敏感。研究发现,利率每增加 1 个标准差,汽车总销量就会下降 13 万辆。

该研究表明(直接或间接)通过让消费者更容易获得和负担得起信贷,TALF 支持了汽车销售和整体经济。

还有其他类似 TALF 的机会吗?我们怎样才能找到他们?

金融危机总是伴随着机遇,但就我而言,领域专业知识、快速原型开发/编码和快速决策是发现和利用金融机遇的唯一途径。

(目前)还没有通用的人工智能来指出围绕信用风险、大宗商品、激进主义等特殊机会的投资。创业公司开发的所有“信用风险人工智能”都只是重新利用 Scikit-Learn 和/或谷歌的 TensorFlow 代码,大部分是由金融领域专业知识很少或为零的机器学习工程师拼凑而成的。他们的主张在非定量分析师看来不错,但我向你保证:他们的主张在紧张的现实生活中是站不住脚的。这些开发人员不分析尾部风险和变化的相关性:他们不知道如何分析。

在许多情况下,开发人员甚至不知道他们的一些创造已经内置了技术缺陷。例如,Marcos López de Prado 博士在其著作《金融机器学习的进步》中记录了 Scikit-Learn 交叉验证中的一个 bug。那段代码是内置在我所见过的许多人工智能的信用风险中的。

您可以查看以下问题:

**** [## 评分函数不知道类 _ Issue # 6231 sci kit-learn/sci kit-learn

与 pydata/patsy#77 的@amueller 讨论(评论)。建议:将可选的“标签”参数添加到…

github.com](https://github.com/scikit-learn/scikit-learn/issues/6231)

当然,也有一些例外,有一些产品是好的。

关于独特的投资机会,是的,我计划在未来的文章中写一些有趣的机会,在机会被套利出去之后。由于显而易见的原因,在具体的机会出现时写下它们是不明智的。

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

The TALF opportunity analyzed by my advisory firm back in early 2009

事实上,你在这里学到的几乎所有分析和建模都是在 10 年前完成的,当时 TALF 宣布成立。我正积极地试图筹集资金以利用这个机会,背景信息加上本文中的所有模拟都是我向感兴趣的各方介绍的一部分。

目前,我正在 Bitbucket 中为我的私人回购协议编写专有代码,并分析几个机会,这些机会就像 TALF 支持它们一样令人兴奋。

但除了潜在的交易和结构化事件,我所看到的从数据科学中获利的一些最佳机会是存储在大公司和政府机构的筒仓中的原始数据,这些数据可用于产生新的收入来源。在大多数情况下,拥有这些数据金矿的公司出于多种原因对此无所作为。

我希望这篇文章能帮助你理解奥巴马政府时期的政策带来的最佳投资机会之一,以及模拟模型如何在不确定的情况下帮助决策。

您可以在我的 Github repo 中找到本文中介绍的所有代码,以及一个 Jupyter 笔记本 here 中的使用示例。

如果你喜欢这篇文章,请告诉我,分享这个故事,并在下面留下你的反馈。

All the images, code, and graphs in this article belong to and/or have permission for distribution.

来源:

  1. 美国政府为固定收益工具的投资者创造机会。世家资本,2009 年 2 月。
  2. 资产支持证券市场、危机和 TALF。苏米特阿加瓦尔,杰奎琳巴雷特,水晶村,和玛丽克里斯蒂娜德纳尔迪。芝加哥联邦储备银行。
  3. 定期资产支持证券贷款工具:常见问题。纽约州美联储银行,2009 年。
  4. 美联储统计发布 H.4.1,“影响
    准备金余额的因素”,表 1。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

我如何在 Android 中为黑色素瘤检测制作 Skinly

原文:https://towardsdatascience.com/how-i-made-skinly-for-melanoma-detection-in-android-6ad00f0bd26d?source=collection_archive---------20-----------------------

将计算机视觉和 Android 与 TensorFlow Lite 和 Keras 以及所有定制数据相集成。

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

Medical Science and Computer Science have a great match!

机器学习(ML ) 在医学科学和健康行业创造了奇迹。经验丰富的医生获得的专业知识现在可以通过 ML 算法来学习,这些算法是用几行代码创建的。我将分享我关于 Skinly 的故事,这是一个可以检测黑色素瘤(一种常见的皮肤癌)的安卓应用程序。

[## skinly—Google Play 上的应用程序

Skinly 是一个研究项目,旨在通过您的 Android 设备检测黑色素瘤等疾病。它使用…

play.google.com](https://play.google.com/store/apps/details?id=com.health.inceptionapps.skinly&hl=en)

此外,我将参考各种提示,引导您找到包含相关代码的 Python 和 Java ( Android)文件。

GitHub Python 项目->https://GitHub . com/Shu bham 0204/Melanoma _ Classification _ with _ TF

GitHub Android 项目->https://github.com/shubham0204/Skinly_for_Melanoma

互动 Google Colab 笔记本->https://Colab . research . Google . com/drive/1t 1 syfzt _ OE 974 yti0 xqp 5 Tet 5 dhvo 77 f

当然是从 Python 和 TensorFlow 开始!

我想到的第一个问题是图像数据。一个人如何能够获取成千上万的黑色素瘤图像?

收集图像数据

我使用我一直最喜欢的 Fatkun 批量下载图片扩展,设法从互联网上提取了数百张图片。这个 Chrome 扩展允许我将谷歌搜索结果中的图片提取到我的电脑中。

  1. 为了训练,图像被调整到 32 * 32 的尺寸。
  2. 由于图像数量较少,对图像进行了增强,以便模型能够更好地概括。
  3. 在彩色图像(3 通道)上训练该模型。

提示:查看存储在 NumPy 文件(。npy)此处 。同样,对于查看图像预处理这个 文件

训练模型(使用 Keras)

该模型需要足够聪明,能够区分健康皮肤和有黑色素瘤斑点的皮肤。为此,我选择了暹罗卷积神经网络。

[## 使用暹罗网络和张量流从零开始进行人脸识别

人脸识别已经成为移动应用程序和许多其他机器中的常见功能之一…

medium.com](https://medium.com/predict/face-recognition-from-scratch-using-siamese-networks-and-tensorflow-df03e32f8cd0)

这些网络也用于人脸识别和许多其他应用。

Code for building the Siamese model in Python

提示:参考这个 文件

将模型转换为 TensorFlow Lite 模型

为了让这样的模型在 Android 上工作,我们需要将 Keras 模型(. h5)转换为 TensorFlow Lite 模型(。tflite)文件。然后,这个文件被加载到我们的 Android 应用程序中,我们在其上执行推理。

Conversion of Keras model to TensorFlow Lite model

提示:使用 岗位培训量化 帮助我大幅减少了模型大小。还有,参照这个 文件 进行换算。

开发 Android 应用程序(使用 Java)

Android 应用程序被赋予了美丽的颜色和设计,因此看起来很友好。Android Jetpack 的 导航ViewModel 组件让工作变得更加简单快捷。

下载图像进行比较

如果你以前使用过暹罗网,你会知道它需要一些数据来进行比较以产生一个分类。

假设,我们建立了一个暹罗神经网络,用于狗和猫之间的分类。神经网络将输入图像与狗和猫的图像进行比较,并输出显示最大相似性的类别。两张猫的照片会显示出更多的相似性。

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

Firebase Cloud Storage

对于 Android 来说,Firebase 云存储是存储图像然后下载它们的合适地方。

提示:参见 Firebase 云存储文档 Android 。还有,请看这个 文件 中的代码。

运行模型

TensorFlow Lite(版本=1.13.1)依赖项帮助我们加载。Android 中的 tflite 模型。您可以将其添加到您的build.gradle文件中。

dependencies {
    // Other app dependenciesimplementation **'org.tensorflow:tensorflow-lite:1.13.1'** }

然后,下面的代码获得范围为[0,1]的相似性得分。该方法逐步将输入图像与所有下载的图像进行比较,然后遵循以下步骤:

  1. 获取每个图像与输入图像的相似性得分。
  2. 分离具有最高相似性得分的前 K 个(值=5 或任何其他奇数)图像。
  3. 解析这五幅图像的类别。
  4. 输出五个图像类别中具有最高多数的类别。

Code for fetching similarity scores by running the model.

提示:加载时,TFLite 模型参见 此处 ,投票/分类参见此 文件

最终应用

最终的 Android 应用程序如下所示:

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

该模型可以根据较少的数据进行训练,但这种技术和想法可以扩展并进入主流生产。欢迎您的任何建议!

还有呢!

仅此而已!

使用 Android 和机器学习的医学可以达到很高的高度。谢谢大家,机器学习快乐!

我如何克服数据分析中的骗子综合症

原文:https://towardsdatascience.com/how-i-overcome-imposter-syndrome-in-data-analytics-8f6103be820b?source=collection_archive---------10-----------------------

我对数据专业人员真诚而简单的建议

在谷歌和维萨这样的数据和科技公司找到自己的位置

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

Source (Unsplash)

“恭喜恭喜!谷歌是一个工作和提高你的数据分析技能的好公司!!你会遇到非常聪明、有干劲的人,他们在做重要的大事。”我在 Visa 的同事向我表示祝贺。

2019 年 7 月,我被 Google 聘为数据科学家,与 ML 一起对抗滥用。

之前在 Visa 的同事听到我跳槽到 Google 的消息后,都调侃我很特别。对他们来说,谷歌是真正聪明的技术和数据专业人士的最终“朝圣”目的地。毕竟是“谷歌”,实现了那么多突破,从 DeepMind、Alpha Go 的科学成就,到量子计算至上。在他们的心目中,谷歌因其惊人的福利、薪酬和影响力而成为 2019 年的梦想雇主。在我任职的几天内,我在 LinkedIn 上收到了许多信息,要求推荐我进入谷歌。被谷歌聘为数据科学家是一个绝好的机会,总能激发我的同事们的梦想,包括我的同事。这太神奇了!我曾和这么多聪明且有动力的专业人士一起工作过。我有影响数十亿人生活的项目,我有惊人的津贴和学习机会。

但有时,我担心自己不够好。

冒名顶替综合症。

尽管取得了明显的成功,但这种不满足感仍然存在。冒名顶替者遭受长期的自我怀疑和一种智力欺诈感,这种感觉压倒了任何成功的感觉或他们能力的外部证明。—哈佛商学院

简单地说,冒名顶替综合症是一种持续的自我怀疑,将自己与他人进行比较。

事实上,统计学家表明,世界上超过 70%的人承认患有冒名顶替综合症。他们遍布各个行业,如医药、商业和教育。

就我而言,我有时会把自己比作更有能力的资深同行,他们也是 Kaggle 和 ML 的超级明星。我有时对自己的技能有自我怀疑;有一次,我花了很长时间破解密码,只要我开口,这些密码就唾手可得。我担心有一天 HR 会来说我在谷歌严格的招聘过程中是假阳性。在 Visa 和谷歌等大型科技公司,我有时会面临这种想法。

如果这种情况发生在你身上,那么你并不孤单。

在技术和数据领域,人们会通过你的影响对你进行客观评估。你将接受绩效评估,并与他人进行比较。由于数据分析一直在发展,您需要不断学习和提升您的技能。你今天所知道的,不一定是下个月的最佳实践。这就是为什么冒名顶替综合症在数据和技术领域更为普遍的原因,在这个领域,竞争非常激烈,人们总是需要不断地学习和产生结果。

把冒名顶替者当成你最好的朋友

在大型跨国数据和科技公司工作了 3 年后,我学会了一些克服这种自我怀疑的关键技巧。令人欣慰的是,我正在成长,生活得很好。

因此,我真诚地希望这篇文章能成为一个休息点,让你在数据分析的旅程中休息、成长和超越。这种方法对我很有效,我真诚地希望它对你和我的数据同事也有效。我相信你可以用的坚定的谦逊的专业面对你的冒名顶替者。

信念:了解你建造房屋的基础

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

Source: Unsplash

聪明人把房子建在岩石上。愚蠢的人在沙子上盖房子——摘自《马太福音》7:24–27,世界英语圣经

马太福音 7:24-27 是一段伟大的圣经经文,它一直是我的生活灵感,它谈到了骗子综合症的核心,你的“身份”。

就像智者如何把他的房子建在岩石上一样,你应该把你的个人身份建立在不可动摇的基础上,而不是建立在转瞬即逝的愿望上。对我来说,我的身份是作为一个基督徒,我已经通过耶稣基督的血称义。

遗憾的是,我在数据和技术领域的许多同事不幸将自己的抱负建立在成就、职业发展和金钱之上。他们对自己有很高的期望,当他们得不到想要的东西时会变得焦虑。

让我与你分享更多这方面的内容。分析就业市场增长非常快。就在几年内,许多大学开始提供数据科学学位,来自世界各地的成千上万的人注册。如今,这个学位已经变得和进法学院和商学院一样难了。

不幸的是,有太多的不确定因素影响着这种兴奋感的走向。数据科学家的就业市场正变得越来越饱和和虚幻。许多初创公司开始意识到,在没有坚实的工程和业务基础设施的情况下,他们在数据科学方面发展太快了。

因此,我认为,尽管需求不断上升,供应市场的竞争将会越来越激烈。这将成为你找数据分析工作的巨大威胁。

如果你看重高薪和职业发展,你会失望的。在我与新加坡国立大学等顶级大学的会谈中,我收到了一位研究生学者的提问,她非常想在分析领域找到一份好工作。外面的世界很残酷。

作为一个基督徒,我把自己当成一个教育者。我的目标是学习、分享和教育我的同行,因为我喜欢用分析解决业务问题。数据分析领域日益激烈的竞争成为我学习和分享的新领域。这就是我擅长数据分析的原因。

而不是利用工资、福利和灵活性等短暂的动机。我会用我的信仰、影响力和教育等持久的动机来继续学习和教学。

最后,我把自己描述成一名教育工作者,而不是数据工作者/专业人士,从而为 Visa 和谷歌提供了更多的价值。我代表两家公司参加了许多内部和外部会议,同时解决分析问题。

同样,你应该把你的身份(房子)建在岩石上,而不是沙滩上。你需要追求长期的影响,而不是短期的放纵。

谦逊:承认自己的弱点,寻求帮助

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

Albert (My best friend) and I study for OMSCS together on Saturday morning

承认自己的弱点,人无完人。找到能帮助你的人,并感谢他们。你的人际关系是你最大的资产,让你不断前进。

不要隐藏你的弱点。相反,揭露他们并寻求帮助。这将增长和提高你克服大挑战的韧性。

作为一个不会说英语的人,我缺乏沟通技巧来流利地表达我的想法。知道自己的弱点后,我从内部写作班和演讲会寻求帮助,以克服我浓重的口音和薄弱的语法。在不断的帮助下,我克服了口吃,说话流利了。在谷歌和维萨这样的公司工作,我的写作和沟通技巧已经成为我最大的财富。

学习分析,我总是邀请我的朋友一起学习。在我深陷困境的时候,他们还是和我站在一起的朋友。此外,我有优秀的经理,我可以和他们分享我的缺点,并一起坚持下去。没有上帝的恩典和这些人际关系,我不可能超越今天的我。

你应该承认自己的弱点。发现的瑕疵越多,就越应该寻求帮助,克服自己的差距。这是你成长的方式。

自信:掌握你最大的专长

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

Source

不要认为你比别人知道的少。你应该认为你可以为他人贡献巨大的价值。找到并专注于这个价值。

你应该找到能为你的公司带来的核心价值。它很重要,因为它给了你建立专业知识(SME)的空间。

对我来说,我在谷歌专门研究视觉识别网络钓鱼。我的座右铭是“大规模打击网络钓鱼滥用”。我的主要结果将集中在如何提高 ML 模型的质量来捕捉钓鱼网站。这是对我的核心表现唯一重要的事情。我非常重视所有权,并花了大部分时间来学习它。

通过拥有一项专长,并在重要的小事上成为主题专家,你会知道你的立场,并对你的工作负责。

骗子综合症的治疗:承认我们是人类

与冒名顶替综合症的斗争非常艰难。这不是身体上的,而是情感上的。它的源头是看不见的,通过你自我感知的心理缝隙渗透进来。治愈的方法是承认我们是人类,因此我们是有限的。

  1. 追求稳定而持久的信念,而不是有形而短暂的目标。
  2. 谦逊地承认我们充满了缺陷,然后寻求帮助,而不是隐藏它们。
  3. 拥有信心去做重要的小事,并作为数据专业人员对自己的影响负责。

所有这些技巧都很简单却很难…我鼓励你和我们一起踏上在数据分析方面出类拔萃的旅程。

索利·迪奥·格洛丽亚。

最后…

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

Source: Unsplash

我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。

在下面评论提出建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。

谢谢大家,编码快乐:)

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。

文森特还在10 日至 8 日BestTop 开设了他的一对一导师服务,指导你如何在谷歌、Visa 或其他大型科技公司获得你梦想的数据分析师/工程师工作。 如果你在寻找良师益友,请点击这里 与他预约。

最后,请通过LinkedInMedium Youtube 频道 联系文森特

我是如何用我的思想玩“拍打鸟”的

原文:https://towardsdatascience.com/how-i-played-flappy-bird-with-my-mind-e1e5b4da59ce?source=collection_archive---------48-----------------------

用我的脑电波控制经典手机🧠

玩过这个游戏吗?还记得它引起的挫败感吗?

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

“Game Over”

嗯,Flappy Bird 实际上已经从 App Store 中删除了,因为它太容易上瘾了。但是你猜怎么着?我创造了我自己的版本,你可以用你的大脑玩😉

等等,怎么会?

所以这之所以可能是因为一种叫做脑机接口的新兴技术。脑机接口(BCI)允许我们将大脑与外部机器或物体连接起来。

基本上,我们的大脑使用称为神经元的神经细胞在全身传递信息。神经元“开火”是为了将信息传递给下一个,就像连锁反应一样,直到信息到达大脑,反之亦然。这种神经活动导致大脑发出电磁波。

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

You can’t actually see the waves

这就是脑机接口发挥作用的地方——它们通过获取这些脑电波,分析它们,然后将其转化为命令。

获取脑电波

你可能想知道我们如何获得脑电波——毕竟,你看不见也感觉不到它们。嗯,一种用来记录大脑电活动的流行方法叫做脑电图(或 EEG😅).我选择的设备是 Muse 头带,用于冥想,但也可以用于开发应用程序。

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

Just wear it around your head and you’re good to go

头带连接到 Muse Direct 应用程序,该应用程序使用开放式声音控制协议将数据传输到我的电脑。

处理数据

因此,来自应用程序的数据被一个 Python 程序成块接收(几乎每毫秒左右),它看起来像这样。

b'Muse-C2C0/notch_filtered_eeg\x00\xacDX\x13rDO\x1f\xe3'
b'Muse-C2C0/variance_eeg\xd5\xf2CJ1\x83C\x8e\xf2{DG\xect'
b'Muse-C2C0/eeg\xb8\x7f\xc0\x00\x00\x7f\xc0\x00\x00'
b'Muse-C2C0/elements/blink\x00,i\x00\x00\x00\x00\x00\x00'
b'Muse-C2C0/elements/jaw_clench\x00,i\x00\x00\x00\x00\x00\x00'

这到底是什么意思?🤔嗯,数据是以十六进制形式接收的,这意味着我们必须将其转换为十进制,然后对其进行处理。我就是这么做的——这个过程涉及到一点数学,所以我就不解释了,把代码链接到这里。在转换数据后,我注意到每当我眨眼时都有大的尖峰信号。

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

I blinked three times during this recording

移动鸟

在这一点上,我们知道每当数据中有一个大的峰值时,用户就眨眼了。然而,情况并非总是如此——有时尖峰是由其他运动或活动引起的。

为了确定用户是否真的在眨眼,我们可以使用带通滤波器。虽然这看起来很复杂,但它基本上只是意味着识别与眨眼相关的频率范围👁️.就我而言,我做了一些测试,通过反复试验,我找到了一个相当好的范围。

最后一步是只要用户眨眼,这只鸟就会“扇动”——就这样!

Skip to 1:35 for a demo of the game

很酷,是吧?这只是冰山一角。从诊断抑郁症帮助瘫痪的机器人控制手臂,脑机接口拥有巨大的潜力!

我是如何用旅行推销员问题拯救圣诞节的

原文:https://towardsdatascience.com/how-i-saved-christmas-with-the-travelling-salesman-problem-3d85c190ed9d?source=collection_archive---------14-----------------------

圣诞老人最佳旅行的美好想象

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

Photo by Mitya Ivanov on Unsplash

一切都开始于一个下着雨的周六,我正在狂看网飞的一部新圣诞电影,突然听到有人在我公寓外面大声喊我的名字。我打开门,我看到一个高大的身影穿着红色外套,红色裤子,戴着一顶滑稽的红色帽子。我一生中从未如此惊讶过:盯着我看的那个人是圣诞老人本人!!!

TL;DR;他想从我这里得到的是一个软件来优化他 12 月 24 日的交货。他的要求是找到给定 342 个城市的最短路线。他需要一条始于拉普兰的循环路径。

这里有个视频方便大家看!【JavaScript 视频直播的链接在文末!

接下来是我和圣诞老人的对话!

圣诞老人的问题

安德里亚:嗨,圣诞老人,让我准备一杯茶,同时,你为什么不向我解释一下你的问题呢?

圣诞老人:吼吼吼!嗯,你知道每年 12 月 24 日至 25 日的晚上,我需要向全世界运送数十亿件玩具。这是一项非常具有挑战性的任务,安德里亚。我想知道计算机科学是否能简化我的生活。如何以最短的距离游览每一个城市?

安德里亚:好的,这听起来很熟悉,你能详细说说你的问题吗?

圣诞老人:当然。我有一份 307 个城市的名单,这些城市拥有最多的人口。我想知道哪条是只去这些城市一次的最短路径。你可能知道,我需要从我在拉普兰的家出发,而拉普兰也是我此行的最后一站!显然,我需要接触的城市不止 307 个,但我要的是战略规划,而不是运营。一旦我到达了主要的地方,我会和驯鹿一起想出如何移动到附近的城镇!

安德里亚:好的,圣诞老人。我认为你的要求很明确。实际上你描述的是计算机科学中一个非常经典的问题:它被称为 旅行商问题(TSP) ,它的定性表述和你刚才告诉我的差不多。不过我有个坏消息:**这很难解决!**让我画一个小草图,看看我们是否同意任务是什么!

假设我们只想关注美国的主要城市,那么您要寻找的路线如下所示:

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

圣诞老人:哦,安德里亚,这正是我想要的!只要记住我会飞!对了,你能给我解释一下为什么这么难吗?

安德里亚:TSP 属于一类被称为NP-完全问题 的问题。不确定你是否想知道数学定义,但是从实践的角度来看,在一百多年的研究中,没有人找到快速解决这些问题的方法,这些解决方案也不太可能存在。

圣诞老人:能有多难?

Andrea :如果你对你所要求的问题运行一个强力算法(这意味着测试所有可能的解决方案并挑选出最好的一个),它可能需要字面上的 数百或数千年才能得到结果!即使有现代科技。幸运的是,有一些更聪明的方法来处理许多 TSP 实例!

圣诞老人:吼吼吼!这是个好消息!我比那天掉进棉花糖池还开心!你能告诉我有哪些选择吗?

安德里亚:当然。有一些策略:

  • 如果你只是想要一个“足够好”的解决方案,我们可以使用启发式算法:这些方法通常非常快,但是它们导致的解决方案可能不是(并且通常不是)最优的
  • 我们可以使用一些聪明的**“精确的”算法**:潜在地,这将花费永远的时间,通常他们在可接受的时间内解决小问题,但有时他们很难实现。在这种情况下,解决方案总是最优的。
  • 我们可以用**混合整数线性规划:**如果按照这条路线,我们只需要写一个数学模型,然后用一个 MILP 求解器作为黑箱,就可以得到最优解。

在给你推荐之前,我可以知道你的预算是多少,你的截止日期是什么时候吗?

哦,不幸的是,我的最后期限很紧,我需要在周日晚上得到解决方案,所以你有一天半的时间来实施一切。另一方面,我有一个**无限的预算!圣诞国家银行可以印出我想要的那么多魔法美元!**还要注意,我只想要 307 个城市中的最佳路线!

安德里亚:嗯……好的。实际上,截止日期已经很近了;因为你需要最优路线,我们将使用混合整数线性规划(MILP) 。有很多工具我们可以使用,其中一些是商业的,像 CPLEX 或者 Gurobi 。其中一些仅用于学术研究,如 SCIP。其中有一些是开源的,比如 GLPKCBC

现在,你告诉我你有无限的预算,但是不幸的是,Gurobi 和 CPLEX 不接受魔法美元作为货币,所以我们需要使用 GLPK 或CBC;后者通常更快,可以和 Python 一起使用,所以我想我们有自己的基础工具!

圣诞老人造型

圣诞老人:呜!神奇的安德里亚!那我们开始吧。很多人不知道很久以前我毕业于数学系。如果你能解释一下这个模型,我会很高兴的。

安德里亚:哦,太好了,写下一些公式总是很有趣,这让我感觉更聪明!首先,让我们看看我们在一个示例场景中寻找的解决方案:

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

这可以大致描述如下:

  • 这是最优的,事实上,如果我们考虑节点之间所有可能的连接,我们只选择那些行驶到最短周期的节点。
  • 每个城市只被访问一次,这意味着我们在每个城市只进入一次,从每个城市退出一次(更正式地说,我们可以说每个节点正好有一条输入边和一条输出边)。
  • 我们只有一个周期!

为了使用线性规划表达这个解决方案,我们需要定义一些变量:假设我们有 n 个城市,我们可以为每对城市 ij ,yᵢⱼ 创建一个变量。

现在, yᵢⱼ 将等于 1,如果在我们的最佳路线中,我们需要从城市 I 直行到城市 j(直接,不首先通过另一个城市), yᵢⱼ 将等于 0,如果没有选择连接。cᵢⱼ是连接城市 i 和城市 j. 的成本让我来写这个模型:

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

Santa,这个对象的问题是关于“没有子旅程”约束(例如见上图)。子游是一个周期,不访问所有城市,而只是一个子集。我们希望有一个周期,,所以这些不等式旨在消除有多个周期的可能性

为了实现这个模型,我们应该为每个节点子集编写一个大致的“No sub-tour”约束。如果我们有 n 个节点,这将意味着 2ⁿ-2 个约束,这些约束不可能在计算机内存中表示(例如,n=300,约束的数量将是 20 . 370 . 359 . 763 . 344 . 860 . 862 . 684 . 456 . 884 . 093 . 781 . 510 . 514 . 514 . 364 . 6644 . 62 . 684 . 484 . 0993 . 381 . 514 . 514 . 514 . 514 . 514 . 514 . 514 . 5

这就是为什么我们需要找到一个更好的策略。

我们能做的是应用以下算法:

  1. 我们从模型中移除了“无子旅程”的约束,获得了所谓的“宽松模型”。
  2. 我们求解松弛模型到最优。这个解决方案很可能包含子旅游。
  3. 我们在当前的解决方案中找到所有的子旅程,并且我们将禁止这些子旅程的约束添加到模型中。
  4. 我们转到点 2 和迭代,直到没有子巡回检测到。

也许以后我们应该画个草图来阐明这些步骤。

圣诞老人:哦,那真是太棒了,安德里亚!谢谢解释!因此,我们的想法是移除大量的约束,只添加那些在单个周期内获得解决方案所必需的约束。啊甜蜜的回忆!这是解决这个问题的最好方法吗?

安德里亚:当然不是圣诞老人。我们可以将许多其他类型的约束添加到模型中,以减少达到最优解所需的迭代次数(它们被称为“切割”,来自切割)。但是你告诉我我们只有两天时间,所以我们要走最简单的路。

绘制算法

圣诞老人:呵呵安德里亚,我也想看一些代码。你知道,我们在圣诞老人家里的整个 IT 系统是用 Pascal 写的,我们真的需要一些更新。我们能不能做一些古老而珍贵的结对编程,这样我就可以开始钻研 Python 了?

安德里亚:哦,哇,绝对是圣诞老人。让我们一起来实现这一点。

正如我告诉你的,我们需要放松模型,消除“没有子行程”的不平等(这些在技术上称为秒,子行程消除约束)。我们的模型如下:

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

正如我之前解释的,如果我们解决了上面的**,我们可能会有那些非常著名的子旅游**。例如,下图是使用 18 个城市的宽松模型的解决方案:

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

如您所见,该解决方案满足所有约束:它是最优的,并且每个城市只有一条输入边和一条输出边。**但是我们不想要子周期!**如我所说,我们需要:

  1. 识别所有的“连接组件”(直观地所有连接在一起的节点组)。
  2. 用禁止那些组件的所有不等式更新模型。

让我画一个图表:

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

现在我们已经添加了所有新的切割,让我向您展示一下如果我们解决了这个问题会发生什么:

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

我们开始看到解决方案的形状!最后,如果我们迭代这个过程……嘣!

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

实施

安德里亚:是时候写些代码了。首先,我们需要一些图书馆。最重要的是 。来自他们的网站: *PuLP 是一个用 Python 写的 LP 建模器。纸浆可以生成 MPS 或 LP 文件,并调用 GLPK,硬币 CLP/CBC,CPLEX,和 GUROBI 来解决线性问题。*纸浆与 CBC 捆绑在一起。我们还需要 networkx ,一个 Python 包,用于创建、操作和研究网络的结构(我们需要它在优化过程中识别子旅程)。

让我们创建一个 Python 类来解决这个问题。首先,我们需要读取城市(这里我们可以有世界城市的人口和地理坐标列表)。因为你的房子位置不在列表中,圣诞老人,我们会把它添加到数据中;此外,我们将增加一些城市,以提高全球覆盖:

现在,我们需要一个函数来 计算两个位置 (使用经纬度坐标)之间的距离。你的交通工具是由神奇的驯鹿拉着的雪橇,因此直线距离将是一个很好的近似值:

不错!我们可以编写函数来构建模型:

很好。复杂的部分到了。

我们必须得到当前的解,并建立相应的图形。我们将用 networkx 。之后,我们需要一个函数来:

  • 检测连接的部件
  • 如果这些大于 1(意味着我们有子旅程),那么向模型添加新的约束。如果我们只有一个连通分量,那么我们就找到了最优值。

我们准备写求解模型的函数了!

完成了,亲爱的圣诞老人,我们只需要调用方法!

圣诞老人:我等不及要执行代码了!

安德里亚:我也是!让我们看看需要多长时间以及需要添加多少秒的约束才能得到解决方案!我们将使用JavaScript 来可视化结果;更具体地说我们将使用 传单 以及 传单. motion 插件在地图上实现视觉效果!

我将在我的笔记本电脑上运行代码:

MacBook Pro (13-inch, 2019)
Processor: 2.8 GHz Quad-Core Intel Core i7
RAM 16 GB 2133 MHz LPDDR3

首先我们会尽量用你的 308 城市 (307 加上你在拉普兰的房子):

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

Santa’s optimal route with 308 cities

Execution Time: **556**
Number of SEC constraints: **380**
Solution cost (a.k.a. cycle length): **142.190 km**

正如你所看到的,我们没有覆盖一些国家,让我们包括更多的城市。考虑到我们现在有 342 个城市 (341 个加上你在拉普兰的房子):

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

Santa’s optimal route with 342 cities

Execution Time: **543 seconds**
Number SEC constraints: **352**
Solution cost (a.k.a. cycle length): **162.373 km**

在这种情况下,当我们添加更多要访问的城市时,找到解决方案所需的时间会减少。当使用线性规划解决 TSP 时,这并不是不常见的结果。当然,节点的数量(以及由此产生的变量和约束的数量)会对执行时间产生影响,,但是通常使问题变得困难的是地图上城市的实际布局。甚至增加一个城市(或者删除一个!)会让性能急剧恶化!

我来给你看看现场版:https://santa-tsp.herokuapp.com/

结论

圣诞老人:吼吼吼!安德莉亚。那真是太神奇了!我欠你很多!每个人都会准时收到礼物!你帮助我让人们更快乐!

安德里亚:嗯,圣诞老人,实际上已经有亚马逊在做类似的事情,但是,你知道,他们也不接受神奇的美元,所以我认为我们在给定的条件下做得很好!

圣诞老人:谢谢。我不明白为什么没有人接受我的魔法钱,但我很高兴你接受了!

谢谢你拯救了圣诞节!再见!

嗬!嗬!嗬!

后手稿

这是我的故事。很高兴能帮助圣诞老人了解这些概念。

谢谢你读到这里,如果你需要一些多余的魔法美元,请联系我!

圣诞快乐!

链接到 JavaScript 版本https://santa-tsp.herokuapp.com/

[## 聚类波洛克

杰森·布拉克绘画的聚类分析——如何利用 k-means 进行色彩分组

towardsdatascience.com](/clustering-pollock-1ec24c9cf447) [## 火花中加入的艺术

Spark 中加速连接的实用技巧

towardsdatascience.com](/the-art-of-joining-in-spark-dcbd33d693c)

我是如何在几个月内学会计算机视觉的

原文:https://towardsdatascience.com/how-i-sort-of-learned-computer-vision-in-a-month-c3faec83b3d6?source=collection_archive---------12-----------------------

十年即将结束,回头看,我做得还不够。所以我搜索了一些流行词,遇到了“计算机视觉”并尝试了一下,心想,“伙计,这能有多难?我打赌我能学会这些东西,并且做得更好。”

是的,我完全错了。

我没有扎实的统计背景,或者任何机器学习技能。学习比我想象的要困难得多。我想过在多个点停下来,但出于某种原因,我继续前进。现在我做了这个指南来节省初学者的时间,因为这是一个非常酷的主题。

那么什么是计算机视觉呢?

计算机视觉用来模仿人类的感知系统。我的主要动机是了解它的汽车应用,但实际上它可以应用于安全、医疗和国防工业。

在最底层,它通过过滤、寻找线条或改变图像的大小来改变图像的属性。然而,在更高的层次上,它训练一个模型来预测图像组件的类别和位置。图像处理算法涉及线性代数(特征向量、雅可比)、微积分(梯度、拉普拉斯)、统计和信号处理(卷积)的混合。

好了,现在你已经被警告了,继续行动,后果自负。

简要概述

该列表涵盖了整篇文章中的主题及其顺序:

  • 数字图象处理
  • 支持向量机
  • 神经网络
  • 目标检测(CNN)
  • 对象分割(区域提议网络)

Python 是我的首选语言,因为它易于实现和配置。如果内存优化是你的目标之一,那就用 C++。包括 OpenCV、Tensorflow、Keras、Numpy 在内的库是应用必不可少的。

成为一个形象意味着什么?

所有的图像都是由红、绿、蓝(RGB)三个通道组成。还有其他颜色方案,如 HSV(色调、饱和度、值),但 RGB 是最受欢迎的。

每个通道都是使用强度函数计算的强度值(像素)矩阵。强度是衡量每种颜色显示强度的标准。它将图像位置作为输入:I(x,y)。强度范围从 0 到 255。因此,您可以将图像想象为三个矩阵的叠加(每个颜色通道一个矩阵)。

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

Source: Hernandez D., et al via Journal of Aerospace Mgmt and Tech (CC); Contained in Each Element is Intensity-Value

过滤能力

滤镜(或内核)用于找出更多关于图像通道的信息或对其进行转换。这些较小的矩阵在图像上“滑动”,在每个中心像素上进行加权求和。这个操作是一个 2D 卷积,允许你模糊图像,锐化图像,最重要的是找到边缘。

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

Source: Plotke, M., via Wikimedia (CC); Demonstration of Weighted-Sum via Kernel

但是到底什么是优势呢?

边缘是图像中强度从低到高或从高到低过渡的区域。因此,当搜索它们时,采用提供强度变化率的方向和幅度的像素梯度。更大的梯度表示更强的边缘(参见(a))。名为 sobel 算子的滤波器通过使用数值方法(使用向前、向后或中心差分)来近似强度梯度的幅度来实现这一点。

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

Illustrated by me; Step Edge Sharp Intensity Gradient

边缘对于将图像分割成多个部分的图像分割来说非常重要。我们的眼睛很容易处理这项任务,这让我们能够识别事物,但必须以艰难的方式教会计算机。

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

Source: Thomas, M. via Wikimedia (CC); Image Segmentation Post-Processing

跟踪运动

现在事情变得真正令人兴奋,因为我们可以用数学来看看像素是如何移动的。好吧,这听起来有点扯,但是听我说完:拍一段视频,然后把它分割成帧。在非常小的时间间隔内,帧根本不会改变。这就是光流约束

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

Illustrated by me; I(x+dx, y+dy, t+dt) = I(x, y, t) by op flow constraint, therefore terms cancel

请记住,每一帧都是一个强度值的矩阵,因此通过一些神奇的数学(不完全是,这是一个泰勒级数展开)公式简化为强度变化的时间(随时间)和空间(沿 x,y 轴)速率。参数 u、v 是特定像素随时间的位置变化率(注意它们不是偏导数)。求解 u,v 是通过估计一个矩阵变换来完成的。由于关于强度值的信息很容易检索,所以给出了其它成分。

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

Illustrated by me; After cancellation get left with this

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

Illustrated by me; u = dx/dt, v = dy/dt

所以最后,视频的运动矢量可以被求解以确定物体如何运动。我不想用数学吓走你,但是要提醒你,从现在开始它只会变得更丑陋(以一种有趣的方式)!

高效地跟踪运动

金字塔用于寻找图像特征或通过向上或向下采样来帮助光流。这仅仅意味着在保持分辨率的同时缩小或放大图像(拜托,我们不可能有土豆质量的图片)。通过匹配的角和吊杆画线!你有一个金字塔。

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

Source: Cmglee via Wikimedia (CC); Pyramid Structure — Notice Features Maintained Despite Blur

物体运动在非常小的尺度上得到估计,每个方向向量使用金字塔增大,这增加了运动的长度。这允许跟踪对象。

通过找到连续帧之间的像素对齐来完成跟踪。通过最小化像素的估计位置与其真实位置之间的误差,可以密切跟踪感兴趣的点。这涉及使用来自光流约束方程的 u,v。

这些概念的详细解释可以通过沙阿博士的讲座 (2 — 11)和拉德克博士的 (6 — 7,10 — 12)找到。关于通过代码应用这些概念的内容可以通过 PySource 找到。

如何对图像进行分类

假设给你一个两类数据的散点图,你的任务是把它分开。通常,可以画一个函数来做这件事,比如直线或抛物线。然而,对于重叠或必须由非线性函数分隔的数据(例如圆圈),使用支持向量机(SVM)。它将更高维度添加到数据中,以确定功能解决方案。

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

Source: Learner M., via Wikimedia (CC); SVM — Notice Added Dimension Allows Data to be Separated by Hyperplane

支持向量机在图像处理中用于这种分类任务。他们接受正面和反面例子的训练,通常是为了确定随机图像是否属于某一类。

如何对图像进行分类,但更好

特征是图像的不同部分。有效的特征可以通过使用梯度方向的直方图来发现。他们把图像的结构分解成一个向量矩阵。

一个固定输入大小的图像被分割成一个固定的网格,在每个位置找到梯度的大小和角度。然后,180 度的角度范围被量化为九个仓或部分(每个包含 20 度的范围)。

形成包含图像上梯度角分布的直方图。面元中心用于说明落在面元之间的角度,它们必须相应地分开。

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

Source: Theiler, M. via Wikimedia (CC); Kernel Applied Over Fixed Grid on Image -> Grid of Gradients -> Histogram

通过对一群特定类别的猪(如车辆)训练 SVM,它将学习对新图像进行分类。利用图像结构,可以做一个更强的分类器!

更多分类?我听到的是神经网络吗?

我一直提到“分类”这个词,因为它有点重要。神经网络是另一种分类工具,只是它们可以处理具有数千个特征的多个类别。

然而,应用它们的一个主要警告是它们是硬件密集型的,通常需要强大的 GPU(不是 CPU,因为我们同时处理许多事情)。这是当前工作被应用于更有效的算法或更好的硬件的地方。

在进入细节之前,理解神经网络的结构是重要的。有不同类型的网络,现在我们将着眼于深度(全连接)神经网络。总体结构分为三个部分:

  • 输入层
  • 隐蔽层
  • 输出层

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

Source: Burgmer, C. via Wikimedia (CC);

数据在输入层提供给一个节点(称为神经元)。每个节点都连接到下一个隐藏层的每个节点。这种连接是加权的,意味着输入乘以一些标量(权重)。因此,输出层的每个节点成为其输入(来自前一层的节点)的加权和。为了将数据保持在相同的范围内,需要应用一个激活函数。有许多类型的激活,现在我们将使用一个 Sigmoid 函数来限制值为[0,1]。

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

Source: Chris, L.B via Wikimedia (CC); Sigmoid function limits all values over domain to [0,1]

损耗 在每个节点进行计算,作为预期和真实输出之间的差值。神经网络的目标是通过找到这样做的成本函数(权重)的参数来最小化这种损失。看那波浪表面证明它很难找到极值。我们的下一个最佳选择是通过使用梯度(指示下降点)迭代地找到极值,然后更新权重。

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

Source: Derbyshire, S. via Wikimedia (CC); Red Line Shows How Minima are Found Iteratively Via Gradient Descent, Avoiding Saddle Points Along the Way

为了求解神经网络的梯度,使用了一种称为反向传播的方法。

一种图像分类器

现在我们将使用神经网络对图像进行分类。但是这并不是一件容易的事情,所以我们将使用一种特殊的类型:一个卷积神经网络。注意,这是用来对整个图像进行分类的。

其思想是取一个输入图像,用一个固定大小的核对其进行多重卷积。该组输出将是第一卷积层。然后重复这个过程。一堆内核得到应用,以增加随机性,并找到更多独特的功能!

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

Source: CodeEmporium via Youtube (CC); Multiple Filters Convolved with Same Image Produce Depth

随着网络了解到更多区分不同图像的特征,每个卷积层的复杂性都会增加。

例如,第一层可以找到线条和边缘。然而,通过第三层,它确定了定义鼻子和眼睛的线条和边缘的集合和方向。然后到了第五个阶段,它会计算出鼻子和眼睛的组合来定义一张脸。事实上,这就是模型如何被训练来分类人脸,通过阅读 haar-cascade 分类器了解更多。

这个过程就这样继续下去,这样网络就学会了对图像进行分类。在卷积层之间插入一个池层,对输出进行下采样并减少计算(基本上只记住重要的特征)。

每一步都有深度,因为同一个图像应用了多个内核。

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

Source: Aphex34 via Wikipedia (CC); Pooling occurs at Subsampling Layer and Repeats until Flattened

到了最后一层,一系列独特的、习得的过滤器就形成了。为了将这从空间输出转换为类预测,它被展平为矢量,并最终通过全连接层馈送。然后,基于训练数据,CNN 提供图像预测(从馈送到全连接层的输出向量中挑选一个类别)。然而,它不能提供图像位置。不要担心,这个以后会改进的。

CNN 的一些细节

请注意,在每一层,图像尺寸变小。在边缘处不能进行卷积,因为内核以输入图像的像素为中心,但是其边界(虚线)之外的值是未知的。为了解决这个问题,这些像素的亮度假定为零。这在前面显示的卷积图中很明显。

它被称为零填充,用于保持图像大小和空间信息。然而,一些算法不实现它,再次导致收缩。

如何编码 CNN 101

下面显示的是使用 Keras(构建在 Tensorflow 之上)实现的 CNN。

是的,真的很简单。

请注意,该程序遵循上面所示的 CNN 结构,通过应用 2D 卷积,然后是池化(pool_size 表示下采样的内核有多大),最后是展平层。然后,它使用全连接(Keras 称之为“密集”)层对输出进行分类。

model = Sequential()*#Apply 2D conv using 32, 3x3 kernels per image with dimensions 64x64x3 (RGB), then pooling layer, then flatten output*model.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Flatten())*#Use node-vector to act as input to fully-connected layer
#Expect 128 nodes in hidden layer, add dense layer*model.add(Dense(units=128, activation='relu'))*#Binary classification, output layer*model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])

要了解更多关于神经网络的知识,可以搜索一下深蜥蜴斯坦福大学的系列讲座

图像各部分的分类器

这用于对图像的部分进行分类,也称为对象分割。在这一点上,我们非常接近许多现代计算机视觉算法背后的架构。

这个架构是一个全卷积网络,它提供图像预测和定位,这是典型的 CNN 无法做到的。

这些网络通过使用一种编码器-解码器方案来全程使用卷积。首先是编码器部分,它输出一个分类器向量。解码器利用这一点对展平向量进行上采样(通过去卷积)并预测像素的类别。输出将是掩膜或要素地图。

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

Source: LISA Lab (Copyright 2008–2010); Decoder Network Completes Pixelwise Categorisation

上采样对于重新获得图像的空间信息(分类像素的映射)是必要的。来自编码器网络的较浅层的信息用于寻找图像位置,较深层的信息用于分类。 FCNs 允许预测图像的部分,增加了更高的准确性和复杂性。获得图像遮罩被称为语义分割。

为什么物体检测是棘手的事情

必须对视频的每一帧进行分析以找出可能的类别,并且必须在预测的对象周围包裹一个边界框。典型地,滑动窗口用于寻找匹配的特征并识别图像的部分。但是用 CNN 做这个会花太多时间。

相反,我们得到了地区提案!目标是找到可能包含对象的“blobby”区域,然后搜索它们。这有许多实现方式,如下所示:

  • 美国有线电视新闻网地区频道
  • 快速 R-CNN
  • 更快的 R-CNN
  • 你只看一次(YOLO)
  • 屏蔽 R-CNN

现在我们将讨论 R-CNN,因为其余的(除了 YOLO)都是建立在这个概念之上的。

一种有效的图像部分分类器

哈哈思科R-CNN效率不高。它们有点快,但仍有改进的空间。

然而他们的架构被改进为开发速度快、更快、屏蔽算法的变体,所以他们派上了用场。

使用诸如选择性搜索的算法在图像中搜索斑点(感兴趣的区域)。然后将子区域扭曲(改变大小、倾斜或镜像)为固定大小,并对每个提议的区域应用 CNN,最后使用 SVM 对其进行分类。这解决了确定对象类别和位置的问题。

这是 FCNs 的替代架构。

一个问题是同一对象会出现多个边界框。非最大抑制是一种为每个区域设置置信度得分的算法。分数较低的区域被丢弃,然后使用 union (边界框之间的错误检查器)的交集来找到最准确的区域。

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

Source: Rosebrock, A. via Wikimedia; Intersection of Union Finds Best Bounding Box by Comparison

子区域必须被扭曲,因为它们可以是不同的大小。一旦感兴趣的区域被找到并分类,它就被包围在一个边界框内。

现在你完全是初学者了!

这篇文章是一堆不同主题的混合体,旨在给初学者一个开始编程的基本基础。经历这一切可能需要几个星期到几个月的时间,所以时间投入很少。

链接到更严格的材料已被放置在整个,我强烈建议通过他们工作。在一天结束时,设置 OpenCV、Keras 和它们所使用的算法是非常容易的。重要的是知道它们是如何工作的,以便最终改进它们或者选择正确的一个。

我是如何自学编码并获得数据科学职位的

原文:https://towardsdatascience.com/how-i-taught-myself-to-code-and-a-landed-data-science-role-b2b801bf7779?source=collection_archive---------12-----------------------

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

这篇文章讲述了我如何自学编码、统计、商业,并将这些知识转化为数据科学家的经历。这些问题大部分来自几个人直接在 LinkedIn 上发消息给我这篇文章。由于许多人有类似的问题,我决定在上面贴一篇文章来帮助其他有同样问题的人。

从你个人的为什么开始

我个人的原因是避免我不想要的东西,并围绕这个概念找到一种生活方式。我出身贫寒,父母是高中毕业生和低技能工人。金融危机期间,我们失去了家园,我也没有去顶尖的本科项目。我只是想避免因选择有限而带来的痛苦。

你自己的原因不必和我的一样。你可以通过其他各种方式成为数据科学家,例如渴望成为最好的,对人工智能的强烈好奇心,相信这是支持家庭的最佳方式,等等。关键是理性必须激励你。别人怎么看不重要,重要的是你怎么看。最重要的是,你相信它。

我之所以强调你个人对数据科学的信念和承诺,是因为这份工作可能非常困难。就我个人而言,有时我发现在商业环境中创造创新的解决方案是非常具有挑战性和令人讨厌的(例如,没有合适的人,没有合适的资源,没有来自管理层的支持,等等)。).在我早期,这种压力很大。随着我获得更多的经验,我已经学会享受这类问题。对于我解决的每一个难题,这都使我的技能比以前更上一层楼,而且这个解决方案通常在手边的问题之外有各种应用。这一成就促使我不断前进。

我的小咆哮的寓意是找到你可以相信的东西,这将是你在日常发展成为伟大的数据科学家的正常斗争中的指路明灯。现在来看问答的汇编。

制作我的代码

当你对技术或编程感兴趣的时候,你多大?

我第一次接触技术是在高中的时候,是以编码的形式。我有一个老师,他也是一名 IT 顾问。有趣的是,我只和他一起工作过,因为一次州编码竞赛给了前三名获胜者一次免费的旅行,去一家豪华的酒店参加全国竞赛。

我从来没有去过很多地方,我发现这个机会是一个看世界更多地方的机会。所以,我拿了。那是一场 C++编码比赛。我进来时以为老师会指导我如何改进 C++语言。可悲的是,事实并非如此。这更像是参加一场纸牌游戏比赛,让你自己想办法解决问题。除了 Kaggle 之外,您还可以学习其他内核和论坛。幸运的是,我以第三名的成绩勉强赢得了州比赛。

但是我赢的方式更有趣一点。基本上,我只知道非常基本的 C++命令。问题语句要求某种类型的程序需要一些条件语句和 for 循环。那时候,我一点都不知道那些东西。我所做的是看他们想要什么类型的输出和用户界面。我制作了一个非常基本的代码来回答他们的问题,但不是以他们想要的方式。基本上,我赌了一把,假设他们会问什么,这样代码就不会被破解。它得到了回报,我得到了一次免费旅行。当然,在国家舞台上,我失败得很惨,但当时我实现了我的目标。直到那时,我已经很久没有写代码了。我的“为什么”不够强大,无法长期持续下去。这只是一个短期的目的——免费旅行。我只是在读 MBA 期间,在研究生院重新开始学习编程。

是什么让你想学习如何编码?

除了计算我在 C++中的小任务,我真的从听到 quants(定量分析师的简称)的故事中获得了对编码的真正热情。对于那些不在金融领域的人来说,在数据科学家这个术语出现之前,定量分析师基本上就是专门研究金融的数据科学家。第一批著名的定量分析师实际上是前火箭科学家,他们想赚更多的钱,或者发现金融市场是一个需要解决的有趣问题。我了解到,最好的公司制造的人工智能交易模型在金融市场上表现出色(赚钱)。

由于生长在一个工人阶级家庭,我想也许在下一世,我可以在一些先进的科学领域获得博士学位,并将统计学、计算机科学(编码)和商业知识结合到一个量化职业中。然而,至少在某个地方尝试一下(统计、编码或商业)会很有趣,看看它是否能让我成为一名定量分析师。我知道,如果我采取任何行动,都会比什么都不做(100%没有机会)给我一个机会(至少是一个非常小的机会)。

你用什么样的学习方式自学编码,你在学习中遇到了什么挑战?

幸运的是,当我开始(再次)学习如何编码时,整个数据科学领域开始崛起。我拿起我能拿到的所有东西。数据科学在线订阅课程、经过测试的数据科学训练营试用版、MOOCs、书籍等。一开始,我完全迷失了。这非常令人沮丧。我很难理解每件事都做了什么,也很难运行基本的包。我唯一拥有的就是我没有放弃,尽管我一直都喜欢这样。让我坚持下去的是一个非常遥远的梦想,那就是有一天成为一名金融数据科学家,并建立一个人工智能交易模型。

积累商业知识和学习统计学

当我在学习编码的过程中给自己施加痛苦时,我意识到数据科学家了解统计和业务(或领域专业知识),这也可以在下图中看到[1]:

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

为了提高我的统计和商业技能,我做了几件事。在统计学方面,我实际上回顾了 Khan Academy 的一些主题,并做了一些应用统计学的有趣项目。这些有趣的兼职项目之一是与我的职业扑克玩家朋友合作。他们教我如何将理论统计概念应用到实际实践中,这在风险管理和金融预测方面有商业应用。当然,附带的激励福利还包括赢钱。

在商业方面,我在攻读 MBA 的同时,还从事了一些小型咨询工作。现在大多数人不需要读 MBA,但是,在我的特殊情况下,我认为这是获得商业咨询工作的必要条件。我有一个哲学本科学位,所以大多数招聘经理只是扔我的简历,直到我开始一个 MBA 项目。我记得过去招聘人员告诉我,由于我的哲学背景,我在商业上什么也做不了。就我个人而言,我认为这是错误的——你可以增加动力来提高自己的另一种方式。在主题业务中,每种类型的业务都有细微差别,但作为数据科学家,你可以增加的主要价值是找出如何做两件事情中的至少一件:为公司带来更多的钱或节省更多的钱。如果你能把你的数据科学技能应用到其中任何一个方面,你将会在商业上走得很远。

构建职业生涯

你是如何将你的数据科学技能转化为高薪职业的?

数据科学有趣的一点是,构成数据科学家的三个主要组成部分可以让他独自获得高薪职业。编程可以让你成为一名伟大的软件工程师(例如,科技公司可以支付高达 40 万美元以上)。统计学可以让你在所有的概率问题上占据优势(比如扑克玩家——非常规或者教授/顾问——常规)。成为一名优秀的商业分析师本身也是一条多样化的职业道路(例如,投资者、投资银行家、金融分析师等)。).我基本上在这三个领域都辗转过,直到我得到了一个集这三者于一身的角色——数据科学家。

**就你的数据科学技能而言,你是通过什么途径获得一份 6 位数的工作的?**与我在数据科学领域的同行相比,我无疑拥有一条有趣的职业道路。我不是某个决定转向数据科学的数学或科学天才。我只是选择了一个发展方向,并且每天尽我所能做到最好。所以,我不能直接进入数据科学的角色。我所做的是业务分析师路线,并将其转换为数据科学角色。在我的业务分析师咨询工作中,我比我的同行工作得多,最终获得了数据科学的机会。一旦我做到了,我的数据科学技能增长到一个重要的水平,在那里我找到了一份工资超过 6 位数的数据科学工作。

对于那些有兴趣自学数据科学的人,你会推荐他们采取哪些步骤?对于那些想以创造六位数为起点的人,你会给他们什么建议?我间接地讨论了别人可以做些什么来让自己成为六位数的角色。我一般意义上的建议是,真正找到一个你为什么要做数据科学的理由。实际上原因并不重要,重要的是它对你的影响。如果这个理由可以激励你,帮助你在发展成为数据科学家的各种挑战中前进,那么这个理由就是为你准备的。接下来是获取数据科学技能。所以,学 Python,SQL,Hadoop/Spark,统计学,还有一个专门的业务领域。了解代码和统计数据只会让你成为机器学习专家,但商业知识将启动一个利润丰厚的职业生涯,成为数据科学家。

结论

我从未想过我会成为一名数据科学家。我原以为我只是一名商业分析师,以后会成为一名投资者。通过持续的数据科学日常开发和附带项目,我实际上获得了被聘为数据科学家的必要技能。作为一个之前没有数据科学背景,在本科毕业后才开始工作的人,你也可以。真正的问题是,不管你面临什么样的困难或问题,你是否愿意日复一日地坚持自我发展的原则?

免责声明:本文陈述的所有内容均为我个人观点,不代表任何雇主。

[1] B. Poulson,数据科学基础:5 部分系列(2019 年),https://datalab.cc/foundations/toc

我如何向非技术专业的学生教授分析

原文:https://towardsdatascience.com/how-i-teach-analytics-to-non-technical-students-2db4a900f0cf?source=collection_archive---------32-----------------------

过去三年,我一直在 USF 大学给非技术专业的学生(主要是市场营销和金融专业的学生)教授商业分析。作为一名训练有素的工程师和一名数据科学家,在我的整个职业生涯中,我几乎总是与和我有相同思维和编码方式的其他工程师一起工作。在世界科技中心旧金山生活和教学,加上对技术人才的不断需求,我在分析领域培训和教授越来越多的非技术型、热情的年轻专业人士和学生。

然而,在教这些非技术学生的过程中——他们不习惯与技术打交道,也不习惯以结构化的分析思维方式思考——早期的日子往往充满了挣扎、呼救和觉悟的时刻。分析不仅仅是处理数字和数据,它还处理技术,从数据库、ide、数学库到代码。对于那些从未使用过此类技术,也没有实践过如何解决与我们在分析、数据科学和工程领域每天面临的问题类似的问题的人来说,这往往太难了。

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

商业分析日益增长的重要性

分析允许企业采取数据驱动的方法来实现他们的目标。通过利用技术、数据建模和统计,企业可以开发新的见解,帮助他们更好地开发或营销他们的产品(更好是通过增加销售或用户参与来衡量的)。

日益增长的趋势是,今天的大多数公司,无论大小,都在大力投资于他们的技术堆栈,以增强他们的分析能力——无论是产品(即数据科学家)还是销售/营销(即营销科学家)。多年来,我们做生意的方式已经发生了变化,因为技术产品本身,如 iPhone 应用程序,是许多企业的核心产品/服务。这允许实时监控和洞察,并实时提供营销和产品实验,以增加销售和参与,最终产生如此多的数据,以致只能使用传统上由工程师开发和使用的重型技术栈来挖掘洞察。

非技术专业的学生如何适应这个角色?

随着公司所有部门对技术技能的需求,总是需要有人不仅能以数据驱动的方式思考,还能分析性地操作和执行。我认为,非技术专业人士对业务有更好的理解,这通常需要对行业、竞争优势、高层战略和推动公司发展的策略有全面的了解。如果他们能挖掘所有的数据,他们将是所有雇主寻找的独角兽。

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

在向非技术专业的学生和专业人士教授分析学时,我发现三件事很重要

1。让事情变得简单

我认为平台不应该要求软件安装。作为一名雇主,你从来不需要甚至没有许可安装你自己的软件。您最后一次在工作时在笔记本电脑上安装数据库是什么时候?如果你想让非技术专业人员开始从事分析工作,那么能够提供所有的工具和数据,并通过网络浏览器访问它们是一个基本要求。

2。为营销和商业专业人士设计的特定内容

课程内容应以陶冶商科和市场营销专业学生为主。这听起来是显而易见的,但很少有,如果有的话,对学习分析感兴趣的商业和营销学生的课程。

另外,我从来不依赖课本。它太静态了,很少有互动的成分。那些有交互组件的项目通常需要你安装数据库和其他工具来进行实践。我尝试使用平台,其中使用的工具是常见的行业工具。像 DatacampStrata Scratch 这样的 SAAS 平台是为非技术营销/商业学生构建的,部署了业内常用的常见分析工具。

这很有意义,因为营销和商业分析专业人士对开发新的机器学习算法不感兴趣。他们可能对营销实验的设计和执行更感兴趣。

3.技术专长并不是擅长分析的必要条件,但技术思维是必要条件

你不需要了解很多分析或技术,但你需要改变你的心态。技术人员和非技术人员学习、分解问题、开发解决方案的心态是不同的。非技术专业人员通常很难处理和解决问题。大多数时候,我发现他们很纠结,因为(1)他们似乎无法在笔记中找到与手头问题完全匹配的例子,以及(2)他们似乎无法将问题分解成更小的可行部分,因此他们变得不知所措。问题就像拼图。大多数情况下,工程师和科学家不知道如何准确地解决问题或建立所需的模型,但通过研究和迭代问题和各种方法,他们通常能够建立一些实现他们目标的东西。你必须对不知道该做什么感到舒服,你必须对一路上的挣扎感到舒服。通过练习和强化来改变这种心态。技术人员也曾是新手,他们也曾为完全相同的问题而挣扎。

我是如何理解的:训练音频文件时需要考虑哪些特性?

原文:https://towardsdatascience.com/how-i-understood-what-features-to-consider-while-training-audio-files-eedfb6e9002b?source=collection_archive---------8-----------------------

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

Designed by Gstudioimagen — Freepik.com

简介

对于任何机器学习实验来说,首先需要收集数据。接下来的主要任务是将数据转换成特征,然后输入算法。这篇文章旨在简要介绍一些最重要的特性,这些特性可能是为音频分类任务建立模型所需要的。下面还展示了使用 Python 提取的一些特征。

一些主要的音频功能:

(1) MFCC(梅尔频率倒谱系数):

又名“最常考虑的系数”,MFCC 是一个你会在任何涉及音频文件的机器学习实验中看到的特征。
正如这篇文章中正确提到的,人类发出的任何声音都是由其声道的形状决定的(包括舌头、牙齿等)。如果这个形状能够被正确地确定,那么产生的任何声音都能够被准确地表现出来。语音信号的时间功率谱的包络代表声道,而 MFCC(它只不过是构成梅尔频率倒谱 ) 的系数)精确地代表了这个包络。

通常,MFCC 的前 13 个系数(较低的维度)被作为特征,因为它们代表光谱的包络。而被丢弃的更高维度表达了光谱细节。对于不同的音素,包络线足以表示差异,所以我们可以通过 MFCC 来识别音素。

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

Flowchart for obtaining MFCC coefficients

(考虑阅读这篇关于 MFCC 的文章以深入了解它。)

import librosa
y, sr = librosa.load(librosa.util.example_audio_file(), offset=30, duration=5)
print(librosa.feature.mfcc(y=y, sr=sr))

(2)过零率:

过零率是对给定时间间隔/帧中语音信号的幅度通过零值的次数的度量。这个特征在语音识别音乐信息检索中被大量使用,是对打击乐声音进行分类的关键特征。它还广泛用于其他音频应用领域,如音乐流派分类、精彩片段检测、语音分析、音乐中的歌唱声音检测以及环境声音识别。区分浊音和清音的最简单方法是分析过零率。大量的过零点意味着没有主要的低频振荡。

import librosa 
y, sr = librosa.load(librosa.util.example_audio_file())
print(librosa.feature.zero_crossing_rate(y))

(3)能量

语音信号的短时能量提供了反映幅度变化的便利表示,并且可以定义为

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

语音信号的短时能量反映了振幅的变化。在一个典型的语音信号中,我们可以看到它的某些特性会随着时间发生很大的变化。例如,我们可以观察到信号峰值幅度的显著变化和语音信号中有声区域内基频的显著变化。这些事实表明,简单的时域处理技术应该能够提供有用的信号特征信息,例如强度、激励模式、音调,甚至可能是声道参数,例如共振峰频率。

(4)光谱衰减

这是功率谱右偏量的一种度量。频谱滚降点是功率谱中 85%的功率处于较低频率的频段的分数。也就是说,滚降是 85%的累积频谱幅度集中在该频率以下。像质心一样,对于右偏光谱,它具有更高的值。

import librosa
S, phase = librosa.magphase(librosa.stft(y))
print(librosa.feature.spectral_rolloff(S=S, sr=sr))

(5)光谱通量

它由跨频率求和的频谱幅度矢量的帧间平方差给出,即

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

它提供了对局部光谱变化率的测量。光谱通量的高值指示光谱量值的突然变化,因此在第 r 帧处可能存在片段边界。

import librosa
y, sr = librosa.load(librosa.util.example_audio_file(), duration=10.0)
onset_env = librosa.onset.onset_strength(y=y, sr=sr)
print(onset_env)

(6)谱熵

在语音活动检测中,熵被用于检测语音的无声区和有声区。这一特征的区别特性使其在语音识别中得到应用。熵可用于捕捉分布的共振峰或峰值。共振峰及其位置被认为对语音跟踪很重要。因此,熵的峰值捕捉能力被用于语音识别。

(7)色度特征

在音乐中,术语 色度特征色度图 与十二个不同的音高等级密切相关。基于色度的特征,也称为“音高类别简档”,是一种分析音乐的强大工具,这些音乐的音高可以有意义地分类(通常分为十二类),并且其调音接近于等度音阶。色度特征的一个主要属性是它们捕捉音乐的谐波和旋律特征,同时对音色和乐器的变化具有鲁棒性。下面列出了两个主要的色度特征:

(a) 色度向量:
频谱能量的 12 元素表示,其中面元表示西方类型音乐的 12 个相等调和音高类别(半音间距)。
(b) 色度偏差:
12 个色度系数的标准偏差。

import librosa
y, sr = librosa.load(librosa.util.example_audio_file())
print(librosa.feature.chroma_stft(y=y, sr=sr))

(9)音高

音高是一种听觉感受,其中听者主要根据他们对振动频率的感知,将乐音分配到音阶的相对位置。音高与频率密切相关,但两者并不等同。频率是一个客观的、科学的属性,可以测量。音高是每个人对声波的主观感知,无法直接测量。然而,这并不一定意味着大多数人不会同意哪个音符更高和更低。

import librosay, sr = librosa.load(librosa.util.example_audio_file())
pitches, magnitudes = librosa.piptrack(y=y, sr=sr)
print(pitches)

“那都是乡亲们!”,音频分类的一些最常用功能介绍到此结束。

一个神经网络如何发现我游戏的漏洞?

原文:https://towardsdatascience.com/how-i-used-ai-to-accidentally-find-a-loophole-in-my-game-dd56f40c8553?source=collection_archive---------20-----------------------

神经进化导论

进化出一个 AI 来玩游戏,它却选择了嘲讽!

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

Photo by Adam Muise on Unsplash

在你研究一个人工智能如何操控我的游戏之前,让我们先熟悉一下**【神经进化】**的基础知识,以理解为什么会发生这种情况。

神经进化
**1 主要涉及 2 件事。**遗传算法
**2。**神经网络

遗传算法

这种算法背后的概念受到达尔文进化论的启发。

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

这些是遗传算法的主要阶段…

  1. 生成一个随机群体
  2. 计算群体中每个成员的适应度
  3. 执行自然选择
  4. 与自然选择的成员进行交叉
  5. 作为杂交的结果,对后代随机应用突变
  6. 新的种群被创建,丢弃旧的一代并转到 步骤 2

看,你可能会从人类或其他生物的现实世界进化中得到这种直觉,但毕竟要记住,遗传算法基本上是一种搜索算法。

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

考虑这个图,假设你想搜索一个(x,y)点,使得**‘z’值最大。最初,该图将是完全未被探索的,所以除了初始点之外,你不能真正确定图中任何其他点的‘z’**值。

我们可以应用许多搜索算法来帮我们做到这一点,但是让我们看看遗传算法是如何做到的。

步骤:随机总体

首先,在 GA(遗传算法)中,我们将从几个随机点开始,或者我们可以说是来自解空间的随机猜测。例如,在上图中,我们看到**‘x’值可以是从-3 到+3 的任何值,同样的范围也适用于‘y’**。

所以我们的随机猜测可能看起来像…

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

如果我们就 GA 而言,那就是随机人口 一代。我们基本上生成了一个(x,y)对的随机群体,每个都有一些**‘z’值。这些‘x’值和‘y’值可以认为是基因**。

步骤:适合度计算

现在是适合度计算,这是因为我们想要判断哪个随机猜测比其他的更好,我们需要一些具体的比较。
所以我们必须定义一个适应度函数,它将表示随机猜测的适应度。在这个例子中,非常简单,因为我们需要具有最大“z”值的(x,y)对,所以对于一些随机猜测,它们的“z”值可以作为它们的适合度分数。

适应度(x,y) = z 值

因此,现在考虑适应度函数,我们查找每个点的 z 值,并得到它们之间的关系,如下所示。

健身( -2.2,2.3 ) >健身( 0.1,-2.4 ) >健身( 2.0,1.4 ) >健身( 1.0,2.0 )

步骤:自然选择

现在我们执行自然选择,也就是随机选取随机猜测中的一个,但是随机选取是基于概率分布的。这意味着具有更高适应值的那些将更有可能被自然选择**。**体能非常低的可能不会被选中。

“适者生存”——查尔斯·达尔文

比如说 pairs (-2.2,2.3) & (0.1,-2.4) 得到选择。

步骤:交叉

下一步是杂交或者简单地说,这两个自然选择对的基因混合在一起,形成一个新的杂交对*,也就是后代!*

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

( Crossover )

上图说明了本例中交叉是如何发生的。它混合父母双方的基因,形成一个单一的后代。我们多次重复自然选择,进行杂交来产生后代。

步骤:突变

现在,在这些新的后代身上,我们进行**‘突变’,这意味着随机改变它的基因值。虽然突变的发生取决于突变率**,但是如果突变率为 100%,那么所有产生的后代都会发生突变,如果突变率为 5%,那么只有 5%的后代会发生突变。

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

( Mutation )

上图显示了**‘y’**值如何随机突变为-2.3。变异是为了保持种群的多样性,因为如果种群保持不变,那么我们就不能尽可能多地探索图表,结果,我们就不会到达最高点。

现在,在应用突变后,我们有了一个全新的后代群体,这可能比上一代群体更好,或者我们可以说是上一代,因为我们倾向于从一个群体中选择更好的成员(通过自然选择),然后混合他们的基因(通过杂交)。

在这一点上,我们将丢弃旧的代,并开始在这个新的代上从适应性计算再次执行相同的步骤。

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

(that’s the rough big picture of GA)

随着这个循环的继续,一段时间后,所有成员将收敛到同一点,这将是解决方案空间的最高点,这是我们的目标,这是当这个算法停止。

👇关于这个话题的推荐视频👇
遗传算法:简介|编码训练
学习:遗传算法|麻省理工学院开放式课程

神经网络

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

Biological Neuron (Image source: Wikipedia)

神经网络的想法来源于人脑本身。这个概念解释了我们如何学习东西,基于我们可以应用同样的概念让计算机学习东西!

人工神经网络是以生物神经网络为基础的,虽然它们不完全相同,但人工神经网络可以看作是实际生物神经网络的抽象。

神经元

神经网络是由一堆相互连接的神经元组成的。因此,在研究神经网络之前,让我们先来看看我们在人工神经网络中使用的单个“神经元”。我们将这种人工神经元命名为感知器,因为它们的实现略有不同,但为了保持生物学上的类比,我们还是继续称它为神经元吧。

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

( Artifical neuron )

把这个神经元想象成一个函数,它接受一堆输入(实数)并给出一个输出。所以现在的问题是这个函数对它的输入做了什么来产生输出。
你可以在上面的神经元图中看到,每个输入值都通过一条边传递给神经元,这条边有一个**“权重”**与之关联。

即,如图所示,当输入“x1”通过权重为“w1”的边到达神经元时,神经元的值变为 x1 * w1。

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

( Operations happening inside a neuron )

然后,将从不同输入边缘接收的所有此类值相加,然后还有一个名为**‘bias’的值与神经元相关联,从该总和中减去该值,然后将该结果传递给激活函数。**

这个激活功能是什么?这个有很多选项,假设是一个 sigmoid 函数。

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

Sigmoid function (Image source: Wikipedia)

该函数接受任何实数,并将其压缩到 0 到 1 之间。

所以,这个激活函数的输出就是神经元的输出。该偏差用于在进入激活功能之前设置阈值。

好吧,一个神经元没问题,但是有什么用呢?
例如,你可以用一个神经元实现与门

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

由于输出是由 sigmoid 函数给出的值,它的范围可以从 0 到 1。所以,如果我们得到 ***输出<***0.5,我们就认为 结果= 0 同样如果 输出> 0.5 ,我们就认为 结果= 1

w1 = 2.0w2 = 2.0偏差= 3.0

现在让我们用所有的输入来测试一下

如果 x = 0,y = 0输出
= sigmoid(x * w1+y * w2-bias)
= sigmoid(0 * 2+0 * 2-3)
= sigmoid(-3)
= 0.04743

输出< 0.5,结果= 0

如果 x = 0,y = 1
输出
= sigmoid(x * w1+y * w2-bias)
= sigmoid(0 * 2+1 * 2-3)
= sigmoid(-1)
= 0.26894

输出< 0.5,结果= 0

如果 x = 1,y = 0
输出
= sigmoid(x * w1+y * w2-bias)
= sigmoid(1 * 2+0 * 2-3.5)
= sigmoid(-1)
= 0.26894

输出< 0.5,结果= 0

如果 x = 1,y = 1输出
= sigmoid(x * w1+y * w2-bias)
= sigmoid(1 * 2+1 * 2-3.5)
= sigmoid(1.0)
= 0.73106

输出> 0.5,结果= 1

但是我们是怎么发现这样的权重偏差的呢?这个*‘设置权重和偏差’部分就是学习**逻辑的全部所在。在建立输入和输出模式之后,我们需要做的就是为这些权重和偏差找到合适的值!基本上,学习就是这么简单!我们将很快回到学习部分。*

现在,你可能会觉得,“gate 很无聊…我们不能做一些更酷的东西吗?”*
当然!我们当然会,但在此之前让我告诉你,单个神经元不足以解决所有类型的问题,因为它们只能解决线性可分的问题。*

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

非正式地说,你需要更多的神经元来做酷的事情!

多层人工神经网络

多层安来救援了!
它有 3 种层次:

  1. 输入层
  2. 隐蔽层
  3. 输出层

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

( Multilayer artificial neural network )

可以有多个隐藏层,这取决于用例。每层中神经元的数量也取决于用例。每个神经元都连接到下一层的所有神经元(尽管它们可以部分连接)。每个神经元都有一个偏差值,每个连接都有与之相关的权重。从输入到输出逐层处理的过程称为前馈

为了理解它,把整个神经网络想象成一个函数,它可以接受输入并返回输出。
例如,你可以设计人工神经网络,将矩形的边作为输入,矩形的面积作为输出,但我们可以通过简单的逻辑自己完成。
但是我们使用神经网络推导一个直截了当的逻辑并不那么容易。考虑编写一个计算机程序的问题,该程序拍摄手写数字的照片并猜测它是什么数字。在这种情况下,输入神经元将是所有像素,输出将是所有数字的 10 个神经元,您可以试验隐藏层。

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

Handwritten digit classifier ANN’s feedforward (Source: 3blue1brown)

好的,这个输入和输出部分很好,但是权重和偏差是怎么回事?这就是使这些输出成为可能的东西,没有正确的权重和偏差,神经网络只是一个愚蠢的东西!

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

ANN with random weights and biases (Source: 3blue1brown)

那么,神经网络是如何学习的呢?

对此有几种方法。其中之一是用随机权重初始化人工神经网络,并用一些带标签的数据集训练它,根据误差,我们通过反向传播不断调整它的权重和偏差,反向传播使用一种称为梯度下降的概念。这种学习被称为监督学习

我们也可以用强化学习。在这里,代理开始在其随机初始化的状态下执行,并根据其动作的结果不断调整。我们可以应用遗传算法来实现这种行为,让我们在下一节看到这一点。

👇关于这个话题的推荐视频👇
但是什么是神经网络呢?| 3 蓝色 1 棕色

神经进化

使用遗传算法进化神经网络是“神经进化”。话虽如此,“神经进化”这个术语还是有道理的,对吧?

神经网络+进化=神经进化

首先,我们确定问题陈述并设计合适的神经网络架构。但是为了让它正确地工作,我们需要为它找到正确的权重和偏好,所以现在 GA 就出现了。

我们为它们的连接生成多个初始化了随机权重的人工神经网络,从而得到人工神经网络的随机群体。所以,这里所有这些随机产生的权重会导致一些愚蠢的人工神经网络,但是因为它是随机的,一些人工神经网络会不那么愚蠢,一些会更愚蠢。我们知道这个神经网络应该做什么,所以通过它的性能,我们可以计算它的适应度。在这里,权重和偏差就是人工神经网络的基因。基于适应值和概率分布*,自然选择将会发生。对于交叉**,自然选择的人工神经网络的权重和偏差将被混合以形成混合人工神经网络。在突变期间,一些权重和偏差会发生轻微的随机变化。通过自然选择、交叉和变异,随着新一代的发展,人工神经网络开始在适应度函数的指导下进行改进。*

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

(Basic neuroevolution algorithm)

尽管它仍然是一个搜索算法。早些时候,当我们试图使用 GA 找到最佳的 (x,y) 点时,我们实际上是在探索 X 轴和 Y 轴的二维空间。类似地,这里假设人工神经网络的每个连接的权重和每个神经元的偏差有一个维度,很难直观地想象,但基本上我们正在探索所有权重&偏差的维度空间,并试图在该空间中找到最佳权重和偏差向量。

当我们保持这个循环运行时,最终人工神经网络应该按照我们预期的方式运行。

👇关于这个话题的推荐视频👇 神经进化导论|编码序列

神经网络的恶作剧

我受到了这个Flappy Bird with neuro evolution编码挑战的启发,他们使用神经进化让计算机学会自己玩游戏。查看他们项目的现场版

所以,我想在其他游戏上做一个类似的项目,所以我开始寻找一个简单的游戏,在那里我可以应用这个算法。

经过一番研究,我决定制作自己的游戏😛然后用这个算法。

这个项目有两个部分:

  1. 设计并实现游戏
  2. 对其应用神经进化算法

现在,设计游戏…长话短说,我想出了这个游戏叫做‘逃跑跳跃’(一个朋友帮我起的名字🙃)

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

(Me playing the escape jump game)

在这里,你用箭头键控制那个红色球,你必须在它挤压你之前通过管道(黑条)之间的空间逃脱跳跃*,在这一点上两个管道将关闭在开始时是未知的,所以当它们出现时,你必须迅速做出判断。如果你在台式机上,你现在就可以从这个链接开始尝试这个游戏。试试看能打多少分,以后看 AI 自己打多少分!***

好吧,我知道这个游戏看起来不太好,尽管我认为它对于这个实验来说已经足够好了,不是吗?这不太容易也不太难,我认为这是一场公平的比赛。

但是生活从来没有像我感觉的那样😅然而我还是跟着它走,想看看它会走向何方。

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

(ANN architecture I used)

对于神经进化,我们用多个球来初始化游戏,每个球都有自己的人工神经网络(如上图所示),人工神经网络为它们做出决定。人工神经网络在每一帧获取输入,并根据人工神经网络的输出采取行动。

(Inputs and Outputs of ANN in code)

上面的函数来自于“球”类。它显示了它如何将输入传递给人工神经网络,以及它如何使用人工神经网络的输出来决定是跳跃还是移动。

我们让所有的球在同一个游戏中一起玩。球在游戏中存活的秒数可以被认为是它们的适合度。当球被挤在管子之间时就会死掉。当所有的球都死了,我们会有每个球的适应值,在此基础上我们可以执行自然选择交叉变异,然后新的一代出现。**

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

(Initiating neuroevolution algorithm)

所以,这就是它看起来的样子,现在如果你已经看到那只 flappy bird 是如何使用这种算法来学习自己玩游戏的,你就可以想象这个游戏应该如何进行了。它应该已经学会像我们平常一样玩耍,类似于我在第一个动画中所扮演的角色。

所以,我运行了几代,对它对游戏的影响感到惊讶,感觉就像电脑在取笑我的游戏😂

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

Here’s what it learned after a few generations (animation played at 4x speed)

于是,这个算法找到了一个可以每隔一段时间就不停跳跃,打败游戏的地方!哇!虽然最初,我有点难过意识到我的游戏太容易玩了,然后我意识到一个人工智能告诉我,我意识到我只是不小心用人工智能找到了一个游戏漏洞,这样感觉更好。**

不过,我从未修补过那个漏洞😜,可能我就这样保存代码吧。

就是这样!

如果你想看看这个模拟并玩玩它,检查一下这个
如果你想看看这个代码,这里有一个到它的 GitHub 库的链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值