用提炼的方法把整段总结成一句话
当我们阅读一篇文章或一本书时,为了快速理解一篇长文章,我们总是要做一个摘要。在英语中,每篇文章的第一个(或前两个)句子很有可能代表整篇文章。当然,主题句有时也可以是最后一句。
在自然语言处理中,有两种方法可以进行文本摘要。第一种,抽取法,是一种简单的方法,即从文章中抽取关键词或句子。有一些局限性,证明了性能不是很好。第二种是抽象方法,即根据给定的文章生成新的句子。它需要更先进的技术。
读完这篇文章后:
- 了解 PageRank 算法
- 了解 TextRank 算法
- 如何使用 TextRank 算法进行摘要
Source: https://www.youtube.com/watch?v=P8Kt6Abq_rM
PageRank 算法是 Google 开发的,用于搜索网站的最重要部分,使 Google 搜索结果与查询相关。
在 PageRank 中,它是有向图。开始时,所有节点都有相同的分数(1 /节点总数)。
该算法
Source: https://blogs.cornell.edu/info2040/2015/10/17/will-outbound-links-reduce-the-pagerank/
第一个公式是 PageRank 的简化版本,我们将使用这个公式进行演示。第二个有点复杂,因为它涉及到另一个参数,即阻尼系数“d”。默认情况下,d 为 0.85
让我们看看简化版。在迭代 1 中,以下是 PageRank 计算方法:
- 答:(1/4)/3。因为只有 C 指向 A,所以我们使用先前的 C 分数(迭代 0)除以 C 所指向的节点数(即 3)
- B: (1/4)/2 + (1/4)/3。A 和 C 都指向 B,因此之前的 A 得分(迭代 0)除以 A 所指向的节点数(即 2)。对于 C,它与前面的(1/4)/3 相同。
详细情况,你可以查看视频的完整解释。
问题:我们应该什么时候停止迭代?
按照理论,它应该一直计算到分数上没有大的更新。
文本排名
为什么要在 TextRank 之前引入 PageRank?因为 TextRank 的思想来源于 PageRank 并使用类似的算法(图的概念)来计算重要性。
差异:
- TextRank 图是无向的。意味着所有的边都是双向的
- PageRank 中边的权重为 1 时是不同的。有不同的计算方法,如 BM25,TF-IDF。
有许多不同的文档相似性实现,如 BM25、余弦相似性、IDF-修正余弦。你可以选择最适合你的问题。如果你对这些算法没有想法,请让我们知道,我们将在以后的分享中包括它。
Source: https://radimrehurek.com/gensim/
gensim 提供了一个简单的 API,通过使用 BM25(最佳匹配 25)来计算 TextRank。
步骤 1:环境设置
pip install gensim==3.4.0
步骤 2:导入库
import gensim
print('gensim Version: %s' % (gensim.__version__))
结果:
gensim Version: 3.4.0
步骤 3:初始测试内容
# Capture from [https://www.cnbc.com/2018/06/01/microsoft--github-acquisition-talks-resume.html](https://www.cnbc.com/2018/06/01/microsoft--github-acquisition-talks-resume.html)content = "Microsoft held talks in the past few weeks " + \
"to acquire software developer platform GitHub, Business " + \
"Insider reports. One person familiar with the discussions " + \
"between the companies told CNBC that they had been " + \
"considering a joint marketing partnership valued around " + \
"$35 million, and that those discussions had progressed to " + \
"a possible investment or outright acquisition. It is " + \
"unclear whether talks are still ongoing, but this " + \
"person said that GitHub's price for a full acquisition " + \
"was more than Microsoft currently wanted to pay. GitHub " + \
"was last valued at $2 billion in its last funding round " + \
"2015, but the price tag for an acquisition could be $5 " + \
"billion or more, based on a price that was floated " + \
"last year. GitHub's tools have become essential to " + \
"software developers, who use it to store code, " + \
"keep track of updates and discuss issues. The privately " + \
"held company has more than 23 million individual users in " + \
"more than 1.5 million organizations. It was on track to " + \
"book more than $200 million in subscription revenue, " + \
"including more than $110 million from companies using its " + \
"enterprise product, GitHub told CNBC last fall.Microsoft " + \
"has reportedly flirted with buying GitHub in the past, " + \
"including in 2016, although GitHub denied those " + \
"reports. A partnership would give Microsoft another " + \
"connection point to the developers it needs to court to " + \
"build applications on its various platforms, including " + \
"the Azure cloud. Microsoft could also use data from " + \
"GitHub to improve its artificial intelligence " + \
"producs. The talks come amid GitHub's struggle to " + \
"replace CEO and founder Chris Wanstrath, who stepped " + \
"down 10 months ago. Business Insider reported that " + \
"Microsoft exec Nat Friedman -- who previously " + \
"ran Xamarin, a developer tools start-up that Microsoft " + \
"acquired in 2016 -- may take that CEO role. Google's " + \
"senior VP of ads and commerce, Sridhar Ramaswamy, has " + \
"also been in discussions for the job, says the report. " + \
"Microsoft declined to comment on the report. " + \
"GitHub did not immediately return a request for comment."
尝试不同的比例
返回用于决定导入句子数量比率参数。
Original Content:
Microsoft held talks in the past few weeks to acquire software developer platform GitHub, Business Insider reports. One person familiar with the discussions between the companies told CNBC that they had been considering a joint marketing partnership valued around $35 million, and that those discussions had progressed to a possible investment or outright acquisition. It is unclear whether talks are still ongoing, but this person said that GitHub's price for a full acquisition was more than Microsoft currently wanted to pay. GitHub was last valued at $2 billion in its last funding round 2015, but the price tag for an acquisition could be $5 billion or more, based on a price that was floated last year. GitHub's tools have become essential to software developers, who use it to store code, keep track of updates and discuss issues. The privately held company has more than 23 million individual users in more than 1.5 million organizations. It was on track to book more than $200 million in subscription revenue, including more than $110 million from companies using its enterprise product, GitHub told CNBC last fall.Microsoft has reportedly flirted with buying GitHub in the past, including in 2016, although GitHub denied those reports. A partnership would give Microsoft another connection point to the developers it needs to court to build applications on its various platforms, including the Azure cloud. Microsoft could also use data from GitHub to improve its artificial intelligence producs. The talks come amid GitHub's struggle to replace CEO and founder Chris Wanstrath, who stepped down 10 months ago. Business Insider reported that Microsoft exec Nat Friedman -- who previously ran Xamarin, a developer tools start-up that Microsoft acquired in 2016 -- may take that CEO role. Google's senior VP of ads and commerce, Sridhar Ramaswamy, has also been in discussions for the job, says the report. Microsoft declined to comment on the report. GitHub did not immediately return a request for comment.
---> Summarized Content (Ratio is 0.3):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
---> Summarized Content (Ratio is 0.5):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Microsoft declined to comment, but you can read the full Business Insider report here.
While we wait for further word on the future of GitHub, one thing is very clear: It would make perfect sense for Microsoft to buy the startup.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
---> Summarized Content (Ratio is 0.7):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Microsoft declined to comment, but you can read the full Business Insider report here.
While we wait for further word on the future of GitHub, one thing is very clear: It would make perfect sense for Microsoft to buy the startup.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
From there, anyone from all over the world can download those projects and submit their own improvements.
development world.
结果
Original Content:
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users. It's not immediately clear what will come of these talks. Microsoft declined to comment, but you can read the full Business Insider report here. While we wait for further word on the future of GitHub, one thing is very clear: It would make perfect sense for Microsoft to buy the startup. If the stars align, and GitHub is integrated intelligently into Microsoft's products, it could give the company a big edge against Amazon Web Services, the leading player in the fast-growing cloud market. Just to catch you up: GitHub is an online service that allows developers to host their software projects. From there, anyone from all over the world can download those projects and submit their own improvements. That functionality has made GitHub the center of the open source software. development world.
---> Summarized Content (Ratio is 0.3):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
---> Summarized Content (Ratio is 0.5):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Microsoft declined to comment, but you can read the full Business Insider report here.
While we wait for further word on the future of GitHub, one thing is very clear: It would make perfect sense for Microsoft to buy the startup.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
---> Summarized Content (Ratio is 0.7):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Microsoft declined to comment, but you can read the full Business Insider report here.
While we wait for further word on the future of GitHub, one thing is very clear: It would make perfect sense for Microsoft to buy the startup.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
From there, anyone from all over the world can download those projects and submit their own improvements.
development world.
第五步:尝试不同的字数
字数参数是控制结果的另一个变量。如果同时输入了字数和比率。比率将被忽略。
print('Original Content:')
print(content)
for word_count in [10, 30, 50]:
summarized_content = gensim.summarization.summarize(body, word_count=word_count)
print()
print('---> Summarized Content (Word Count is %d):' % word_count)
print(summarized_content)
结果
riginal Content:
Microsoft held talks in the past few weeks to acquire software developer platform GitHub, Business Insider reports. One person familiar with the discussions between the companies told CNBC that they had been considering a joint marketing partnership valued around $35 million, and that those discussions had progressed to a possible investment or outright acquisition. It is unclear whether talks are still ongoing, but this person said that GitHub's price for a full acquisition was more than Microsoft currently wanted to pay. GitHub was last valued at $2 billion in its last funding round 2015, but the price tag for an acquisition could be $5 billion or more, based on a price that was floated last year. GitHub's tools have become essential to software developers, who use it to store code, keep track of updates and discuss issues. The privately held company has more than 23 million individual users in more than 1.5 million organizations. It was on track to book more than $200 million in subscription revenue, including more than $110 million from companies using its enterprise product, GitHub told CNBC last fall.Microsoft has reportedly flirted with buying GitHub in the past, including in 2016, although GitHub denied those reports. A partnership would give Microsoft another connection point to the developers it needs to court to build applications on its various platforms, including the Azure cloud. Microsoft could also use data from GitHub to improve its artificial intelligence producs. The talks come amid GitHub's struggle to replace CEO and founder Chris Wanstrath, who stepped down 10 months ago. Business Insider reported that Microsoft exec Nat Friedman -- who previously ran Xamarin, a developer tools start-up that Microsoft acquired in 2016 -- may take that CEO role. Google's senior VP of ads and commerce, Sridhar Ramaswamy, has also been in discussions for the job, says the report. Microsoft declined to comment on the report. GitHub did not immediately return a request for comment.
---> Summarized Content (Word Count is 10):
---> Summarized Content (Word Count is 30):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
---> Summarized Content (Word Count is 50):
On Friday, Business Insider reported that Microsoft has held talks to buy GitHub — a $2 billion startup that claims 24 million software developers as users.
Just to catch you up: GitHub is an online service that allows developers to host their software projects.
结论
对于完整的代码,你可以从 github 查看。如果你也想了解抽象方法,请告诉我们。稍后我会安排一篇文章
- 根据 gensim 源代码,建议输入至少 10 个句子
- 不需要训练数据或建模。
- 它不仅适用于英语,也适用于任何其他输入(符号、日语等)。你也可以阅读 TextRank 的研究论文来获得详细的理解。
- 从我的经验来看,大多数时候结果是不好。这可能是由于多种文字和的结果只是输入的一个子集。
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。
从TTP://medium . com/@ makcedward/访问我的博客
从 https://www.linkedin.com/in/edwardma1026获得连接
从https://github.com/makcedward探索我的代码
检查我的内核从https://www.kaggle.com/makcedward
《哈利·波特》系列的文本摘要
几种算法的比较
“Harry sat with Hermione and Ron in the library as the sun set outside, tearing feverishly through page after page of spells, hidden from one another by the massive piles of books on the desk in front.”
我是 Greg Rafferty,湾区的数据科学家。你可以在我的 github 上查看这个项目的代码。如有任何问题,请随时联系我!
在这一系列的文章中,我通过《哈利·波特》的镜头来看一些简便的自然语言处理技术。在这个关于基本自然语言处理的系列文章中,之前的文章着眼于使用潜在狄利克雷分配和正则表达式的主题建模,我的下一篇文章将着眼于情感分析。
赫敏打断了他们。“你们俩不打算读《霍格沃茨,一段历史》了吗?”
在整个《哈利·波特》系列中,赫敏让哈利和罗恩读了多少遍大部头的《霍格沃茨,一段历史》?提示:很多。他们三个在图书馆度过了多少个夜晚,通读他们能找到的每一本书来弄清尼可·勒梅是谁,或者如何在水下生存,或者为他们的 O.W.L.s .做准备?他们犯的错误是试图自己阅读所有的东西。
还记得当你在学校偶然发现那本书的 CliffsNotes 摘要,你从来没有读过,但应该写一篇文章吗?这就是文本摘要的基本功能:为任何大型文档提供 CliffsNotes 版本。现在,CliffsNotes 是由受过良好教育的人写的,他们熟悉他们正在总结的书。但是现在是二十一世纪,难道计算机不应该让人类失业吗?我研究了一些文本摘要算法,看看我们是否准备好让可怜的老克利夫顿失业。
有两种类型的文本摘要算法:抽取的和抽象的。所有提取摘要算法都试图对文档中的短语或句子进行评分,并且只返回最具信息量的文本块。抽象文本摘要实际上创建了文档中不存在的新文本。抽象概括是你在向你的朋友解释你读过的一本书时可能会做的事情,对计算机来说,这比抽象概括要困难得多。计算机在创造方面并不那么出色。到目前为止,还没有任何抽象的摘要技术能够很好地处理长文档。表现最好的只是根据一个段落造一个句子,或者把句子的长度减半,同时保留尽可能多的信息。通常,语法会受到严重影响。它们通常基于神经网络模型。这篇文章将关注更简单的文本摘要技术。
我将展示的大多数算法都打包在 Python 的sumy
包中,但我也使用了Gensim
包中的一个摘要器和我自己编写的另一个技术,使用 LDA 主题关键字来丰富sumy
EdmundsonSummarizer
。所有的例子都输出了对哈利·波特与魔法石第一章的五句总结。完整代码见我的 Jupyter 笔记本。还有一句忠告:不要太苛刻地评判结果。它们不太好……(文本摘要似乎在枯燥的非小说类作品上效果更好)
LexRank 摘要生成器
LexRank 是一种无监督的方法,其灵感来自谷歌 PageRank 算法背后的相同想法。作者说,它是“基于句子图形表示中特征向量中心性的概念”,使用“基于句内余弦相似性的连接矩阵”好的,简而言之,它找出文档中所有单词的相对重要性,并选择包含最多高分单词的句子。
"The Potters, that's right, that's what I heard —" "— yes, their son, Harry —" Mr. Dursley stopped dead.
Twelve times he clicked the Put-Outer, until the only lights left on the whole street were two tiny pinpricks in the distance, which were the eyes of the cat watching him.
Dumbledore slipped the Put-Outer back inside his cloak and set off down the street toward number four, where he sat down on the wall next to the cat.
"But I c-c-can't stand it — Lily an' James dead — an' poor little Harry off ter live with Muggles —" "Yes, yes, it's all very sad, but get a grip on yourself, Hagrid, or we'll be found," Professor McGonagall whispered, patting Hagrid gingerly on the arm as Dumbledore stepped over the low garden wall and walked to the front door.
Dumbledore turned and walked back down the street.
Luhn 摘要生成器
1958 年,在 IBM 研究院工作的汉斯·彼得·鲁恩发表了第一个文本摘要算法。Luhn 的算法是一种基于 TF-IDF 并查看高重要性单词之间非重要单词的“窗口大小”的简单方法。它还为出现在文档开头附近的句子分配较高的权重。
It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs.
He didn't see the owls swooping past in broad daylight, though people down in the street did; they pointed and gazed open-mouthed as owl after owl sped overhead.
No one knows why, or how, but they're saying that when he couldn't kill Harry Potter, Voldemort's power somehow broke — and that's why he's gone."
"But I c-c-can't stand it — Lily an' James dead — an' poor little Harry off ter live with Muggles —" "Yes, yes, it's all very sad, but get a grip on yourself, Hagrid, or we'll be found," Professor McGonagall whispered, patting Hagrid gingerly on the arm as Dumbledore stepped over the low garden wall and walked to the front door.
G'night, Professor McGonagall — Professor Dumbledore, sir."
LSA 总结者
潜在语义分析是一种比较新的算法,结合了词频和奇异值分解。
He dashed back across the road, hurried up to his office, snapped at his secretary not to disturb him, seized his telephone, and had almost finished dialing his home number when he changed his mind.
It seemed that Professor McGonagall had reached the point she was most anxious to discuss, the real reason she had been waiting on a cold, hard wall all day, for neither as a cat nor as a woman had she fixed Dumbledore with such a piercing stare as she did now.
He looked simply too big to be allowed, and so wild — long tangles of bushy black hair and beard hid most of his face, he had hands the size of trash can lids, and his feet in their leather boots were like baby dolphins.
For a full minute the three of them stood and looked at the little bundle; Hagrid's shoulders shook, Professor McGonagall blinked furiously, and the twinkling light that usually shone from Dumbledore's eyes seemed to have gone out.
A breeze ruffled the neat hedges of Privet Drive, which lay silent and tidy under the inky sky, the very last place you would expect astonishing things to happen.
TextRank 摘要生成器
TextRank 是另一个基于 PageRank 思想的文本摘要器,也是与 LexRank 同时开发的,尽管是由不同的人群开发的。TextRank 比 LexRank 简单一点;虽然这两种算法非常相似,但 LexRank 应用启发式后处理步骤来删除高度重复的句子。
Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much.
They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.
Mr. Dursley was the director of a firm called Grunnings, which made drills.
He was a big, beefy man with hardly any neck, although he did have a very large mustache.
Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors.
埃德蒙森总结机
1969 年,Harold Edmundson 开发了以他名字命名的 summarizer 。埃德蒙森的算法和卢恩的算法是开创性的文本摘要技术之一。使 Edmundson summarizer 与众不同的是,它考虑到了“加分词”,即用户认为非常重要的词;“污名词”,重要性低甚至负面重要性的词;和“停用词”,它们与 NLP 处理中其他地方使用的相同。埃德蒙森建议使用文档标题中的单词作为奖励单词。使用章节标题作为奖励词,这是埃德蒙森输出:
The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street.
When Dudley had been put to bed, he went into the living room in time to catch the last report on the evening news: "And finally, bird-watchers everywhere have reported that the nation's owls have been behaving very unusually today.
Twelve times he clicked the Put-Outer, until the only lights left on the whole street were two tiny pinpricks in the distance, which were the eyes of the cat watching him.
Dumbledore slipped the Put-Outer back inside his cloak and set off down the street toward number four, where he sat down on the wall next to the cat.
He couldn't know that at this very moment, people meeting in secret all over the country were holding up their glasses and saying in hushed voices: "To Harry Potter — the boy who lived!"
我做的另一个添加是使用 LDA 提取主题关键词,然后将这些主题关键词作为额外的奖励词添加回去。经过这一修改,埃德蒙森的结果如下:
At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls.
When Dudley had been put to bed, he went into the living room in time to catch the last report on the evening news: "And finally, bird-watchers everywhere have reported that the nation's owls have been behaving very unusually today.
Twelve times he clicked the Put-Outer, until the only lights left on the whole street were two tiny pinpricks in the distance, which were the eyes of the cat watching him.
One small hand closed on the letter beside him and he slept on, not knowing he was special, not knowing he was famous, not knowing he would be woken in a few hours' time by Mrs. Dursley's scream as she opened the front door to put out the milk bottles, nor that he would spend the next few weeks being prodded and pinched by his cousin Dudley.
He couldn't know that at this very moment, people meeting in secret all over the country were holding up their glasses and saying in hushed voices: "To Harry Potter — the boy who lived!"
SumBasic Summarizer
SumBasic 算法于 2005 年开发,仅使用单词概率方法来确定句子的重要性。抱歉,但是它在这份文件上是相当糟糕的。
Mr. Dursley wondered.
"Harry.
The cat was still there.
"It certainly seems so," said Dumbledore.
"Yes," said Professor McGonagall.
哇哦。太可怕了。咳咳,继续…
KL 摘要生成器
KLSum 算法是一种贪婪的方法,只要 KL 散度(熵的一种度量)在减少,它就会向摘要中添加句子。
It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map.
It grew steadily louder as they looked up and down the street for some sign of a headlight; it swelled to a roar as they both looked up at the sky — and a huge motorcycle fell out of the air and landed on the road in front of them.
He looked simply too big to be allowed, and so wild — long tangles of bushy black hair and beard hid most of his face, he had hands the size of trash can lids, and his feet in their leather boots were like baby dolphins.
"But I c-c-can't stand it — Lily an' James dead — an' poor little Harry off ter live with Muggles —" "Yes, yes, it's all very sad, but get a grip on yourself, Hagrid, or we'll be found," Professor McGonagall whispered, patting Hagrid gingerly on the arm as Dumbledore stepped over the low garden wall and walked to the front door.
He clicked it once, and twelve balls of light sped back to their street lamps so that Privet Drive glowed suddenly orange and he could make out a tabby cat slinking around the corner at the other end of the street.
缩减汇总器
归约算法是另一种基于图的模型,它根据句子的边相对于文档中其他句子的权重之和来对句子进行估值。该权重的计算方式与在 TexRank 模型中相同。
Mrs. Potter was Mrs. Dursley's sister, but they hadn't met for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be.
It seemed that Professor McGonagall had reached the point she was most anxious to discuss, the real reason she had been waiting on a cold, hard wall all day, for neither as a cat nor as a woman had she fixed Dumbledore with such a piercing stare as she did now.
Dumbledore took Harry in his arms and turned toward the Dursleys' house.
"But I c-c-can't stand it — Lily an' James dead — an' poor little Harry off ter live with Muggles —" "Yes, yes, it's all very sad, but get a grip on yourself, Hagrid, or we'll be found," Professor McGonagall whispered, patting Hagrid gingerly on the arm as Dumbledore stepped over the low garden wall and walked to the front door.
G'night, Professor McGonagall — Professor Dumbledore, sir."
Gensim 摘要生成器
Python 的 Gensim 包包含一个概要生成器,它是 TextRank 算法的修改。Gensim 的方法修改了句子相似度函数。
It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs.
Dumbledore slipped the Put-Outer back inside his cloak and set off down the street toward number four, where he sat down on the wall next to the cat.
They're a kind of Muggle sweet I'm rather fond of." "No, thank you," said Professor McGonagall coldly, as though she didn't think this was the moment for lemon drops.
All this 'You-Know-Who' nonsense — for eleven years I have been trying to persuade people to call him by his proper name: Voldemort." Professor McGonagall flinched, but Dumbledore, who was unsticking two lemon drops, seemed not to notice.
Professor McGonagall shot a sharp look at Dumbledore and said, "The owls are nothing next to the rumors that are flying around.
It seemed that Professor McGonagall had reached the point she was most anxious to discuss, the real reason she had been waiting on a cold, hard wall all day, for neither as a cat nor as a woman had she fixed Dumbledore with such a piercing stare as she did now.
那么你认为哪种算法提供了最好的总结呢?在做出最终判断之前,有许多参数需要调整。一些可能在较短的摘要上表现更好,一些在较长的摘要上表现更好。写作风格可能会有所不同(我之前提到过,我总结非小说的运气比小说好)。但是如果你是哈利,带着回答某个问题的意图走进霍格沃茨的图书馆,却被“图书馆的庞大”所吓倒;几万本书;千架;数百个窄行”,那么只需点击几下鼠标,就可以得到一些摘要,这不会有什么坏处。要是巫师们使用这种愚蠢的麻瓜作品就好了…
带有亚马逊评论的文本摘要
With many products comes many reviews for training.
在本文中,我们将使用亚马逊的美食评论来构建一个可以总结文本的模型。具体来说,我们将使用评论的描述作为我们的输入数据,使用评论的标题作为我们的目标数据。要下载数据集并了解更多信息,您可以在 Kaggle 上找到它。如果你决定建立一个像我这样的模型,你会发现它能够生成一些非常好的摘要:
描述(1):咖啡味道好极了,价格也这么便宜!我强烈推荐这个给大家!
总结(1):大咖
描述(2):这是我买过的最难吃的奶酪!我再也不会买它了,希望你也不要买!
汇总(二):omg 毛总额
代码是用 Python 写的,TensorFlow 1.1 将是我们的深度学习库。如果您还没有使用 TensorFlow 1.1,您将会看到构建 seq2seq 模型与以前的版本有很大的不同。为了帮助生成一些很棒的摘要,我们将在编码层使用双向 RNN,在解码层使用注意力。我们将建立的模型类似于潘新和刘泳的模型,来自“用于文本摘要的具有注意力的序列到序列模型”( GitHub )。此外,相当多的信用应该给予 Jaemin Cho 教程( GitHub )。这是我使用 TensorFlow 1.1 的第一个项目,他的教程确实帮助我将代码整理得井井有条。
注意:和我的其他文章一样,我将只展示我作品的主要部分,并且我将删除大部分的评论以保持简短。你可以在我的Github上看到整个项目。
准备数据
首先,我将解释我是如何清理文本的:
- 转换成小写。
- 用更长的形式代替收缩。
- 删除任何不需要的字符(这一步需要在替换缩写后完成,因为省略号将被删除。注意连字符前的反斜杠。如果没有这个斜杠,所有在连字符前后的字符之间的字符都将被删除。这可能会产生一些不必要的效果。举个例子,输入“a-d”会去掉 a,b,c,d)。
- 停用词只会从描述中删除。它们与训练模型不太相关,因此通过移除它们,我们能够更快地训练模型,因为数据更少。它们将保留在摘要中,因为它们相当短,我希望它们听起来更像自然短语。
def clean_text(text, remove_stopwords = True):
# Convert words to lower case
text = text.lower()
# Replace contractions with their longer forms
if True:
text = text.split()
new_text = []
for word in text:
if word in contractions:
new_text.append(contractions[word])
else:
new_text.append(word)
text = " ".join(new_text)
# Format words and remove unwanted characters
text = re.sub(r'https?:\/\/.*[\r\n]*', '', text,
flags=re.MULTILINE)
text = re.sub(r'\<a href', ' ', text)
text = re.sub(r'&', '', text)
text = re.sub(r'[_"\-;%()|+&=*%.,!?:#$@\[\]/]', ' ', text)
text = re.sub(r'<br />', ' ', text)
text = re.sub(r'\'', ' ', text)
# Optionally, remove stop words
if remove_stopwords:
text = text.split()
stops = set(stopwords.words("english"))
text = [w for w in text if not w in stops]
text = " ".join(text)return text
我们将使用预先训练的词向量来帮助提高我们的模型的性能。过去,我曾为此使用过 GloVe,但我发现了另一组单词嵌入,名为concept net number batch(CN)。基于其创造者的工作,它似乎优于 GloVe,这是有道理的,因为 CN 是包括 GloVe 在内的嵌入的集合。
embeddings_index = {}
with open('/Users/Dave/Desktop/Programming/numberbatch-en-17.02.txt', encoding='utf-8') as f:
for line in f:
values = line.split(' ')
word = values[0]
embedding = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = embedding
我们将把我们的词汇限制在 CN 中或者在我们的数据集中出现超过 20 次的单词。这将允许我们对每个单词都有非常好的嵌入,因为模型可以更好地理解单词在它们出现更多次时是如何相关的。
在构建您的word_embedding_matrix
时,将它的“dtype”NP . zeros 设置为 float32 是非常重要的。默认值是 float64,但这不适用于 TensorFlow,因为它希望值限制为 _32。
embedding_dim = 300
nb_words = len(vocab_to_int)word_embedding_matrix = np.zeros((nb_words, embedding_dim),
dtype=np.float32)
for word, i in vocab_to_int.items():
if word in embeddings_index:
word_embedding_matrix[i] = embeddings_index[word]
else:
# If word not in CN, create a random embedding for it
new_embedding = np.array(np.random.uniform(-1.0, 1.0, embedding_dim))
embeddings_index[word] = new_embedding
word_embedding_matrix[i] = new_embedding
为了帮助更快地训练模型,我们将根据描述的长度从最短到最长对评论进行排序。这将有助于每一批具有相似长度的描述,这将导致更少的填充,从而更少的计算。我们可以根据摘要的长度进行二次排序,但是这将导致大量的循环来组织数据。另外,我怀疑它会减少多少额外的填充,因为摘要相当短。
由于描述或摘要中的 UNK 令牌的数量,一些评论将不包括在内。如果描述中有超过 1 个 UNK 或摘要中有任何 UNKs,则不会使用该评论。这样做是为了确保我们用有意义的数据构建模型。只有不到 0.7%的词是 UNKs,所以不会有很多评论被删除。
for length in range(min(lengths_texts.counts), max_text_length):
for count, words in enumerate(int_summaries):
if (len(int_summaries[count]) >= min_length and
len(int_summaries[count]) <= max_summary_length and
len(int_texts[count]) >= min_length and
unk_counter(int_summaries[count]) <= unk_summary_limit and
unk_counter(int_texts[count]) <= unk_text_limit and
length == len(int_texts[count])
):
sorted_summaries.append(int_summaries[count])
sorted_texts.append(int_texts[count])
构建模型
我们需要为这个模型做一些占位符。大多数都是不言自明的,但是有几个需要明确的是,summary_length
和text_length
是一个批处理中每个句子的长度,max_summary_length
是一个批处理中摘要的最大长度。
def model_inputs():
input_data = tf.placeholder(tf.int32,[None, None], name='input')
targets = tf.placeholder(tf.int32, [None, None], name='targets')
lr = tf.placeholder(tf.float32, name='learning_rate')
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
summary_length = tf.placeholder(tf.int32, (None,),
name='summary_length')
max_summary_length = tf.reduce_max(summary_length,
name='max_dec_len')
text_length = tf.placeholder(tf.int32, (None,),
name='text_length')return input_data, targets, lr, keep_prob, summary_length,
max_summary_length, text_length
为了构建我们的编码层,我们将使用 LSTMs 的双向 RNN。如果您使用过 TensorFlow 的早期版本,您会注意到这种布局与通常创建两个层的方式不同。通常,只需将两个 LSTMs 包装在 tf.contrib.rnn.MultiRNNCell 中,但这种方法不再可行。这是我发现的一个方法,尽管代码更多,但也同样有效。
一些需要注意的事项:
- 你需要使用
tf.variable_scope
,这样你的变量可以在每一层重用。如果你真的不知道我在说什么,那就去看看 TensorFlow 的 word2vec 教程。 - 因为我们使用的是双向 RNN,所以需要将输出连接起来
- 初始化器与潘和刘模型中的初始化器相同。
def encoding_layer(rnn_size, sequence_length, num_layers,
rnn_inputs, keep_prob):
for layer in range(num_layers):
with tf.variable_scope('encoder_{}'.format(layer)):
cell_fw = tf.contrib.rnn.LSTMCell(rnn_size,
initializer=tf.random_uniform_initializer(-0.1,
0.1,
seed=2))
cell_fw = tf.contrib.rnn.DropoutWrapper(cell_fw,
input_keep_prob = keep_prob) cell_bw = tf.contrib.rnn.LSTMCell(rnn_size,
initializer=tf.random_uniform_initializer(-0.1,
0.1,
seed=2))
cell_bw = tf.contrib.rnn.DropoutWrapper(cell_bw,
input_keep_prob = keep_prob) enc_output, enc_state = tf.nn.bidirectional_dynamic_rnn(
cell_fw,
cell_bw,
rnn_inputs,
sequence_length,
dtype=tf.float32)
enc_output = tf.concat(enc_output,2)
return enc_output, enc_state
为了创建我们的训练和推理解码层,TF 1.1 中有一些新的函数…为你分解事情:
TrainingHelper
从编码层读取整数序列。BasicDecoder
用解码单元和输出层处理序列,输出层是全连接层。initial_state
来自我们的DynamicAttentionWrapperState
,你很快就会看到。dynamic_decode
创建将用于培训的输出。
def training_decoding_layer(dec_embed_input, summary_length,
dec_cell, initial_state, output_layer,
vocab_size, max_summary_length):
training_helper = tf.contrib.seq2seq.TrainingHelper(
inputs=dec_embed_input,
sequence_length=summary_length,
time_major=False) training_decoder = tf.contrib.seq2seq.BasicDecoder(
dec_cell,
training_helper,
initial_state,
output_layer) training_logits, _ = tf.contrib.seq2seq.dynamic_decode(
training_decoder,
output_time_major=False,
impute_finished=True,
maximum_iterations=max_summary_length)
return training_logits
如你所见,这与训练层非常相似。主要区别是GreedyEmbeddingHelper
,它使用输出的 argmax(被视为 logits)并通过一个嵌入层传递结果以获得下一个输入。虽然是要求start_tokens
,但是我们只有一个,<GO>
。
def inference_decoding_layer(embeddings, start_token, end_token,
dec_cell, initial_state, output_layer,
max_summary_length, batch_size):
start_tokens = tf.tile(tf.constant([start_token],
dtype=tf.int32),
[batch_size],
name='start_tokens')
inference_helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(
embeddings,
start_tokens,
end_token)
inference_decoder = tf.contrib.seq2seq.BasicDecoder(
dec_cell,
inference_helper,
initial_state,
output_layer)
inference_logits, _ = tf.contrib.seq2seq.dynamic_decode(
inference_decoder,
output_time_major=False,
impute_finished=True,
maximum_iterations=max_summary_length)
return inference_logits
虽然解码层可能看起来有点复杂,但它可以分为三个部分:解码细胞、注意力和获取我们的逻辑。
解码单元格:
- 只是一个辍学的双层 LSTM。
注意:
- 我用 Bhadanau 代替 Luong 作为我的注意力风格。使用它有助于模型更快地训练,并可以产生更好的结果(这里有一篇好论文,它比较了这两者以及 seq2seq 模型的许多方面)。
DynamicAttentionWrapper
将注意力机制应用于我们的解码单元。DynamicAttentionWrapperState
创建我们用于训练和推理层的初始状态。由于我们在解码层使用双向 RNN,我们只能使用前向或后向状态。我选择向前,因为这是潘和刘选择的状态。
def decoding_layer(dec_embed_input, embeddings, enc_output,
enc_state, vocab_size, text_length,
summary_length, max_summary_length, rnn_size,
vocab_to_int, keep_prob, batch_size, num_layers):
for layer in range(num_layers):
with tf.variable_scope('decoder_{}'.format(layer)):
lstm = tf.contrib.rnn.LSTMCell(rnn_size,
initializer=tf.random_uniform_initializer(-0.1,
0.1,
seed=2))
dec_cell = tf.contrib.rnn.DropoutWrapper(
lstm,
input_keep_prob = keep_prob)
output_layer = Dense(vocab_size,
kernel_initializer = tf.truncated_normal_initializer(
mean=0.0,
stddev=0.1))
attn_mech = tf.contrib.seq2seq.BahdanauAttention(
rnn_size,
enc_output,
text_length,
normalize=False,
name='BahdanauAttention') dec_cell = tf.contrib.seq2seq.DynamicAttentionWrapper(dec_cell,
attn_mech,
rnn_size)
initial_state = tf.contrib.seq2seq.DynamicAttentionWrapperState(
enc_state[0],
_zero_state_tensors(rnn_size,
batch_size,
tf.float32))
with tf.variable_scope("decode"):
training_logits = training_decoding_layer(
dec_embed_input,
summary_length,
dec_cell,
initial_state,
output_layer,
vocab_size,
max_summary_length)
with tf.variable_scope("decode", reuse=True):
inference_logits = inference_decoding_layer(
embeddings,
vocab_to_int['<GO>'],
vocab_to_int['<EOS>'],
dec_cell,
initial_state,
output_layer,
max_summary_length,
batch_size) return training_logits, inference_logits
我们将使用我们之前创建的word_embedding_matrix
作为我们的嵌入。编码和解码序列都将使用这些嵌入。
这个函数的其余部分主要是收集前面函数的输出,以便它们可以用于训练模型和生成新的摘要。
def seq2seq_model(input_data, target_data, keep_prob, text_length,
summary_length, max_summary_length,
vocab_size, rnn_size, num_layers, vocab_to_int,
batch_size):
embeddings = word_embedding_matrix
enc_embed_input = tf.nn.embedding_lookup(embeddings, input_data)
enc_output, enc_state = encoding_layer(rnn_size,
text_length,
num_layers,
enc_embed_input,
keep_prob)
dec_input = process_encoding_input(target_data,
vocab_to_int,
batch_size)
dec_embed_input = tf.nn.embedding_lookup(embeddings, dec_input)
training_logits, inference_logits = decoding_layer(
dec_embed_input,
embeddings,
enc_output,
enc_state,
vocab_size,
text_length,
summary_length,
max_summary_length,
rnn_size,
vocab_to_int,
keep_prob,
batch_size,
num_layers)
return training_logits, inference_logits
创建批处理是非常典型的。这里我唯一想指出的是创建了pad_summaries_lengths
和pad_texts_lengths
。这些包含一批内的摘要/文本的长度,并将用作输入值:summary_length
和text_length
。我知道寻找这些输入值似乎是一种奇怪的方法,但这是我能找到的最好的/唯一的解决方案。
def get_batches(summaries, texts, batch_size): for batch_i in range(0, len(texts)//batch_size):
start_i = batch_i * batch_size
summaries_batch = summaries[start_i:start_i + batch_size]
texts_batch = texts[start_i:start_i + batch_size]
pad_summaries_batch = np.array(pad_sentence_batch(
summaries_batch))
pad_texts_batch = np.array(pad_sentence_batch(texts_batch))
pad_summaries_lengths = []
for summary in pad_summaries_batch:
pad_summaries_lengths.append(len(summary))
pad_texts_lengths = []
for text in pad_texts_batch:
pad_texts_lengths.append(len(text))
yield (pad_summaries_batch,
pad_texts_batch,
pad_summaries_lengths,
pad_texts_lengths)
这些是我用来训练这个模型的超参数。我不认为它们有什么太令人兴奋的,它们很标准。《100 个纪元》可能已经引起了你的注意。我使用这个较大的值,以便我的模型得到充分的训练,并且只在早期停止(当损失停止减少时)时停止训练。
epochs = 100
batch_size = 64
rnn_size = 256
num_layers = 2
learning_rate = 0.01
keep_probability = 0.75
我将跳过构建图表和如何训练模型。有一些很好的东西,比如我如何合并学习率衰减和早期停止,但我认为不值得在这里占用空间(如果你感兴趣,请查看我的 GitHub )。
生成您自己的摘要
您可以创建自己的描述,也可以使用数据集中的描述作为输入数据。使用你自己的描述会更有趣一些,因为你可以很有创意地去看看模型创建了什么样的摘要。下面的函数将使用我之前描述的clean_text
函数为您的模型准备描述。
def text_to_seq(text): text = clean_text(text)
return [vocab_to_int.get(word, vocab_to_int['<UNK>']) for word in text.split()]
我们需要加载相当多的张量来生成新的摘要。尽管如此,这并不太难。运行会话时,input_data
和text_length
需要乘以batch_size
以匹配模型的输入参数。您可以将summary_length
设置为您喜欢的任何值,但是我决定将其设置为随机的,以保持事情的精彩。要记住的主要事情是将其保持在模型训练的摘要长度范围内,即 2–13。
input_sentence = "*This is the worst cheese that I have ever bought! I will never buy it again and I hope you won’t either!*"
text = text_to_seq(input_sentence)#random = np.random.randint(0,len(clean_texts))
#input_sentence = clean_texts[random]
#text = text_to_seq(clean_texts[random])checkpoint = "./best_model.ckpt"loaded_graph = tf.Graph()
with tf.Session(graph=loaded_graph) as sess:
loader = tf.train.import_meta_graph(checkpoint + '.meta')
loader.restore(sess, checkpoint) input_data = loaded_graph.get_tensor_by_name('input:0')
logits = loaded_graph.get_tensor_by_name('predictions:0')
text_length = loaded_graph.get_tensor_by_name('text_length:0')
summary_length =
loaded_graph.get_tensor_by_name('summary_length:0')
keep_prob = loaded_graph.get_tensor_by_name('keep_prob:0')
answer_logits = sess.run(logits, {
input_data: [text]*batch_size,
summary_length: [np.random.randint(4,8)],
text_length: [len(text)]*batch_size,
keep_prob: 1.0})[0]# Remove the padding from the tweet
pad = vocab_to_int["<PAD>"]print('\nOriginal Text:', input_sentence)print('Text')
print('Word Ids: {}'.format([i for i in text if i != pad]))
print('Input Words: {}'.format([int_to_vocab[i] for
i in text if i != pad]))print('\nSummary')
print('Word Ids: {}'.format([i for i in answer_logits if i != pad]))
print('Response Words: {}'.format([int_to_vocab[i] for i in
answer_logits if i != pad]))
最后要注意的一点是,我只用 50,000 条评论的子集来训练我的模型。由于我使用的是 MacBook Pro,如果我使用所有的数据,我可能需要几天时间来训练这个模型。只要有可能,我就会使用 FloydHub 上的 GPU 来训练我的模型。如果您有时间,您可以将数据和 ConceptNet Numberbatch 上传到 FloydHub,然后用所有评论训练模型。让我知道怎么走!
这个项目到此为止!我希望你觉得它很有趣,并且学到了一些东西。尽管这个模型执行得相当好,并且只有一个数据子集,但是尝试扩展这个体系结构来提高生成的摘要的质量是很好的。这篇论文同时使用了 RNNs 和 CNN 来预测情绪,也许在这里也可以。如果有人尝试这样做,如果你能在下面的评论区贴一个链接就太好了,因为我会很高兴看到它。
感谢您的阅读,如果您有任何问题或意见,请告诉我!干杯!
在 Python 中使用 TFIDF 处理文本
继之前的 TFIDF post 之后,我们现在将在一段文本上手动实现 TFIDF、。
我们将计算一段文本中每个术语的 TFIDF 分数。文本将被符号化成句子,然后每个句子被认为是一个文档。
从导入所需的库开始:
接下来,获取一些随机文本进行测试。
一个非常简单的预处理功能:
现在,创建文档的函数:
以下函数是计算 TF 和 IDF 分数的先决条件:
获取 TF 和 IDF 分数的函数:
最后,
我们终于可以开始处理输入文本了。文本被符号化成句子并清除特殊字符。然后它被制作成一个名为 doc_info 的文档列表。
清理后的句子text _ sents _ clean被传入create _ freq _ dict函数。
doc_info 和freq dict _ list*:的输出*
doc _ info和freq dict _ list作为输入计算 TF 和 IDF 得分:****
**********
现在,通过将 TF 和 IDF 分数输入到函数 computeTFIDF 中来获得 TFIDF 分数:
我们可以清楚地看到,出现一次的单词比出现多次的单词具有更高的 TFIDF 得分,不仅仅是在同一个句子中,而是跨所有输入句子。
找出算法实际上是如何工作的总是比直接实现自动化版本更好。
Tflearn:在 Tensorflow 中使用 2x2x1 前馈神经网络求解 XOR
关于如何在 python tflearn 中仅使用 12 行代码训练 2x2x1 前馈神经网络来解决 XOR 问题的简单指南 python tflearn 是基于 Tensorflow 构建的深度学习库。
我们的网络的目标是训练一个网络接收两个布尔输入,并且仅当一个输入为真而另一个为假时才返回真。
包装
**from** **tflearn** **import** DNN
**from** **tflearn.layers.core** **import** input_data, dropout, fully_connected **from** **tflearn.layers.estimator** **import** regression
输入数据
我们将输入数据 X 和预期结果 Y 定义为列表的列表。由于神经网络本质上只处理数值,我们将把布尔表达式转换成数字,这样 True=1 和 False=0
X = [[0,0], [0,1], [1,0], [1,1]]
Y = [[0], [1], [1], [0]]
模型
我们定义输入、隐藏和输出层。
语法再简单不过了——对输入层使用 input_layer() ,对后续层使用full _ connected()。
input_layer = input_data(shape=[**None**, 2])
hidden_layer = fully_connected(input_layer , 2, activation='tanh')
output_layer = fully_connected(hidden_layer, 1, activation='tanh')
为什么形状的输入是**【无,2】?网络一次馈入多个学习实例。由于我们在每个学习示例中使用了两个特征**,并且有四个示例,所以我们的数据是形状的[4,2]。但是有时我们喜欢定义我们的网络,这样它可以接收任意数量的训练样本。我们可以将 None 用于任意数量的训练示例,并将输入形状定义为【None,number_of_features,…】****
regression = regression(output_layer , optimizer='sgd', loss='binary_crossentropy', learning_rate=5)
model = DNN(regression)
在上面的代码块中,我们定义了将执行反向传播和训练网络的回归变量。我们将使用随机梯度下降作为优化方法,使用二元交叉熵作为损失函数。
最后,我们简单地使用 DNN()在 ftlearn 中定义我们的(几乎)深度神经网络。
接下来,我们需要训练模型。在此过程中,回归器将尝试优化损失函数。训练的最终结果只是连接层节点的权重(和偏差)。
培养
model.fit(X, Y, n_epoch=5000, show_metric=**True**)
运行 model.fit()后,Tensorflow 会馈送输入数据 5000 次,并尝试拟合模型。
如果你的输出看起来像这样(以小损耗和高精度为目标),
>>> Training Step: 5048 | total loss: **0.31394** | time: 0.002s
| SGD | epoch: 5048 | loss: 0.31394 - binary_acc: 0.9994 -- iter: 4/4
你的模型有 0.999%的准确性,这意味着它成功地学会了解决问题。
请注意,您的回归变量不会总是产生相同的结果。它甚至可能无法学会正确解决我们的问题。这是因为网络权重是每次随机初始化的。神经网络也需要大量的训练数据来使反向传播正常工作。因此,我们的代码非常依赖于权重的初始化方式。
预言;预测;预告
为了检查我们的模型是否真的有效,让我们预测所有可能的组合,并使用简单的列表理解将输出转换为布尔值
[i[0] > 0 **for** i **in** model.predict(X)]
>>> [False, True, True, False]
太好了!我们的模型有效。
但是模型使用了什么逻辑来解决异或问题呢?让我们检查引擎盖下面。
重量分析
与 AND 和 OR 不同, XOR 的输出不是线性可分的。
因此,我们需要引入另一个隐藏层来解决它。原来,隐藏层中的每个节点都代表一种更简单的线性可分逻辑运算(AND、OR、NAND、…),输出层将充当由前一层的输出提供的另一种逻辑运算。
如果我们仅限于使用简单的逻辑运算,我们可以将 XOR 定义为
XOR(X1,X2) = AND(OR(X1,X2),NAND(X1,X2))
为了理解我们的网络使用什么逻辑来得出结果,我们需要分析它的权重(和偏差)。
我们用 model.get_weights(layer。W) 获取权重向量和 model.get_weights(层。W) 得到偏差向量。
print(model.get_weights(hidden_layer.W), model.get_weights(hidden_layer.b))
print(model.get_weights(output_layer.W), model.get_weights(output_layer.b))>>> [[ 3.86708593 -3.11288071] [ 3.87053323 -3.1126008 ]]
[-1.82562542 4.58438063]
>>> [[ 5.19325304]
[-4.87336922]
下图显示了各个权重属于哪个节点(为简单起见,数字四舍五入)
X1 和 X2 是我们的输入节点。 a1 和 a2 是我们隐藏层中的节点,而 O 是输出节点。 B1 和 B2 是偏差。
这告诉我们什么?嗯,还没什么进展。但是通过计算单个输入的节点激活,我们可以看到特定节点的行为。
我们正在使用公式( ×代表矩阵乘法):
激活= tanh(输入×权重+偏差)
注意,我们使用*tanh()表示激活将在[-1,1] 范围内。*
Rounded node activations for individual input combinations for acquired XOR neural network
- a1 当输入中至少有一个 1 时为真(1)。 a1 节点因此代表或逻辑运算
- a2 始终为真,除非两个输入都为真。 a2 节点因此代表与逻辑运算
- ****输出节点只有在 a1 和 a2 都为真时才为真。
输出节点可以重写为:
O(X1,X2) = 和 (a1(X1,X2),a2(X1,X2))=(OR(X1,X2),NAND(X1,X2))**
因此,经过训练的网络是 OR(X1,X2)和 NAND(X1,X2)的 AND 运算
请注意,由于随机权重初始化,结果会有所不同,这意味着每次训练模型时,您的权重可能会有所不同。
完整的来源可以在这里找到:
2018 年 CVPR 十大最酷论文
想获得灵感?快来加入我的 超级行情快讯 。😎
2018 年计算机视觉和模式识别大会(CVPR)于上周在美国盐湖城举行。这是计算机视觉领域的世界顶级会议。今年,CVPR 收到了 3300 份主要会议论文,接受了 979 份。超过 6500 人参加了会议,好家伙,这是史诗!6500 人挤进了这个房间:
CVPR 2018 Grand Ballroom
每年,CVPR 都会带来伟大的人和他们伟大的研究;总有新的东西可以看和学。当然,总会有一些论文发表新的突破性成果,并为该领域带来一些伟大的新知识。这些论文通常会在计算机视觉的许多子领域中塑造新的艺术状态。
然而最近,真正有趣的是那些开箱即用的和创造性的文件!随着最近计算机视觉深度学习的热潮,我们仍然在发现所有的可能性。许多论文将呈现深度网络在视觉中的全新应用。它们可能不是最基本的突破性作品,但它们看起来很有趣,并为该领域提供了一个创造性和启发性的视角,往往会从它们呈现的新角度引发新的想法。总而言之,他们很酷!
在这里,我将向你展示我认为 2018 年 CVPR 最酷的 10 篇论文。我们将看到最近才通过使用深度网络成为可能的新应用,以及其他提供如何使用它们的新方法的应用。你可能会在这个过程中获得一些新的想法;).不多说了,我们开始吧!
用合成数据训练深度网络:通过领域随机化弥合现实差距
这篇论文来自英伟达,并全力使用合成数据来训练卷积神经网络(CNN)。他们为虚幻引擎 4 创建了一个插件,可以生成合成的训练数据。真正的关键是它们随机化了训练数据可能具有的许多变量,包括:
- 对象的数量和类型
- 干扰物的数量、类型、颜色和比例
- 感兴趣的物体上的纹理和背景照片
- 虚拟摄像机相对于场景的位置
- 摄像机相对于场景的角度
- 点光源的数量和位置
他们展示了一些非常有希望的结果,证明了用合成数据进行预训练的有效性;这是以前从未达到过的结果。如果您缺少这一重要资源,它可能会对如何生成和使用合成数据有所启发。
Figure from the paper: Training Deep Networks with Synthetic Data: Bridging the Reality Gap by Domain Randomization
WESPE:用于数码相机的弱监督照片增强器
这个很聪明!他们训练一个生成对抗网络(GAN)来自动增强照片的美感。酷的地方在于它是弱监督;你不需要输入输出图像对!训练网络所需的只是一组“好”的图像(用于输出地面实况)和一组要增强的“坏”的图像(用于输入图像)。然后,GAN 被训练以生成输入的美学增强版本,通常会大大增强图像的颜色和对比度。
它使用起来既快速又简单,因为你不需要精确的图像对,最后你会得到一个“通用的”图像增强器。我也喜欢这是一种弱监督的方法。无监督学习似乎很遥远。但对于计算机视觉的许多子领域来说,弱监管似乎是一个有前途和有利可图的方向。
Figure from the paper: WESPE: Weakly Supervised Photo Enhancer for Digital Cameras
用多边形高效交互标注分割数据集——RNN++
深度网络工作得如此之好的主要原因之一是大型和完全注释的数据集的可用性。然而,对于许多计算机视觉任务来说,获取这样的数据既耗时又昂贵。特别地,分割数据需要对图像中的每个像素进行**的分类标记。**可以想象……对于大型数据集来说,这可能需要很长时间!
多边形-RNN++允许你在图像中的每个物体周围设置粗糙的多边形点,然后网络会自动生成分割标注!该论文表明,这种方法实际上推广得相当好,可以用来为分割任务创建快速而简单的注释!
Figure from the paper: Efficient Interactive Annotation of Segmentation Datasets with Polygon-RNN++
根据时尚图片制作胶囊衣柜
今天我该穿什么?如果每天早上有人或事能替你回答这个问题,那不是很好吗?这样你就不用回答了。那就跟胶囊衣柜打个招呼吧!
在本文中,作者设计了一个模型,给定一个候选服装和配饰的库存,可以组装一个最小的项目集,提供最大的混搭服装。它基本上是使用目标函数训练的,这些目标函数旨在捕捉视觉兼容性、多功能性和用户特定偏好的关键要素。有了衣柜胶囊,你就能轻松从衣柜里找到最适合你品味的衣服!
Figure from the paper: Creating Capsule Wardrobes from Fashion Images
Super SloMo:用于视频插值的多个中间帧的高质量估计
有没有想过用超慢动作拍摄超酷的东西?那就看看 Nvdia 的超级 SloMo 吧!他们的 CNN 估计中间视频帧,能够将标准的 30fps 视频转换成 240fps 的令人敬畏的慢动作!该模型估计帧之间的光流,并使用它来干净地插值视频帧,以便慢动作视频看起来清晰锐利。
A bullet going through an egg, super SloMo!
谁把狗放出来了?从视觉数据中模拟狗的行为
可能是有史以来最酷的研究论文名称!这里的想法是试图模拟狗的思想和行为。作者在狗的四肢上安装了许多传感器来收集它的运动数据;他们还在狗的头上安装了一个摄像头,以获得与狗相同的第一人称视角。一组 CNN 特征提取器用于从视频帧中获取图像特征,然后与传感器数据一起传递给一组 LSTMs,以学习和预测狗的动作。非常新的和创造性的应用,以及独特的任务设计和执行方式,使得这篇论文非常值得一读!希望它可以通过我们收集数据和应用深度学习技术的方式来激发未来的研究创造力。
Figure from the paper: Who Let The Dogs Out? Modeling Dog Behavior From Visual Data
学习分割每一个事物
在过去的几年里,来自何的团队(之前在微软研究院,现在在人工智能研究院)有很多伟大的计算机视觉研究。他们论文的伟大之处在于创造性和简单性的结合。ResNets 和 Mask R-CNN 都不是最疯狂或最复杂的研究想法。它们简单易行,但在实践中非常有效。这里的这个也没什么不同。
学习分割每样东西是 Mask R-CNN 的扩展,它赋予网络从训练期间看不到的类中分割对象的能力!这对于快速、廉价地获取数据集的注释非常有用。由于在这样的环境中可能有许多看不见的对象类别,所以它能够获得看不见的对象类别的一些通常很强的基线分段的事实对于能够在野外部署这样的分段网络是至关重要的。总的来说,这无疑是朝着正确的方向迈出的一步,让我们能够思考如何最大限度地利用我们的深度网络模型。
Figure from the paper: Learning to Segment Every Thing
你桌面上的足球
这篇论文应该赢得最佳时机奖,因为它正好在国际足联世界杯开幕时出版!这确实是计算机视觉在 CVPR 的“更酷”的应用之一。简而言之,作者训练了一个模型,给定一个足球比赛的视频,可以输出该比赛的动态 3D 重建。这意味着你可以使用增强现实在任何地方观看它!
真正聪明的部分是结合使用许多不同类型的信息。使用视频游戏数据来训练网络,从视频游戏数据中可以相当容易地提取 3D 网格。在测试时,提取玩家的边界框、姿态和轨迹(跨多个帧),以便分割玩家。这些 3D 片段可以很容易地投影到任何平面上(在这种情况下,您可以创建任何虚拟足球场!)因为在 AR 看足球赛!在我看来,这是一种使用合成数据进行训练的聪明方式。无论如何,这是一个有趣的应用程序!
Figure from the paper: Soccer on Your Tabletop
布局网络:从单个 RGB 图像重建 3D 房间布局
这是一个计算机视觉应用,我们很多人可能都曾经想到过:用相机拍下某样东西的照片,然后用数字 3D 重建它。这正是本文的目的,特别是三维重建房间。他们使用全景图像作为输入,以便获得房间的全景。输出是一个三维重建的房间布局,具有相当好的准确性!该模型足够强大,可以推广到不同形状的房间,并包含许多不同的家具。这是一个有趣的应用程序,你不会看到太多的研究人员在计算机视觉领域工作,所以很高兴看到。
Figure from the paper: LayoutNet: Reconstructing the 3D Room Layout from a Single RGB Image
学习可扩展图像识别的可转移架构
最后但并非最不重要的是许多人认为是深度学习的未来:神经架构搜索(NAS)。NAS 背后的基本思想是,我们可以使用另一个网络来“搜索”最佳模型结构,而不是手动设计网络体系结构。搜索将巧妙地基于一个奖励函数,该函数奖励在数据集上表现良好的模型。作者在论文中表明,这种架构可以实现比手动设计的模型更好的准确性。这在未来将是巨大的,特别是对于设计特定的应用,因为我们必须真正关注的是设计一个好的 NAS 算法,而不是为我们的特定应用手动设计特定的网络。一个设计良好的 NAS 算法足够灵活,可以为任何特定的任务找到一个好的网络。
Figure from the paper: Learning Transferable Architectures for Scalable Image Recognition
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
13 x 29 项目——观察印度对同性恋合法化的反应
这篇文章是 13x29 项目 的姊妹篇——最好在桌面上观看。完成这个项目的最好方法是首先阅读本文的介绍性部分,然后玩交互式网站。
2018 年 9 月 6 日,印度向未来迈出了大胆的一步。《土地法》宣布第 377 条的部分内容为非法,从而使成年人之间双方同意的身体关系合法化,无论其性别如何。
Celebrations post Section 377 Vedict | Credits: REUTERS/Francis Mascarenhas
人们没有庆祝做爱的自由。人们庆祝不用每天醒着的时候都想着自己是罪犯。这个判决花了 158 年,数以千计勇敢的活动家不屈不挠,五个有远见的法官的智慧才得以实现。
由于这一决定,今天世界上 75%的人生活在同性恋不是犯罪的国家。其他几个国家将会效仿印度改变他们的反同性恋法,印度未来的艾伦·图林斯和蒂姆·库克将不会为了克服耻辱而结束自己的生命。人们可以预料,这样一个历史性的判决将会得到社会各界的强烈反应。
为什么这么安静?
判决后的三天,我一直粘在我的推特上。我的心膨胀阅读推文和转发。
彩虹和骄傲溅满了我的推特。但是后来,我注意到一些奇怪的事情。我看到的所有推特都是娱乐圈的人。我没有看到商界人士、政治领袖或运动员对这一判决发表任何意见。
例如,当美国在全国各地将同性婚姻合法化时,这就是白宫庆祝的方式。
令我失望的是,判决被藏在床底下,没有以应有的方式庆祝。
其次,在关注了一些宝莱坞八卦之后(感谢 Koffee 和 Karan),我知道在宝莱坞圈子里谁是谁的朋友。似乎只有一群亲密的“朋友”在推特上谈论判决,而其他“团体”都很安静。网络科学表明,吸烟、肥胖、投票模式等许多特征会像疾病一样通过网络传播。LGBTQ-思想开放也能通过网络传播吗?在比其他群体更亲 LGBTQ 的群体中是否存在某些子网络?
这让我心中的夏洛克兴奋起来。这有什么规律吗?谁真的对判决发表了评论,这种反应如何因人的职业而异?
确认了 377 名嫌疑人
在不做太多假设的情况下,纯粹基于好奇心,我决定分析 13 个不同的领域,每个领域有 29 名有代表性的影响者,总共 377 人。我最初打算探索的领域是政治、娱乐、商业和体育。然后,我将这些字段细分为 13 组,如下所示:
- 政府:首相、内阁部长和工会部长
- 反对派 —来自国会、尼共(毛主义)、AAP 的领导人
- 州—29 个州的首席部长
- 信仰 —宗教领袖、组织、活动家
- 新闻业 —记者、编辑、作家
- 法律 —律师
- 体育 —板球运动员,奥运会奖牌获得者
- 宝莱坞——来自印度电影业的人们
- 音乐 —歌手
- 创意 —舞蹈指导、时装设计师、作家、音乐总监
- YouTube——在印度 YouTube 上很受欢迎
- 企业家精神——初创公司创始人、风投
- 福布斯 30 位 30 岁以下的人——福布斯 30 位 30 岁以下的人。
你可以在这里看看样本集中包括的人:https://twitter.com/iashris/lists
我的取样基于关注者的数量——一个衡量一个人影响力的指标。对于有相似追随者的人,我随机选择了一些人,我承认这并没有使抽样误差为零,但仍然给出了一个大的图景。
他们说了什么?
我对判决时人们谈论的话题很感兴趣,所以我决定选择 9 月 5 日午夜到 9 月 7 日午夜这段时间作为我的分析窗口——以 6 日判决日为中心。
我使用 Tweepy 库编写了一个 Python 脚本,获取了这三天里这 377 个人发布的所有 tweets。Twitter 没有 API 来访问日期之间的推文,所以我写了一个脚本,递归地将 start_date 推回,直到获取所需的推文。除了推文,我还提取了关注者的数量、他们的个人资料图片、使用的标签和他们的转发。我做了一个关键词分析,将推文分为“目标”和“非目标”——取决于推文是否包含标签或文字,如 377 、骄傲、 lgbt 、最高法院或爱就是爱。
A JSON file was obtained for every person with their tweets and hashtags
将群体网络化
我不仅对谁在说什么感兴趣,还对说类似话的人之间是否有某种联系感兴趣。为此,我必须知道每个群体中的人是如何相互联系的。
我在寻找的数据是——谁跟踪谁。Twitter 通过他们的 show friendship API 提供这些信息。我获得了一组人的所有可能组合的配对,并获得了他们的“友谊”数据。
CSV containing who-follows-whom data
可视化网络和热点
一旦我有了这两个部分——下一步就是想象它。有趣的部分开始了!我用这个神奇的力导向算法库触发了一个基于物理的模拟,它把那些互相跟随的人聚集在一起,把那些和其他人没有联系的人隔离开来。
为了指出那些对判决做出反应的人——让我们称他们为“反应者”——我给了他们一个彩虹标签,让他们与众不同。那些没有反应的人——让我们称他们为“非反应者”——我把他们的缩略图变小并进行灰度化。
安恩和……鼓点!
The Opposition Network
每条灰线都意味着 A 和 B 之间有某种联系——A 跟着 B,B 跟着 A,或者两者都跟着对方。您可以通过将鼠标悬停在图像上来准确了解这种关系。
紫色线表示 A 和 B 相互跟随。蓝/粉线是单向的,用指向被跟踪者的箭头指示方向。根据经验,联系最紧密的人占据了原力导向可视化的中心——所以沙希·塔鲁尔,国会议员,桑杰·尼鲁帕姆似乎是这个网络中联系最紧密的人。
嗯…那又怎样?
好问题。看起来很漂亮,但是这对我们有什么帮助呢?我们需要一种方法来比较反应堆和非反应堆的结合程度。
聚类系数
在图论中,聚集系数是对图中节点聚集程度的度量。有一个令人厌烦的技术定义,但我会用简单的术语来分解它。
考虑一下你的朋友圈。假设我有三个朋友——阿努拉格、普雷娜和科莫利卡。
你所有的朋友都是彼此的朋友。只有 Anurag 和 Prerna 是彼此的朋友。你可能不想把 Komolika 介绍给 Anurag 和 Prerna。
Your Friend Circle
现在,你的人际网络中可以存在的友谊总数是多少?让我们看看。anu rag-komo lika,anu rag-Prerna 和 Prerna-komo lika。
所以总共有三种可能的友谊,其中只有一种是真实的→阿努拉格和普雷那。所以给你朋友圈的聚类系数是 1/3 或者 0.33。
因此,聚类系数简单来说就是你的朋友中朋友对的数量与可能的朋友对总数的比率。
CC =你朋友中实际友谊的数量/可能友谊的总数(ⁿC₂)
如果 Komolika 不知何故坚持在难近母 Pujo 和一个新的友谊培养期间会见 Anurag,你的 CC 将更新到 2/3 (0.66)。
Komolika gets to know Anurag
Anurag 和 Komolika 花时间在一起,这使得 Prerna 因为你把 Komolika 介绍给 Anurag 而生气,因此她结束了和你的友谊。这是增加了你的聚类系数还是减少了?
Prerna caught up in the Kasauti of Life
这实际上将你的 CC 提高到 1,因为现在你所有的(剩余的)朋友——anu rag 和 Komolika 都是彼此的朋友。所以可能= 1,总= 1。
网络的 CC 定义为其单个节点的平均值。在 Prerna 结束和你的友谊后的最后一个场景中,你能计算出你朋友圈的平均 CC 吗?
对你来说,CC 是 1。
对于 Komolika,CC 也是 1。
对于 Anurag,CC 是 0.33
对于 Prerna,CC 是 0,因为她甚至没有两个朋友。
因此,您的网络的平均 CC 为 2.33/4 = 0.583 = 58.3%
分析
所有的东西都缝合在一起,界面看起来很好。在右侧边栏中,有针对整个网络以及反应堆和非反应堆计算的 CC。网络发布的关于判决的推文会自动加载到屏幕底部。
对于反对派网络,平均 CC 为 51.76%,这是相当高的。裁决反应堆的 CC 甚至更高!70%,而非反应器的 CC 为 19%。这直接表明,反应堆比非反应堆结合得更好,实际上是反对派中一个小的紧密联系的子集,实际上支持这一裁决。
现在我们知道了如何解释这些值,让我们看一下最终产品中的一些类别。
一朵花=一个愿望
每个类别都由一个花瓶代表。对于每一个对判决持肯定态度的人来说,花瓶里都有一朵花。
结果
最终结果可以在这里查看— Project 13 x 29 。该项目最好在桌面或平板电脑上观看。
新闻工作
The Journalism Network
新闻界对判决充满了希望,多达 25 人说了一些积极的话——花瓶里的大花束就说明了这一点。
还要注意这个网络的连接有多紧密。平均 CC 为 55.3%,但非反应器的 CC 为 0%,表明非反应器之间没有结合。这表明新闻网络有强烈的自由主义倾向,而不是像政府那样,我发现针掉在地上保持沉默,因此花瓶里没有花。
总结
以下是我从这个项目中得出的推论:
- 反应当然取决于职业。虽然法律和新闻等领域有近 85%的人在网络上表达积极的观点,但政府、州和体育等领域只有不到 10%的人对判决做出反应。职业确实会影响你对世界的看法。
- 不仅你的职业很重要,你在职业网络中的位置也很重要。总的来说,宝莱坞、反对派、法律和新闻业在群体内部有一个更小、联系更紧密的子网络,比其他群体更亲 LGBTQ。
- 像创造力、福布斯 30Under30 等不太集中的领域没有很好的定义,但来自不同领域的人的聚集具有最低的聚类系数,因此没有支持或反对 LGBTQ 的具体网络。
- 创业网络实际上有一个紧密编织的网络,它没有对判决作出回应。表现出任何反应的都是这群人中的局外人。
- 令人惊讶的是,许多宗教领袖,如古儒吉斯瓦拉吉玛首席执行官萨德古鲁,都对判决持积极态度。Faith 是唯一一个对判决有负面反应的网络。
那都是乡亲们!
我被网络科学迷住了,我正在进行一些实际的项目,看看网络能揭示什么样的隐藏模式。如果你有借助网络探索某个社会问题的想法,请给我写信。我一直在寻找令人敬畏的合作。
我想把这个项目献给我们的律师 Menaka Guruswamy、Arundhati Katju 和 Pritha Srikumar,他们代表了来自印度不同 IIT 的 20 名请愿者,在这个历史性的判决中发挥了很小的作用。成为这 20 个人中的一员是我的荣幸。
我将留给你这个由星金制作的美丽视频——爱有各种颜色。爱就是爱。
源代码?
如果你喜欢我的工作,考虑用 请我喝咖啡 来支持我的工作。该网站托管在Github——这意味着它是完全开源的。请随意查看代码,如果有问题,请告诉我。
2018 年 25 个最佳数据可视化
美化数据的艺术正在席卷全球。数据可视化专家和艺术家每天都在数据设计领域创造惊人的东西。
数据可视化并不是一个新现象。即使在它变得“酷”之前,数据可视化也是许多不同领域中可视化数据的重要工具。
从技术上来说,数据可视化包括所有的东西数据艺术,信息图表和数据仪表板。创造力的范围确实是无穷无尽的,我们很高兴看到它将如何继续发展。
过去几年发生的事情是,数据和数据分析呈现出新的特点。数据和信息现在是创造美丽视觉效果的工具。过去简单的图表和散点图现在变成了复杂而有创意的数据艺术品——有些漂亮到可以挂在墙上。
为了纪念世界各地所有做出惊人数据可视化的艺术家和设计师,这里收集了 2018 年最佳数据可视化。我们包括了一些 2017 年和更早的作品,因为它们太好了,不能错过。
2018 年最佳数据可视化
布鲁斯·斯普林斯汀历史
亚当·麦肯的数据可视化技术将布鲁斯·斯普林斯汀录制的每一首歌都可视化了。利用 Spotify 和其他书面来源的数据,他能够描绘出每首歌的每一个方面。专辑和歌曲是按流行程度排列的。每个设计细节都代表了专辑的一个方面。这个主题让人想起有种子、叶子和花的植物。它包括一个如何阅读的弹出窗口,以便于理解。
Hello Sun 应用程序
你好太阳应用程序创建的小倍数,是一个生活数据即你的手机。主仪表盘显示了世界上许多城市的太阳和月亮在天空中的运动。这种运动被描绘在圆形的天空地图上,随着太阳的升起和落下而改变颜色。每个城市都有一个主要的地标,只有当太阳产生阴影时才能看到。该应用程序还让用户通过 GPS 坐标了解 sun 在世界任何地方的行为。这样他们就可以规划出一个蔬菜园,或者知道他们想租的公寓下午是否会有阳光。
风和文字
复杂的电影系列和冗长复杂的电视节目有助于数据可视化。一个这样的例子是由不可能局设计的名为风和单词的交互数据。使用《权力的游戏》中的对话,这种复杂的数据可视化描述了该剧所有播出季中角色之间的互动。有直接互动的部分,使用的词汇,每个角色的情绪,最后一部分是如何使用数据。总而言之,探索数据是一件非常有趣的事情。
发射它
当平面设计师 Shane Mielke 出版他的书《Launch It》时,他还设计了一个惊人的在线数据可视化,描绘了他的书可以在哪里购买。这个交互式数据 viz 是一个可旋转的世界地图,显示了在哪里可以获得发布 It 图书的实时数据。为了使它更有趣,用户可以改变地图的颜色和标记的形状。
阿波罗
Paul Button 是一名平面设计师,他喜欢分析数据,并让数据变得美得令人难以置信。他一直对阿波罗任务和所有与太空有关的事情感兴趣。利用收集到的每一次阿波罗任务的数据,他创造了这种数据可视化。他把它作为艺术印刷品出售,相当成功。阿波罗数据 viz 海报是一个真正的宝石,不仅对太空探索狂热分子,而且对任何喜欢定期看到美丽数据的人来说。
行星地球
这本书由数据艺术家 Federica Fragapane 绘制,充满了关于动物和植物的彩色数据可视化页面。《地球星球》是一本儿童读物,因此创建数据可视化的过程与我们在其他地方看到的通常的数据密集型设计有些不同。Federica 从她小时候阅读的儿童书籍中获得灵感,并使用风格指南来帮助她在整本书中保持平衡的风格。
Keuzestress:寻找“正确的”睫毛膏
来自工作室 Terp 的 Sonja Kuijpers 无法在化妆品店挑选她想买的睫毛膏。为了做出决定,她依靠数据和她的创造才能。她对睫毛膏的可视化将来自荷兰一家在线化妆品商店的数据可视化。数据显示每种睫毛膏的颜色及其特殊特征;睫毛分离,赋予体积或长度,以及防水能力。通过数据分析,她能够确定自己需要哪种睫毛膏。在这个过程中创造美丽的数据艺术。
漫威电影宇宙
如果你看过任何一部漫威的电影,你就会知道这些角色和故事与其他电影交织在一起。自 2008 年以来,所有漫威电影实际上构成了漫威电影宇宙。有了这种交互式数据可视化,现在就有了一种有趣的方式来理解漫威电影宇宙中人物和电影之间的联系。由新加坡《海峡时报》的数据艺术家创建的这个数据很有趣,也很容易浏览。漫威狂热者将真正享受这一个!
生存空间
生活空间是一个关于国际空间站的交互式数据可视化。Tiziana Alocci 为 BBC Future 设计了这个项目。互动设计描绘了国际空间站建设的每一步。这个数据是 2015 年的互动信息图,但它仍然是我们的最爱。
木星的众多卫星
你知道木星到底有多少颗卫星吗?你知道最大的木卫三比水星还要大吗?设计师 James Round 创建了关于木星许多卫星的数据可视化,包括每个卫星的名称、大小、发现日期和发现者。它很容易阅读,而且相当丰富多彩。它可以很容易地打印成海报挂在墙上。
疯狂富有的亚洲人
今年夏天最热门的电影不仅在美国,而且在亚洲引发了一些关于亚洲富人的现实。《南华早报》创建了一系列数据,即图表和交互式可视化,显示亚洲国家与世界其他国家相比的真实财富差距。整个系列非常有趣,更有趣的是关于富人在服装上花费多少的互动图表。当你给图表中的人穿衣服时,这些数据就会累加起来。
数据女性即
《今日数据可视化》的 Alli Torban 受到了我们上面提到的关于选择正确睫毛膏的 Keuzestress 可视化的启发。Alli 在睫毛膏中使用了与眼睛相似的风格,但是使用了心形。她的数据集是 Elijah Meeks 进行的关于数据可视化中女性的调查结果。《数据可视化中的女性》是一个练习,让你真正了解自己在做什么。
天空中的人影
天文学和星际数据是惊人的数据可视化的一个主要话题,这个也不例外。在想象星座时,构成天空中的图形的大量可视化内容都是关于不同文化如何共享星星的。例如,猎户座腰带上的三颗星被 17 种不同的文化用作许多不同种类星座的一部分。天文学家和数据爱好者 Nadieh Bremer 在收集这些数据方面做得非常出色。
最暴力的城市
Federica Fragapane 的这一数据可视化技术收集了世界各地城市凶杀案的数量数据。该图形设置为将城市显示为具有不同形状的垂直线,描绘了沿总人口水平轴放置的凶杀案总数。数据 viz 包括一个如何读取数据的图例和一个只有意大利城市数据的小部分。这是为《晚邮报》文化增刊创作的。
旅行签证不平等
有时候数据可视化非常有用。比如这篇关于旅游签证不平等的文章。Christian Laesser 创建了这个数据,即在去泰国旅行后,想知道每个国家的旅游签证优势是如何不同的。这种交互设计让用户点击一个国家,并找出是否需要签证才能访问任何其他国家,反之亦然。
CF 天气图
Clever 和 Franke 是一家数据设计公司,在荷兰和美国从事数据分析和设计工作。CF 天气图是他们最喜欢的特别项目之一。最新版本,第五版,于今年早些时候出版,内容是关于天气如何影响我们的情绪状态。这些数据收集了大量关于天气模式和人们在一年中不同时间做什么的数据。进行了关联,数据集包括大约 60 个可视化。完成的数据艺术以印刷海报的形式出售。
从我们失去的人身上吸取的教训
这是设计师 James Round 的另一个伟大的数据可视化。这一次他集中研究了大约一百年前灭绝物种的数据。目的是分析它们是如何灭绝的,什么时候,为什么。也许有了这些数据分析,我们可以了解未来如何拯救濒危动物。
古怪
当大多数基于音乐的数据可视化是关于一套专辑和歌曲,或关于整个时代,Oddity Viz 是关于一首歌。Valentina D 'Efilippo 和 Miriam Quick 广泛分析了大卫·鲍依的歌曲 Space Oddity,创建了这组美丽的数据可视化。该系列由十张刻本唱片组成,每张描绘了歌曲的一个方面;和声、旋律、歌词等等。每份记录都附有一张海报和如何阅读数据的说明。
228 年的总统生涯
尚未更新第 45 任总统的数据,该数据是对所有美国总统数据的完整回忆。另一个詹姆斯回合的美丽,这种数据可视化探索了 228 年的数据,如政党,教育,年龄和任职时间。
是的,确实有很多太空垃圾
Axios 的数据团队使用美国军方联合太空作战中心的数据创建了这些数据。根据他们的数据,有超过 13,000 块太空垃圾漂浮在近地轨道上。尽管数据惊人,但他们知道这并不完整,因为由于尺寸和其他因素,许多垃圾没有在卫星上登记。联合太空行动中心希望获得更多关于其他太空碎片的信息,以便参与太空探索的每个人都了解太空垃圾的危险。
卡卡托·樱花颂
由专业数据艺术家创建的个人数据项目通常极具创造性。Nadieh Bremer 的这个是关于日本漫画系列 Cardcaptor Sakura 的数据可视化。设计是丰富多彩的,有趣的,娱乐性的,当然也充满了数据。最棒的是,它还具有交互性。
封面的银河
音乐和对星际思想的热爱是如何融合在一起实现数据可视化的?这是一个关于著名歌曲翻唱的数据分析的可爱的互动例子。每首歌都是一颗行星,它的封面是围绕它运行的卫星。每个歌曲星球都可以点击,以可视化自己的具体数据。这些数据是由 Interactive Things 的团队创建的,非常值得一看。
红牛派对视觉化
这个数据可视化项目不是今年的,实际上是几年前的。但是我们太喜欢它了,所以它必须被包括在内。在阿姆斯特丹的一次聚会上,客人们得到了一个带有传感器的特殊手镯,这个传感器可以收集他们在俱乐部的体验数据。它收集了关于他们在俱乐部的哪个部分以及他们当时的感受的信息。晚上结束时,当客人归还手镯时,他们会得到自己用整晚收集的数据创作的数据艺术作品。
瘀伤,我们看不到的数据
在某些情况下,数据确实是个人的,最终产品与其说是图表的集合,不如说是一件艺术品。在这个项目中,分析的数据是人性的。意大利数据设计师 Giorgia Luppi 创建了这些艺术数据,以帮助她的朋友应对她儿子的医疗问题。她使用儿童治疗的医疗记录,并结合艺术和音乐来创建这个美丽的数据可视化。
珊瑚城市
我们在构建中期捕捉到了这个数据可视化。不确定这位数据艺术家是否会创造一个完整的光谱项目,但与此同时,我们喜欢看到他的珊瑚城市出现在 Twitter 上。克雷格·泰勒(Craig Taylor)使用了 10 个最宜居城市指数的数据和城市地图工具,创建了这些看起来像珊瑚的可视化图像。
市场咖啡馆杂志
这个条目不完全是一个 data viz,而是一个致力于数据可视化的杂志。《市场咖啡馆杂志》已经是第三版了,而且每出版一期都会越来越好。通过采访、特写和关于视觉数据艺术家的故事,这本杂志正成为所有数据可视化爱好者的需要。他们的 2018 版已经卖完了。设计师和创作者 Tiziana Alocci 和 Piero Zagami 在这本杂志上一针见血。
轮到你了
你见过今年创建的任何数据可视化应该包括在这个列表中吗?您是否创建了数据可视化并希望我们看一看它?在评论区给我们留言吧!
哈佛商业评论得到的 2x2 数据科学技能矩阵完全错误!
数据科学是目前市场上的热门词汇。目前,每家公司都在寻求聘请数据科学专业人士来解决一些他们自己目前没有意识到的数据问题。机器学习已经席卷了整个行业,市场上有一群自学成才的数据科学家。
由于数据科学这个词是一个完全不同的世界,所以很难设定学习什么和不学习什么的优先级。所以在这种情况下,《哈佛商业评论》发表了一篇关于你作为一个公司或个人应该重视什么的文章。让我们看一看。
Figure 1. The empty matrix taken from HBR original Article (Source)
这是 HBR 共享的空矩阵,这样你可以优先考虑你的学习路径。现在让我们看看他们在数据科学中填写了什么:
Figure 2. The Data Science Matrix proposed by HBR.
现在让我们看看从这个矩阵中可以得出的推论。
- 计划学习机器学习,但忽略预测分析,因为它没有用
- 计划学习机器学习,但忽略数学,因为学起来没用而且非常耗时。
- 计划学习统计编程,但忽略了统计&数学,因为它非常耗时。
- 现在学数据科学但是不太关心数据清理。
我不是专家,但即使对一个新手来说,这 4 句话看起来也像是讽刺。我们举个例子。
假设您正在处理一个包含 800 个要素和 1000 条记录的数据。现在你发现你需要减少特征,因为大多数特征是多余的(除非有人告诉你),但是记住你忽略了所有的数学或统计,所以你不知道数学或统计。由于您只是浏览了数据清理,您甚至不知道如何清理数据。那么在这种情况下,你将如何处理这种情况呢?
好的,所以你在谷歌上搜索“减少数据集中的特征”或其他地方,当你学习机器学习时,你发现有一种叫做 PCA 的东西可以为你做这项工作。
所以下一步是你谷歌“PCA sklearn”。检查文档并应用以下内容:
从 sklearn.decomposition 导入 PCA
X =主成分分析(0.99)。拟合 _ 转换(X)
很好,现在你的特征集减少到 60 个,你的训练结果很好。现在我的问题是:
- 你想成为这种只做事情的开发者吗?
- 你想成为一名只知道如何做的开发者,而不是只知道幕后的内部运作吗?
如果你对这两个问题的回答都是肯定的,那么你就非常适合那些只想把事情做好而不是掌握它们的公司。那么“软件工程师”对你来说是个不错的职位。
如果你对这两个问题的回答都是否定的,那么你就非常适合目前正在扩大研究部门的公司。那么“研究工程师”对你来说是个不错的职位。
如果你想从研究的角度来解决 PCA 问题,你会使用完全相同的代码,但是在幕后有不同的想法。因为这样你就可以看到特征之间的关系,组合新的特征,计算相关性,计算特征值,特征向量,最后选择那些对方差有 99%贡献的特征。
遵循这个矩阵是你的选择。明智选择!。
如果你有任何意见,请在评论中或在 LinkedIn 上告诉我。
我一生中迄今为止做的 3 个最好的决定?
今天是我 29 岁的生日,首先我要感谢我的父母,是他们把我带到了这个世界。
另一方面,我想谈谈迄今为止我一生中做得最好的 3 个决定。
- 我本科时学过德语
我在大学第一年没有注册德语/德语系,因此,我参加了考试,以便转到德语系。为什么是德语?因为我一直想去欧洲(欧洲大陆,对不起是英国),我知道德语是欧洲最常用的也是最受欢迎的第二语言之一。当然,你学了 3-4 年也学不到最好的德语,因为在台湾德语和德语的资源很少,而且毕业后没有那么多工作机会,嗯…尽管我很叛逆,我还是通过了考试,拿到了德语系的录取通知书。感谢上帝,他们只从考试中选了 5 个学生 50 多?我的英语和语文成绩很好,因此,我成功了!
2。选择来柏林学习我的硕士
三年半后,我完成了我的学士学位,我想让我的梦想成真。你在网上找不到太多申请德国国际项目的资源。在台湾的大多数情况下,你需要雇用顾问来检查每一份申请出国留学的文件。显然,没有顾问能在这方面帮助我。同样,我自己做了所有的事情,我找到了学校,参加了一些英语水平测试和 GRE,准备了申请,并请我的母语是英语的朋友校对了我的文件,并进行了一些学校面试。我真幸运,我又收到了一封贺信!
在那段时间里,我的父母认为我会失败并放弃,但我成功了,用两个行李箱打包了我的行李,然后我就到了欧洲!
问题是,我以前从未去过欧洲,这是一个很大的赌注,也是我父母无尽的担忧。
3。辞去全职工作,开始创业
在移动广告领域工作了几年后,我迫切地想要一些新的东西。经过几年的深思熟虑,我两次辞职,开始了新的旅程。有很多起伏(我不想在这里详述)然而,我学到的东西是极其不可思议的,更令人惊讶的是,我开始发展一些我从来不知道的其他技能。我开了几个新的中文专栏,有薪水;)此外,我也将很快开始另一个新的用英语谈论创业和科技创业的话题!敬请期待!
我们最终以 100 多份申请和 30 个团队赢得了一场创业竞赛,这样我们就可以加入最好的孵化器之一——柏林的 Hubaum。
此外,我刚刚在柏林策划并组织了我的第一次活动,有 100 多人参加,还有脸书和 Twitter 的投资者。500 startup partner 是小组成员,第 26 位,EyeEm 是演讲者,还有慷慨的赞助商 Cheetah Mobile/ TechCode,以及一些来自机器智能领域的初创公司和亲爱的朋友。
最后但同样重要的是,如果你经历过低潮期,你会重新评估你周围的关系。感谢你们所有人仍然支持我,对一个几乎破产的企业家给予相当大的支持。
统治他们的三分统计
引入 3NG
Image by patgui. CC0 Creative Commons License.
哗哗声
“嘣宝宝!”
90 年代的印第安纳步行者队球迷都知道这个戒指。斯利克·伦纳德叫了一声,这意味着雷吉·米勒刚刚投进了一个三分球。每次发生的时候我都有一种冲动。
20 年后,住在湾区,我一直对斯蒂芬库里(Steph Curry)的崛起心存敬畏。他的三分球是如此鼓舞人心,它彻底改变了比赛。
三分球投篮经常被两个统计数据分析,三分球命中率。大多数球迷认为最好的三分射手在这两方面都很出色。
然而,还没有一个统计数据来对最佳三分射手进行排名。三分球使得像安东尼·沃克这样的射手得到回报,尽管他的命中率只有 36.7%,但他在 2001 年仍然高居联盟榜首。根据三分球命中率,史蒂夫·科尔是历史上最好的,但他的投篮命中率不高。
有没有一种客观的方法可以将三分球命中率和三分球命中率合并成一个重要的数据?它会透露斯蒂芬库里是有史以来最伟大的三分射手吗?历史上最好的三分球球队呢?
3NG: 3 点净收益
每一次在球场上,球队都被期望得到一定数量的分数。自从 1980 年引入三分球以来,NBA 平均每球得分约为 1.06 分。
NBA 球员每投中一个 3 分球,他的球队就获得超出期望值的 1.94 分。球员每投失一个 3 分球,他的球队就失去了 1.06 分的期望值。
3NG 的计算公式如下:
让 3P =三分球命中。
让 3Mi = 3 分不中。
设 EV =期望值,每次控球的期望得分。
那么 3NG = 3P * (3 - EV) - 3Mi * EV。
用 1.06 代替 EV(仅 NBA),我们得到:
3 ng = 3P * 1.94-3 米* 1.06。
换句话说,3NG 是三分球命中率乘以每次投篮的净收益与三分球命中率乘以期望值之间的差值。
实际上,3NG 传达了球员或球队通过投中三分球而获得的超出联盟平均水平的净得分。球员投中三分球会得到奖励,投失会受到惩罚。3NG 可以通过比赛、赛季或整个职业生涯来计算。
让我们检查数据,看看 3NG 如何满足预期。我的例子是基于从 basketballreference.com T2 争论来的数据。
作为开始,让我们从 2018 年开始考虑联盟领袖。
3NG 联赛领跑者 2018
3NG is per-game unless otherwise stated. For all tables EV =1.0644871794871795, the NBA points per possession mean since 1980.
根据 3NG 的数据,2018 年勇士队的场均得分超过联盟平均水平 2.03 分,斯蒂芬·库里投了 3 分。他们还从克莱·汤普森获得了 1.84 分,从凯文·杜兰特获得了 1.16 分。前十名中的每个人都超过了百分之四十。
3NG 的妙处在于可以跨赛季跨代比较玩家。想想有史以来的十大赛季。
3NG 史上最佳赛季
3NG can be weighted by season. I prefer unweighted because it provides an even baseline of comparison.
Steph Curry “Sky High” Wallpaper by IshaanMishra. Creative Commons 3.0 License.
斯蒂芬·库里惊人地占据了前六名中的四席。斯蒂芬一致获得 2016 年 MVP,甚至超过了他之前的最好成绩。凯尔·科沃尔 2015 年的三分球命中率达到了可笑的 49.2%,稳居第二。
1997 年的格伦·莱斯有点另类。谁是 90 年代最好的三分射手?
3 ng 90 年代最佳
所有的球员都是 90 年代后半期的。比较一下雷吉·米勒和史蒂夫·科尔,分别排在第六和第七位。雷吉投中了更多的三分球,但史蒂夫·科尔的命中率更高。谁是更好的三分射手?3NG 提供了一个有统计意义的答案。
我们也可以用 3NG 来对比球队,像 2018 年的火箭和勇士。2018 年的火箭队打破了一个赛季最多三分球的 NBA 纪录。他们带领勇士队,一支传奇的三分球球队,在西部决赛中打了七场比赛。常规赛谁的三分球投得更好?
3NG 勇士队对火箭队 2018,仅限合格球员
Negative 3NG scores mean that the team is scoring less than the league average by the player shooting 3’s.
勇士统治着顶端,但火箭拥有中间。最有价值球员詹姆斯·哈登落后于 66 名球员,而安德烈·伊戈达拉和德雷蒙德·格林的贡献为负。
将上表中的 3 分加起来,就可以看出哪支球队在全力投 3 分时净胜分更多。
GSW: 4.32
HOU: 1.95
另一种选择是通过对整个赛季的三分球求和来计算 3NG。这考虑到了交易,伤病和不合格的球员。总结结果如下。
GSW: 3.12
HOU: 0.91
2018 年的勇士队是超级三分球球队,在这两个方面都超过了火箭队一倍。他们在历史上是如何排名的?
空前的 3 支顶级球队
The 2018 Warriors would rank #2 by summing qualified players only. Injuries played a big role in 2018.
勇士队和 7 秒或更少的太阳队以 8 个位置统治着这个名单。1997 年的夏洛特黄蜂队是一个惊喜,直到人们意识到他们有格伦·莱斯和德尔库里。前十名包括两个 NBA 冠军和七个联盟决赛选手。勇士队破纪录的 73 胜赛季是一个令人印象深刻的异数。
为了确定最佳三分射手,我们可以将 3NG 相加,然后除以赛季数。
3NG 职业平均值
I required a minimum of 5 NBA seasons.
除了队友克莱·汤普森和凯尔·科沃尔,斯蒂芬·库里比名单上的其他人都强。这个列表回答了一个我们还没有提出的问题。是什么让勇士如此有统治力?他们有历史上最好的两个三分射手。
同代人中最令人兴奋的三分射手雷吉·米勒在哪里?他打了 18 个赛季,在 NBA 历史上,除了雷·阿伦,他投中的三分球比任何人都多。我们可以找到雷吉,以及其他伟大的历史射手,在 3 个职业生涯总数。
Reggie Miller Pacers Wallpaper by IshaanMishra. Creative Commons 3.0 License.
3NG 职业生涯总计
这是一份漂亮的清单。
游戏结束
3 个点的净收益,或者说 3NG,已经超出了我的预期。它在历史上积累得很好,准确地对当代射手和球队进行了排名。3NG 是一个有意义的、可验证的统计数据,传达了有价值的信息
3NG 可以申请任何联赛,WNBA,大学,高中等。用适当的期望值作为比较的基线。它可以被教练、球探和球员用来做出重要的决定。球迷可以使用 3NG 来确定谁是最好的 3 分射手。
鼓励发行 3NG,前提是注明作者 Corey J Wade。
见https://github.com/coreyjwade/New_NBA_3-point_Stats关于熊猫的数据分析和附加的 3 点统计。
深度学习的 3 门热门课程
在过去的两年里,我一直积极专注于深度学习。我个人对深度学习的兴趣始于 2015 年左右,当时谷歌开源了 Tensorflow。快速尝试了 Tensorflow 文档中的几个例子,感觉深度学习很难,部分原因是该框架是新的,需要更好的硬件和大量的耐心。
快进到 2017 年,我已经花了 100 个小时在深度学习项目上,由于软件(易用性——Keras、 PyTorch )、硬件(GPU 对像我这样坐在印度的人来说变得商业可行——并不便宜)、数据可用性、好书和 MOOCs 的几项进步,技术变得越来越容易获得。在完成了来自 Fast.ai 、deeplearning.ai/Coursera(尚未完全发布)和 Udacity 的深度学习 3 门最受欢迎的 MOOCS 之后,我相信一篇关于你可以从这 3 门课程中期待什么的帖子会对未来的深度学习爱好者有用。
在这篇文章中,我将谈论每门课程的 5 个方面来帮助你做出决定。
- **关于古鲁:**每门课程都由有着非常不同经历的了不起的人来教授。我相信这些经历对教学风格有很大的影响。因此,我们将看看我们的课程大师的背景。
- **关于课程:**课程的高层次概述。
- **亮点:**要点突出课程让你觉得 wow 的地方。
- **限制:**我想对这个词非常挑剔,因为我知道他们所有人都为如何让内容易于访问付出了巨大而真诚的努力。我想把这部分理解为,我们在课程中错过的内容。某些限制可能是因为课程的设计。
- **费用:**参加课程产生的费用。
Fast.ai:
在 KDNudggets 看一篇文章的时候偶然发现了这个课程。第一次听说杰瑞米·霍华德,在维基百科上搜索他,印象深刻。查看了杰里米和雷切尔·托马斯教授的 MOOC 课程。看完了第一课,对他们的教学风格印象深刻。
在几个小时内,你学会了如何在不到几美元的时间内建立一个最先进的图像分类器。
关于古鲁:
杰里米来自一个与通常的教授非常不同的背景,他没有任何顶级大学的博士学位,也没有为任何顶级公司工作,如谷歌,百度,微软,等等。他是一个自学成才的 kaggle master,企业家,目前是 Fast.ai 的 CEO,唯一的目的就是让 深度学习再次不酷。他的独特性为这门课程增添了巨大的优势,因为他教授不同背景的人如何在没有大量数据或计算能力的情况下使用深度学习。
关于课程:
课程分为两部分,每部分 7 周。课程的第一部分教授如何在计算机视觉和自然语言处理(NLP)领域使用深度学习。第二部分教授前沿研究工作,如生成网络、GANs、序列序列模型、如何阅读研究论文,以及许多关于如何在高速发展的深度学习领域保持领先的实用技巧。
这门课程以独特的方式教授。该课程的作者相信一种独特的方法。
你不会在阅读了速度、动量、分析等知识后学习打板球(或任何游戏),然后在 18 岁就去球场。相反,我们去球场,拿着球或球棒,然后在飞行中学习其余的。
通过这种独特的方法,您可以开始学习在云上设置工作站,安装软件,并使用深度学习快速构建解决方案。每周杰里米都会挑选一个新问题,然后他会教授一些技巧来提高模型的性能。他教授一些实用的东西,比如使用预卷积特征、伪标注和许多非常有用的技巧。在第一部分结束时,你将能够使用深度学习在你工作的领域中构建有用的应用程序。
课程的第二部分通过帮助你阅读、理解和实现生成模型、图像分割和序列 2 序列模型领域的各种研究论文,介绍前沿研究。您将学习构建有趣的项目,如样式转换、低分辨率图像到高分辨率图像、GAN、图像分割、语言翻译,以及如何对结构化数据应用 DL。第 2 部分最重要的部分是建立自己的工作站。如果你对深度学习充满热情,并希望构建各种 DL 应用程序,这被证明是非常有用的。
亮点:
- 能够在视觉和自然语言处理方面建立先进的系统。
- 理解并使用支持大量深度学习应用的现代架构。
- 当你的数据和计算能力有限时,如何快速应用 DL 的大量实用技巧。
- 一个庞大的社区,在您学习和实施解决方案的不同阶段为您提供支持。
- 能够熟练使用 3 种流行的 DL 框架,即 Keras、TensorFlow 和 PyTorch。
- 在课程结束时,你将能够自如地阅读研究论文、构建新项目、写博客,以及整个社区对你的支持。
局限性:
- 由于本课程遵循自上而下的方法,你将严重依赖框架来抽象底层数学。如果你打算找工作或者在这个领域做更多的研究,理解驱动 DL 的数学是有帮助的。
- 一些机构可能重视证书作为课程完成的证明,但我猜杰里米认为我们是成熟的孩子,不提供任何形式的证书。代替传统的证书,杰里米和雷切尔鼓励写博客,建立项目,并在会议上发言。我个人认为这非常有用。
成本:
MOOC 没有相关费用。但是为了实践这些项目,你将最终花费在 AWS 上,或者你可能设置你自己的机器,这将是昂贵的。但是家里有一个功能强大的工作站非常有帮助。
Deeplearning.ai:
我最近在吴恩达发微博的时候偶然看到了这个课程。我从 2014 年初开始跟踪他,我从他在 Coursera 上的一门课程中学习机器学习背后的数学。来自工程背景的他发现他的第一门课非常有趣,同时有点难以完成。快进到 2017 年,吴恩达离开了他作为首席科学家工作的百度,并于 8 月 8 日启动了新的深度学习专业化。我想在今年晚些时候做这件事,因为我已经忙于其他一些项目。然后我读了一篇来自 Fast.ai Arvind N 的学生的博客关于他如何在 4 天内完成所有 3 个部分以及他对 Fast.ai 和 deeplearning.ai 的看法
我想挑战自己,如果我能在不到 4 天的时间内完成同样的课程,是的,我在 3 天内完成了 3 门课程。
关于上师:
吴恩达是斯坦福大学的教授,共同创立了 Coursera,创立并领导了谷歌大脑深度学习项目,并且是百度的首席科学家。这门课程反映了他从大规模解决各种问题中学到的很多东西。
该课程帮助您理解深度学习所需的数学,到课程 2 结束时,您将从零开始构建深度学习算法的几个关键组件。
关于课程:
本课程分为 5 个部分。在撰写本报告时,前三个版本已经发布。吴恩达对这门课程采取自下而上的方法。在他之前的课程中,他选择 octave 作为编程作业,但他选择 python 作为这门课程的作业。
- 在课程 1 中,他仔细讲述了深度学习中许多概念所需的数学和直觉。他小心翼翼地平衡课程内容,只教授数学,这是理解深度学习的基础。作业课对于以程序化的方式练习数学非常有用。所有的公式都提供了,所以你可以专注于实现它们,即使你没有太多的数学专业知识。
- 课程 2 涵盖了许多技术,如正则化、动量、批量归一化和剔除,以提高你的 DL 模型的性能。本课程最精彩的部分是你使用 python 和 NumPy 实现所有的技术。
- 在课程 3 中,他解释了许多他从多年经验中学到的技巧和诀窍。在第 3 门课程的最后,他介绍了 DL 框架。课程 3 以如何使用张量流的作业结束。这个作业被设计得非常直观。
- 课程 4 将在 CNN 播出。一旦课程发布,将更新此部分。
- 课程 5 将是关于 RNN 或序列数据。一旦课程发布,我将更新这一部分。
亮点:
- 当你完成 3 门课程时,你的基础将会非常扎实。
- 首先,3 门课程采用独立于框架的方法,这将使你准备好轻松使用任何框架。
- 关于如何设计评估指标、如何为训练拆分数据集以及避免方差和偏差问题的大量实用技巧。
- 课程 3 最精彩的部分是一个案例研究,在这里你有机会验证你对如何成功执行深度学习项目的理解。
- 不需要担心基础设施,因为所有的作业都以 jupyter 笔记本的形式在 Coursera 服务器上运行。
- 在令人惊叹的 3 门课程后,等待接下来的 2 个部分。
- 每周都有一个以“深度学习英雄”命名的演讲。这是了解深度学习背后的历史和灵感的一个很好的来源。
局限性:
- 对于完全不熟悉深度学习或机器学习的人来说,从头开始构建每个组件并理解其背后的数学原理可能是一项挑战。
- 因为它遵循自下而上的方法,所以即使在第三个课程结束后,你也会发现很难在你的领域中使用 DL 构建解决方案。
- 由于提供了基础设施,您将错过如何自己管理工作站的学习。如果你想使用你学到的很多技术,能够在云上或者在家里/办公室设置你的机器是非常重要的。
- 提供了许多样板代码来简化任务。但是要真正掌握一项技能,不使用样板代码重新实现整个任务是必不可少的。这可能不是课程的限制,但如果你想充分利用它,这真的很重要。
成本:
所有的课程内容都是免费的。然而,我不确定这些作业是否也是免费的。如果你使用付费版本,那么你每个月大约要花费 3800 卢比或者 55 美元。
Udacity 的 Siraj Raval 深度学习纳米学位基金会:
我是 Udacity 的超级粉丝。他们有非常棒的课程,涉及广泛的主题。因此,当我今年早些时候读到他们关于深度学习课程的公告时,我非常兴奋,并注册了第一批。
关于古鲁的:
课程的一些部分包括来自 Siraj Raval 的视频,其余部分来自 Udacity。我是从他在 youtube 上的一些有趣的视频中知道 Siraj Raval 的。他是一个多技能的人,通过将教育视频与音乐和视频混合在一起,以有趣的格式巧妙地传递教育视频。课程的某些部分也由安德鲁·W·特拉斯克和伊恩·古德费勒教授。
关于课程:
与其他两门课程不同,这门课程没有明确的自下而上或自上而下的方法。该课程分为 5 个部分,并给予 100 美元的亚马逊学分。它涵盖了许多深度学习技术,如 CNN、RNN、GAN 和自动编码器。
亮点:
- 在课程的前几周,您将学习如何使用 python 构建神经网络,课程的其余部分将重点介绍 TensorFlow 的使用。
- 课程中提交的所有项目都有个性化的项目评论。
- 在课程结束时,您会对使用 TensorFlow 感到舒适,就像在所有项目中使用 TensorFlow 一样。
- 了不起的社区和论坛导师,他们随时准备帮助你。
局限性:
- 没有关注如何优化运行 DL/获得最先进的性能结果的实用技巧。
- 有些项目太简单,不适合在现实世界中使用。这个项目使用的数据集非常小。
- 样板文件抽象出了构建 DL 应用程序的许多复杂性。但是如果您专注于学习它在现实世界中的应用,建议您自己实现项目,而不要使用样板代码。
成本:
课程费用偏高。没有免费版本。当我参加这个课程时,报价有限,所以花费大约 2500 卢比或 350 美元。
建议:
如果有人今天开始深度学习[自学],我会建议完成 fast.ai,因为它有最低的先决条件,并按顺序或并行继续 Coursera 深度学习专业化。感谢所有为这项技术的普及做出真诚努力的人们。
这个博客还出现在的 KDnuggets 上。
行动呼吁
如果你喜欢这篇文章,只要你认为这篇文章有价值,就按住那个拍手图标。我总是在寻找反馈来改进我的文章。如果你有建议或问题,请随时回复。
关于数据的 3 件事你可能不知道,但需要知道
1977 年,在佛罗里达州博卡拉顿举行的施乐世界大会上,公司的高级管理人员瞥见了未来。展出的是一种新型电脑,Alto T1,它是为一个人设计的,只需要一个键盘和一个叫做“鼠标”的小装置,你可以用一只手操作。
他们没有被打动。机器执行的任务主要是写作和处理文件,换句话说,是秘书工作,这并不能激发他们的兴趣。对于那些以复印多少份来衡量业绩的高管来说,他们看不到这个东西如何赚钱。
当然,时代已经变了,今天很难想象没有电脑的任何行政运作。我们现在正在经历一场类似于 20 世纪 70 年代的变革。今天,每个经理都需要有效地处理数据。问题是,大多数人都像 20 世纪 70 年代的施乐高管一样装备不良。以下是你最需要知道的:
1.数据经常会出现人为错误
出现在电脑屏幕上的数字有一种特殊的权威性。数据通过大规模数据库提取,并通过复杂的分析软件进行分析。最终,它们会进入 Excel 工作簿,在那里它们会被进一步处理成清晰的决策指标。
然而,所有这些数据从何而来?在许多情况下,来自低薪、缺乏培训的一线员工,他们将在剪贴板上记录数据作为日常工作的一部分。如前所述,数据是轶事的复数形式,容易出错。我们可以——也应该——尽可能减少这些错误,但我们可能永远无法完全消除它们。
正如麻省理工学院的泽内普·顿在她的著作 中所解释的,好工作战略 关注零售业,即使是最强大的系统也需要人类的输入和判断。收银员需要用正确的代码记录产品,后台人员需要将物品放在可以找到的地方,货架上需要存放正确的产品。
任何这些地方的错误都可能导致数据错误,并导致有形的问题,如幻影缺货,这可能导致组织高层做出糟糕的决策,如采购和营销。这些看似很小的错误可能会非常普遍。事实上,在的一项研究中发现,65%的零售商库存数据是不准确的。
类似这样的失误也不仅限于低层员工。想想两位哈佛经济学家的案例,他们发表了一篇工作论文,警告美国债务正接近临界水平。他们的工作引起了一场政治风暴,但事实证明,他们犯了一个简单的 Excel 错误,导致他们夸大了债务对 GDP 的影响。
2.你的数字总是错的
我们获取数据的途径总是有限的。我们可能会关注一天、一周甚至一年的销售额,但这只是现实的一小部分。如果我们看一个典型的市场调查,我们看到的几乎总是一个小样本。研究应该受到控制,以使样本具有代表性,但这些方法远非完美。
结果是我们的数字总是错的。有时它们会偏离一点点,有时会偏离很多,但它们永远不会完美地反映当前的现实。这可能是控制被忽略或数据处理不当的结果,或者只是运气不好,但不管是什么原因,我们都不应该只看数据的表面。
近年来,传统统计方法的一个替代方法是贝叶斯分析,它允许我们随着新信息的到来不断更新我们的判断。实际上,贝叶斯方法并不假设我们拥有的数据是正确的,而是允许我们“随着时间的推移减少错误”
实际上,这就是为什么大数据如此重要。今天,数字技术使我们能够连续不断地收集和访问大量信息。新的开放数据标准,如 Hadoop 和 Spark ,也允许我们存储数据并将其与其他来源相结合,以便我们可以重新审视早期的结论并纠正错误。
3.你的逻辑有缺陷
让我们暂时回到零售业。典型零售业务的劳动力成本约为销售额的 15%,因此控制工资是保持盈利的关键。让太多员工留在店里,你的成本会飙升,但留下太少,客户服务会受到影响,导致你失去销售。
所以把人员配备和销售联系起来是很自然的。使用过去的数据,您可以建立一个预测模型,该模型将确定在任何给定的一天每个地点的人员配备需求。商店经理然后可以使用软件来安排销售人员的数量,这将最大限度地提高销售额,同时最大限度地降低工资成本。
但是,当一个不可预见的事件,比如一场大风暴或一场交通事故在某一天减少了销售额,会发生什么呢?最有可能的是,这将导致未来几天人手不足,这将进一步抑制销售,并证实你需要减少商店员工的想法。不久,恶性循环就会出现,员工减少导致销售额下降。
这就是为什么数据科学家建议使用互斥且集体穷尽(MECE) 的数据,以避免这种反馈循环,并通过模型之外的来源不断测试你的结论。例如,在上面的例子中,与商店经理的良好沟通有助于发现和解决问题。
这些类型的错误源于心理学家称之为可用性偏差。我们倾向于根据最可用的信息做出判断,如商店销售额和工资成本,而忽略了不太适合数据模型的其他因素,如恶劣天气和糟糕服务导致的销售损失。
为使命而管理,而不是为指标而管理
显然,数据素养就像基本的计算机技能一样,正成为每位高管的必备技能。此外,越来越多的证据表明,有效利用数据的企业和不有效利用数据的企业之间的鸿沟越来越大。很像 20 世纪 70 年代施乐的那些高管,我们不能因为认为数据分析是别人的工作,就简单地转过头去。
我们也不应该忽视这样一个事实,数据是达到目的的手段,而不是目的本身。我们需要为使命而管理,而不是为指标而管理。企业的目的是服务好顾客、员工和其他利益相关者,而不仅仅是为了记分。这就是为什么我们需要将数据视为发现和评估的工具。
正如Alpine Data的首席产品官 Steve Hillion 告诉我的,“我们需要采取一种更具探索性的方法,更多地考虑如何设计系统来影响业务,而不仅仅是评估运营活动。我们不能再将分析和行动分开,我们需要将数据科学团队与直线经理整合起来。”
数据被称为“新石油”,这是有道理的。就像能源、人才、金融或任何其他资源一样,有效地管理它对于在当今市场中竞争变得至关重要。管理者需要像对待其他重要职能一样认真对待数据分析。
这篇文章的早期版本最早出现在Inc.com
4 个卷积神经网络模型可以对你的时尚图片进行分类
买衣服是一件很累人的事情。我的眼睛被太多的信息轰炸。销售、优惠券、颜色、蹒跚学步的孩子、闪烁的灯光和拥挤的过道只是传递给我的视觉皮层的所有信号的几个例子,不管我是否积极地试图注意。视觉系统吸收大量的信息。我应该选那条 H&M 卡其布裤子吗?那是耐克背心吗?那些阿迪达斯运动鞋是什么颜色?
计算机能自动检测衬衫、裤子、连衣裙和运动鞋的图片吗?事实证明,给定高质量的训练数据,准确地对时尚物品的图像进行分类是非常简单的。在本教程中,我们将通过构建一个机器学习模型来使用时尚-MNIST 数据集识别时尚对象的图像。我们将介绍如何训练模型,设计类别分类的输入和输出,并最终显示每个模型的准确性结果。
图像分类
图像分类的问题是这样的:给定一组图像,所有这些图像都标有一个类别,我们被要求为一组新的测试图像预测这些类别,并测量预测的准确性。存在与该任务相关的各种挑战,包括视点变化、尺度变化、类内变化、图像变形、图像遮挡、照明条件、背景混乱等。
我们该如何着手编写一个算法,将图像分成不同的类别呢?计算机视觉研究人员已经提出了一种数据驱动的方法来解决这个问题。他们不是试图直接在代码中指定每一个感兴趣的图像类别看起来像什么,而是为计算机提供每个图像类别的许多示例,然后开发学习算法,查看这些示例并了解每个类别的视觉外观。换句话说,他们首先积累一个标记图像的训练数据集,然后将其输入计算机,以便它熟悉这些数据。
鉴于这一事实,完整的图像分类管道可以形式化如下:
- 我们的输入是一个由 N 幅图像组成的训练数据集,每幅图像都标有 K 个不同类别中的一个。
- 然后,我们使用这个训练集来训练一个分类器,以学习每个类的样子。
- 最后,我们通过要求分类器预测一组它以前从未见过的新图像的标签来评估分类器的质量。然后,我们将这些图像的真实标签与分类器预测的标签进行比较。
卷积神经网络
**卷积神经网络(CNN)**是用于图像分类问题的最流行的神经网络模型。CNN 背后的大想法是,本地对图像的理解已经足够好了。实际好处是,参数越少,学习时间就越短,训练模型所需的数据量也就越少。CNN 不是一个由每个像素的权重组成的完全连接的网络,它只有足够的权重来查看一小块图像。就像用放大镜看书一样;最终,你读完了整页,但在任何给定的时间里,你只能看到页面的一小部分。
考虑一个 256 x 256 的图像。CNN 可以有效地逐块扫描——比如说,一个 5 × 5 的窗口。5 × 5 窗口沿图像滑动(通常从左到右,从上到下),如下所示。它滑行的“快”称为它的步幅。例如,步长为 2 意味着 5 × 5 滑动窗口一次移动 2 个像素,直到它跨越整个图像。
当窗口滑过整个图像时,卷积是图像像素值的加权和。结果是,整个图像与权重矩阵的卷积过程产生了另一个图像(大小相同,取决于约定)。卷积是应用卷积的过程。
滑动窗口恶作剧发生在神经网络的卷积层。典型的 CNN 有多个卷积层。每个卷积层通常生成许多交替卷积,因此权重矩阵是 5 × 5 × n 的张量,其中 n 是卷积的数量。
举个例子,假设一个图像在 5 × 5 × 64 的权重矩阵上经过一个卷积层。它通过滑动一个 5 × 5 的窗口产生 64 个卷积。因此,该模型有 5 × 5 × 64 (= 1,600)个参数,比全连接网络的 256 × 256 (= 65,536)个参数少得多。
CNN 的妙处在于参数的数量与原始图像的大小无关。你可以在 300 × 300 的图像上运行同样的 CNN,在卷积层中参数的数量不会改变。
数据增强
影像分类研究数据集通常非常大。然而,数据扩充经常被用来提高泛化性能。通常,使用随机裁剪重新缩放的图像以及随机水平裁剪和随机 RGB 颜色和亮度偏移。存在不同的重新缩放和裁剪图像的方案(即单尺度对多尺度训练)。测试期间的多作物评估也经常使用,尽管计算成本更高且性能改善有限。请注意,随机缩放和裁剪的目标是了解每个对象在不同比例和位置下的重要特征。Keras 没有实现所有这些现成的数据扩充技术,但是它们可以通过 ImageDataGenerator 模块的预处理功能轻松实现。
时尚 MNIST 数据集
最近,Zalando research 发布了一个新的数据集,它与众所周知的 MNIST 手写数字数据库非常相似。该数据集是为机器学习分类任务而设计的,总共包含 60 000 个训练图像和 10 000 个测试图像(灰度),每个图像为 28×28 像素。每个训练和测试案例都与十个标签(0–9)中的一个相关联。到目前为止,Zalando 的数据集基本上与原始手写数字数据相同。然而,Zalando 的数据包含了 10 种不同时尚产品的图像,而不是数字 0-9 的图像。因此,该数据集被称为时尚-MNIST 数据集,可以从 GitHub 下载。这些数据也出现在 Kaggle 上。下图显示了几个示例,其中每行包含一个时尚项目。
10 种不同的分类标签是:
- 0 T 恤/上衣
- 1 条裤子
- 2 件套头衫
- 3 连衣裙
- 4 件外套
- 5 凉鞋
- 6 衬衫
- 7 运动鞋
- 8 袋
- 9 踝靴
根据作者的说法,时尚-MNIST 数据旨在直接取代旧的 MNIST 手写数字数据,因为手写数字存在几个问题。例如,只需看几个像素就可以正确区分几个数字。即使使用线性分类器,也有可能实现高分类精度。时尚 MNIST 的数据有望更加多样化,因此机器学习(ML)算法必须学习更高级的特征,以便能够可靠地区分各个类别。
嵌入时尚 MNIST 可视化
嵌入是映射离散对象(图像、文字等)的一种方式。)到高维向量。这些向量中的各个维度通常没有内在含义。相反,机器学习利用的是向量之间的位置和距离的整体模式。因此,嵌入对于机器学习的输入是重要的;因为更一般地,分类器和神经网络对实数的向量起作用。它们在密集向量上训练得最好,其中所有值都有助于定义一个对象。
TensorBoard 有一个内置的可视化工具,称为 嵌入投影仪 ,用于交互式可视化和分析嵌入之类的高维数据。嵌入投影仪将从我的模型检查点文件中读取嵌入内容。虽然它对嵌入最有用,但它可以加载任何 2D 张量,包括我的训练权重。
在这里,我将尝试使用 TensorBoard 来表示高维时尚 MNIST 数据。在读取数据并创建测试标签之后,我使用这段代码来构建 TensorBoard 的嵌入式投影仪:
嵌入式投影仪有三种降低数据集维数的方法:两种线性方法和一种非线性方法。每种方法都可以用来创建二维或三维视图。
**主成分分析:**一种直接的降维技术是主成分分析(PCA)。嵌入投影仪计算前 10 个主成分。这个菜单让我可以将这些组件投射到两个或三个组件的任意组合上。PCA 是一种线性投影,通常在检查全局几何时很有效。
t-SNE:t-SNE 是一种流行的非线性降维技术。嵌入式投影仪提供二维和三维 t-SNE 视图。布局是在客户端执行的,为算法的每一步制作动画。因为 t-SNE 经常保留一些局部结构,所以它对于探索局部邻域和寻找聚类很有用。
我还可以基于文本搜索构建专门的线性投影,以便在空间中找到有意义的方向。要定义投影轴,请输入两个搜索字符串或正则表达式。该程序计算标签与这些搜索匹配的点集的质心,并使用质心之间的差向量作为投影轴。
你可以在这个笔记本上查看可视化步骤的完整代码:tensor board-visualization . ipynb
在时尚 MNIST 培训 CNN 模特
现在让我们进入有趣的部分:我将创建各种不同的基于 CNN 的分类模型来评估时尚 MNIST 上的表演。我将使用 Keras 框架构建我们的模型。关于这个框架的更多信息,你可以在这里参考文档。以下是我将尝试并比较其结果的模型列表:
- 具有 1 个卷积层的 CNN
- 具有 3 个卷积层的 CNN
- 具有 4 个卷积层的 CNN
- VGG-19 预训练模型
对于所有模型(除了预先训练的模型),我的方法如下:
- 将原始训练数据(6 万张图像)拆分成 80%训练(4.8 万张图像)和 20%验证 (12000 张图像)优化分类器,同时保留测试数据(1 万张图像)最终评估模型在它从未见过的数据上的准确性。这有助于查看我是否过度拟合训练数据,以及如果验证准确度高于训练准确度,我是否应该降低学习率并训练更多的时期,或者如果训练准确度高于验证,我是否应该停止过度训练。
- 用分类 _ 交叉熵损失函数和 Adam 优化器编译,训练 10 个时期的模型,批量为 256。
- 然后,添加数据扩充,通过对训练样本进行旋转、移位、缩放生成新的训练样本,再用更新后的数据训练模型 50 个历元。
下面是加载和分割数据的代码:
在加载和分割数据之后,我对它们进行预处理,将它们重新整形为网络期望的形状,并对它们进行缩放,以使所有值都在[0,1]区间内。例如,以前,训练数据存储在 uint8 类型的 shape (60000,28,28)数组中,其值在[0,255]区间内。我将它转换成一个形状为(60000,28 * 28)的 float32 数组,其值介于 0 和 1 之间。
1—1——conv 有线电视新闻网
下面是 CNN 的代码,带有一个卷积层:
训练完模型后,下面是测试损耗和测试精度:
应用数据扩充后,以下是测试损失和测试准确性:
出于视觉目的,我绘制了训练和验证准确性和损失:
你可以在这个笔记本上查看这个模型的完整代码: CNN-1Conv.ipynb
2 — 3 日——conv 有线电视新闻网
以下是 CNN 的代码,具有 3 个卷积层:
训练完模型后,下面是测试损耗和测试精度:
应用数据扩充后,以下是测试损失和测试准确性:
出于视觉目的,我绘制了训练和验证准确性和损失:
你可以在这个笔记本上查看这个模型的完整代码: CNN-3Conv.ipynb
3-4-conv CNN
以下是具有 4 个卷积层的 CNN 的代码:
训练完模型后,下面是测试损耗和测试精度:
应用数据扩充后,以下是测试损失和测试准确性:
出于视觉目的,我绘制了训练和验证准确性和损失:
你可以在这个笔记本上查看这个模型的完整代码: CNN-4Conv.ipynb
4 —迁移学习
对小图像数据集进行深度学习的一种常见且高效的方法是使用预训练的网络。预训练网络是之前在大型数据集上训练过的保存的网络,通常是在大规模图像分类任务上。如果这个原始数据集足够大并且足够通用,那么由预训练网络学习的特征的空间层次可以有效地充当视觉世界的通用模型,因此它的特征可以证明对于许多不同的计算机视觉问题是有用的,即使这些新问题可能涉及与原始任务完全不同的类。
我试图实现 VGG19 预训练模型,这是一个广泛用于 ImageNet 的 ConvNets 架构。以下是您可以遵循的代码:
训练完模型后,下面是测试损耗和测试精度:
出于视觉目的,我绘制了训练和验证准确性和损失:
你可以在这个笔记本上查看这个型号的完整代码: VGG19-GPU.ipynb
最后一次外卖
时尚领域是机器学习和计算机视觉应用的一个非常受欢迎的领域。由于所涉及的特征的高度主观性和语义复杂性,该领域中的问题具有挑战性。我希望这篇文章有助于你了解 4 种不同的方法来构建你自己的卷积神经网络来对时尚图像进行分类。你可以在这个链接查看我的 GitHub repo 中的所有源代码。如果您有任何问题或改进建议,请告诉我!
— —
如果你喜欢这首曲子,我希望你能按下鼓掌按钮👏这样别人可能会偶然发现它。你可以在 GitHub 上找到我自己的代码,在【https://jameskle.com/】上找到更多我的写作和项目。也可以在 推特 , 上关注我直接发邮件给我 或者 在 LinkedIn 上找我。 注册我的简讯 就在你的收件箱里接收我关于数据科学、机器学习和人工智能的最新想法吧!
不被聘为数据科学家的 4 个最快方法
避免这些常见的错误不会让你被录用。但是不回避它们会让你的申请成为一张被拒绝的单程票。
我看过很多在sharpes minds工作的数据科学简历。
因为这个平台是一个巨大的反馈机器,我们不断收到公司的回复——不仅询问他们是否想面试或雇佣候选人,还询问为什么选择面试或雇佣他们已经面试或雇佣的人。
对数百家公司决策过程的了解,让我们对好的简历有了更多的了解,同样重要的是,也让我们知道了它们不像什么。
每个公司都在寻找不同的东西。让你被谷歌聘用的方法在其他公司可能有效,也可能无效(而且甚至可能毫无意义)。因此,构建“完美的”通用数据科学简历几乎是不可能的。
话虽如此,但有一些我们已经看到的明显错误,足以保证你的申请不会被考虑:
1.在简历中突出琐碎的项目
很难想出一个比在你突出的个人项目中突出你在琐碎的概念证明数据集上所做的工作更快的方式来将你的简历扔进“肯定没有”的一堆。
当你有疑问时,这里有一些对你伤害大于帮助的项目:
为什么会伤害你
简历上的空间是有限的。应聘者知道,招聘人员也知道。因此,如果像 MNIST 这样的“训练轮数据集”占据了一些宝贵的空间,这可能会让招聘人员产生疑问,你在数据科学之旅中究竟能走多远。
对此该怎么办
如果你的简历中有这类项目——如果你没有其他更具挑战性和实质性的项目来替代它们——这是一个强烈的迹象,表明你需要花一些时间来建立你的投资组合。
当然,如果你有其他更有趣的项目要展示,那么你肯定会想把它们换过来。
例外
使用经过充分研究的数据集,如 MNIST 或泰坦尼克号数据集,完全有可能构建复杂的项目。如果你在玩你发明的一种新的 GAN,或者你正在复制一个有趣的胶囊网络论文,那就去做吧。
但是请记住,大多数招聘人员都是非技术性的,而且他们通常只是通过寻找关键词来工作,所以你必须非常清楚,你的 MNIST 项目不仅仅涉及琐碎的数字分类任务。
2.在你的投资组合中列出 Udacity 或 Coursera 项目
像 Udacity、Coursera 和 deeplearning.ai 这样的大规模在线开放课程(MOOCs)是深入学习和数据科学的绝佳方式。话虽如此,许多公司对应聘者持怀疑态度,如果这就是他们必须展示给自己的全部的话。
一些需要避免的事情:
- 拥有一个投资组合,其中大部分是你作为纳米学位/项目的一部分已经完成的项目。
- 把你的 MOOC 放在太突出的位置,或者作为你简历上第一个与数据科学相关的部分。
为什么会伤害你
招聘过程中有相当多的自我意识。公司希望能够说,他们只雇用“非常特殊的人”,或“前 1%的申请人”,等等。因为现在很多人都有 MOOC 证书,很容易被定型为又一个 Udacity 毕业生,这让你的听起来没那么特别。
招聘人员现在对许多 MOOC 非常熟悉,可以立即识别出属于标准纳米学位或 MOOC 的项目(例如,Udacity 的交通标志分类任务,这一任务不简单,甚至有点有趣,在大量简历中出现)。为了让自己听起来与众不同,你需要关注那些没有被深入研究的问题。
-
- *这里我要明确一点: Udacity,Coursera,deeplearning.ai 都是很牛逼的程序。它们也与可雇佣性和技术能力合理相关(根据我们自己的数据)。但是,将他们放在你宣传的数据科学经验清单的顶端(几乎没有其他项目/经验),会给那些正在寻找“真正特别的人”的招聘人员发出危险信号。
对此该怎么办
一旦你完成了你的课程或纳米学位,你会想自己闯一闯,参加 Kaggle 竞赛,或者在数据科学文献中复制有趣论文的结果。
这很重要,因为它:1)让你看起来更独特,2)让你在面试中展示和讨论最前沿的工作,3)表明你有能力自我指导(并且不受支持!)学习。
例外
这条规则的一个例外是你可能已经完成的作为 MOOC 一部分的顶点项目,只要它们是独一无二的。所谓独特,我的意思是你可以自由选择你想要的数据集,并且很大程度上可以自己解决问题。因为这实际上和你自己去做兼职项目没什么不同,所以伤害你的可能性更小。
3.缺乏版本控制/开发运维/数据库技能
不包括表明你知道如何制作数据科学香肠的技能可能是致命的。
以下是一些必备的:
- 版本控制(例如 GitHub/GitLab)
- Devops(例如自动气象站/Floydhub/数字海洋/烧瓶)
- 数据库(如 mySQL/mongoDB)
为什么会伤害你
让人们对数据科学感到兴奋的往往是算法。想到可以解决您的问题的神经网络或增强树架构是很有趣的。
因此,这是大多数人投入时间的地方。问题是设计模型和生产级深度学习或者数据科学不是一回事。
作为一名数据科学家,数据科学中不那么有趣的部分(设置服务器、清理数据)几乎肯定会占据你日常工作的大部分时间,而现实是,仅仅擅长 Python/sk learn/tensor flow/Keras/py torch 已经不够了。
不包括这些基本技能也是被寻找关键词的招聘人员忽略的一个好方法,他们更感兴趣的是找到一个说“不”的理由,而不是一个说“也许”的理由。
没有 GitHub?没有蒙哥?不用了,谢谢。
对此该怎么办
如果你有技能,但没有在简历中列出来,那就列出来。如果你没有任何版本控制、devops 和数据库工具的经验,你需要一些。不仅仅是因为它在简历上看起来不错,而是因为它是你作为数据科学家的必备技能之一。
例外
如果你申请更高级的职位,列出这些技能可能不那么重要,因为在这些职位上,你对数据科学工具的经验是必不可少的。
4.没有从你建立的项目中学到任何东西
在你的简历中包括一个项目,如果你面试的话,很有可能会被问到这个问题。
如果面试官问你在某个项目中学到了什么,“没什么,真的”不是正确的答案。
为什么会伤害你
因为你已经花时间做了一个项目,与你从项目中学到的东西相关的问题会告诉面试官很多关于你有多喜欢深入思考你的问题,以及你的沟通技巧。
即使是一个相当简单的数据集也不太可能没有东西可以教你,所以不明智地离开一个项目可能会引发严重的危险信号。
对此该怎么办
如果你的简历上列出了一个项目,并且你获得了一家公司的面试机会,准备好一些见解,这些见解可能会让那些没有使用过你在那个项目中处理过的数据集的人感到惊讶。
例外
没有,真的。如果你在简历中包括一个项目,你真的应该从创建项目中学到东西。
奖金:错别字
好吧,这不是特定于数据科学的,但我们发现错别字与面试表现有如此大的关联,这着实让我们震惊。一直以来,简历中有错别字的人——无论是拼写错误,还是格式潦草——比简历中没有错别字的人表现更差。
错别字是完全非受迫性错误的一个很好的例子,不管你的经验水平如何,你都不应该犯这种错误。而且客观上导致申请->面试转换率较低。
为什么会伤害你
不出所料,对简历细节的关注与对项目细节和技术开发的关注是相关的,而且被认为是相关的。
对此该怎么办
让一个 a)以英语为母语,b)注重细节的朋友审阅你的简历。如果你不得不这样做,向他们承诺,如果你被录用,给他们 50 美元,只是为了激励他们抓住任何不合适的小细节。
例外
他们应该没有例外。
你在学校或网络公开课上学不到的 4 种机器学习技能
想获得灵感?快来加入我的 超级行情快讯 。😎
机器学习(ML)在过去几年里变得非常流行。为什么……很简单,因为它有效!最新的研究取得了破纪录的成果,甚至在一些任务上超过了人类的表现。当然,结果是许多人争先恐后地进入这个领域;为什么不呢。它资金充足,技术令人兴奋和有趣,并且有很大的增长空间。
就正规教育而言,学习机器学习有两条主要途径:学校(大学/学院)或 MOOCs(大规模开放在线课程)。正式的学校教育,比如获得硕士或博士学位,可以给你非常深入的技术和理论知识,但这也相当昂贵。MOOCs 是免费的,你肯定可以从中学习如何实际使用许多 ML 算法,尽管你不会获得通常从大学/学院获得的官方证书。然而,这两者都可以有效地用于获得在机器学习领域工作所需的技术知识。
但是…还是少了点什么。归根结底,机器学习算法正被应用于现实世界的商业问题。机器学习简单来说就是作为一个为客户创造价值的工具。这与课堂上不同,在课堂上,作业通常是单独完成的,几乎没有商业目标。重要的不仅是 ML 模型的准确性,还有它的可解释性、速度、内存消耗,以及在一天结束时,该模型如何适应产品以创造真正的价值。
今天,我将与你分享 4 种你在学校或 MOOCs 中学不到的机器学习技巧。这些都是可以通过现实世界的经验来学习的技能,使用 ML 来解决现实世界的问题并创造真正的价值。希望这篇文章能让你深入了解机器学习是如何实际应用的,以及你可以学习哪些技能来成为你所在领域的专家。
让我们开始吧!
将机器学习与商业目标联系起来
当你在任何涉及软件的领域工作时,包括机器学习,实际上有两个主要的理解方面:技术观点和商业观点。这两方面的知识是成为你所在领域专家的关键。
你在课堂上学到了很多技术部分。如何用 Python 编码,机器学习和数据科学算法,技术报告写作等。在课堂上,这些东西与商业是隔绝的。但是当你开始在这个领域实际工作时,你工作的每一个技术方面都与一个商业目标相关联。为什么你的老板像你一样要增加当前系统的准确性?很可能是因为更好的准确性意味着更多的价值,更多的价值意味着更好的产品,而更好的产品意味着更多的客户和金钱!
能够将这些点联系起来是很重要的,这样你就可以找到解决技术问题的最佳方法。你会知道什么是重要的部分,从而知道你应该关注什么。随着你在你的领域中资历的增加,你可能会被期望将业务目标转化为技术目标,以找到完成工作的最佳方式。技术过去是,现在仍然是用来完成更伟大事业的工具。始终考虑你的技术技能如何与商业目标相联系,以创造真正的价值。
型号选择
在课堂上,您将了解不同的 ML 模型。线性回归、支持向量机、决策树、神经网络……感觉有一百万个!所以最大的问题是…你用哪一个?你可能以前使用过所有这些算法,从头开始编写它们或者使用像 TensorFlow 和 Scikit Learn 这样的库。但是为什么要选择一个而不是另一个呢?现在很多人都在使用深度学习,那么我们应该默认它吗?
所有的方法都会有权衡,这就是科学和工程的本质!为了定义模型最重要的属性,将这些权衡与您的业务目标联系起来是很重要的。
一般来说,机器学习有一个被称为“没有免费的午餐”的定理,基本上是说没有一个 ML 算法对所有问题都是最好的。不同 ML 算法的性能很大程度上取决于数据的大小和结构。因此,除非我们通过简单的反复试验直接测试我们的算法,否则正确的算法选择是不清楚的。
但是,每个 ML 算法都有一些优点和缺点,我们可以用它们作为指导。虽然一种算法并不总是比另一种算法更好,但是每种算法都有一些特性,我们可以用它们来指导快速选择最佳算法并调整超参数。我也为写了一篇关于数据科学的文章。例如,神经网络(和深度学习)通常可以达到非常高的精确度,但根本不太容易解释。当你需要确切地知道你的结果来自哪里时,使用它们可能不是一个非常好的主意;但是如果你只关心最终的输出,它们是完美的!另一方面,决策树非常容易理解,因为它们的设计非常直观。它们可能达不到深度网络所能达到的精确度,但是当你想要确切地了解你的结果来自哪里时,它们是非常有用的。
模型部署
机器学习教育倾向于深入到 ML 算法本身,教你它们在技术层面上如何工作。一旦您的模型完全定型,通常的做法是在一个公开的、不可见的测试数据集上测试它,以对模型性能进行基准测试。一旦我们验证了我们的模型能够很好地完成我们的任务,就必须将它部署到您为其创建模型的完整软件产品中。
从高层次来看,部署本质上涉及到将您的算法“插入”到系统的其余部分。你的模型的作用仅仅是接受一个输入,并使用它来做出某种对系统有用的预测。因此,从一个更高的层面,从系统的层面来理解你的软件是很重要的。
到目前为止,我们已经讨论了如何在学校学习非常低级的技术知识,而业务目标是定义产品价值交付的非常高级的目标。将您的软件理解为部署您的模型的连接组件的系统正好位于中间。你必须了解你的系统的架构,连接块的管道。然后,您可以将您的模型视为插入到系统中的另一个组件、块或模块。
让你的钱得到最大的回报
当我们在学校或参加在线课程时,我们有大把的时间去做实验。我们可以永远做研究,尝试使用最新最棒的算法,甚至尝试所有的算法来找到最好的!在现实世界中,这可能不是最有效的做事方式。
企业的时间和资源是有限的。他们不能整天尝试每一种可能的方法,看哪一种是最好的。他们需要找到高效做事的最佳方式(阅读:不浪费时间和金钱)。
你需要从物有所值的角度来看待事情。因此,也许有一种新的最先进的回归算法,但它在技术上很有挑战性,实施起来可能很耗时。与其花费如此多的时间和金钱来尝试使用它,你可能会得到更多的回报,只需为你当前的算法获取更多的数据来进行训练,或者使用最佳实践“技巧”来提高你的准确性几个点。你的算法的某些方面可能会增加大量的价值,而其他方面则不会。也许你的算法比现在更精确并不重要,但是如果它非常快,产品会有更多的价值!
在课堂上,我们很容易忽略这些事情,并且总是以某个方面的最佳表现模式为目标,忘记了我们选择的所有路径都有其权衡。关键是找出哪些权衡是值得的,哪些给你最好的回报。而且,你通常会注意到,最重要的事情与业务目标相关联。
机器学习和所有软件一般来说只是一套工具;在这种情况下,获得最大收益意味着知道如何最好地使用这些工具来完成工作。
喜欢学习?
在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!
机器学习项目成功的 4 个技巧
如果你是产品经理并且想用机器学习来做点什么,这里有 4 件最重要的事情要记住:
1.将工程置于数据科学之上
机器学习项目首先是一个软件项目。许多数据科学家几乎没有构建架构良好、可靠且易于部署的软件的经验。当你建立一个生产系统时,这将成为一个问题。
根据经验,**工程师获得数据科学技能的速度比数据科学家获得工程经验的速度要快。**如果有疑问,与拥有 5 年以上经验和对人工智能充满热情的 python 工程师合作,而不是与首次尝试构建业务应用程序的数据科学博士合作。
2.变瘦
尽早降低风险很重要。用具体的里程碑构建您的项目:
- 完成原型:了解你的想法是否有希望 1 天— 2 周
- 离线测试系统:调优模型并在现有数据上严格测试2-4 周
- 在线测试系统:完成模型并现场测试2-4 周
- **上线:**自动化数据更新、模型培训和代码部署:2–4 周
- ****持续改进:(可选)12 个月
总时间表:1-3 个月
一个有经验的团队应该能够为几乎任何项目遵循这些时间表。让团队专注于在 1-3 个月内建立一个实时系统。在它上线后,再决定进一步的改进是否值得。
这些诱惑会不必要地延长你的项目:
- 等待完美的数据
- 使用错误的工具(太复杂或太慢)
- 过度设计可扩展性
- 无休止地玩弄算法(见下一点)
3.算法不重要
机器学习系统有很多有趣的旋钮可以玩。不要。
值得花时间去做的改进(按重要性排序):
- 获取更多(相关)输入数据
- 以更好的方式预处理数据
- 选择正确的算法并正确调整。
算法是最不重要的因素。简单地选择一个有效的算法。无休止地升级算法很诱人,但很可能不会给你预期的结果。
4.交流,交流,交流
尽可能多地分享业务背景:
一旦工程团队开始构建,他们必须做出许多选择。他们越了解你的优先事项,就越能做出正确的决定。你至少应该告诉他们:
- 战略重点
这是修复一个关键问题吗?它需要每天处理数百万个请求吗?或者是对未来产品的研究?
- 当前流程的问题
目前的流程是否耗时过长?是不是太不准确了?还是说有很多数据没有机器学习根本无法考虑进去?
- 输入和输出
输入:你(作为一个人)会使用什么数据来做出正确的决定?
产出:谁将消费产出?多久一次?需要实时吗?
- 性能指标
最重要的指标是什么:点击率?销售?ROI?假阳性率?
- 预期精度
如果你想优化转换率,那就不值得再花 2 周的时间来提高 2%的准确率。
如果你建立医疗诊断系统,那么即使是 1%的假阴性也是不可接受的。
TL;速度三角形定位法(dead reckoning)
- 将工程置于数据科学之上。
- 通过精益降低风险。
- 不要被算法分心。
- 与您的开发人员共享所有业务需求。
想了解更多? 我们是, 数据收入 ,一个来自德国柏林的机器学习工程师团队。我们为一些最大的网络、电视和生物信息学公司构建定制的机器学习系统。
直接给我写信:m . Schmitt[at]data revenue . de
进一步阅读
4 个推荐引擎可以预测你的电影口味
“A person holding a clapper board in a desert” by Jakob Owens on Unsplash
今晚我应该看什么电影?
当你下班回家的时候,你曾经不得不回答这个问题至少一次吗?至于我——是的,而且不止一次。从网飞到 Hulu,鉴于现代消费者对个性化内容的巨大需求,建立强大的电影推荐系统的需求极其重要。
推荐系统的一个例子是这样的:
- 用户 A 看权力的游戏和绝命毒师。
- 用户 B 在上搜索《权力的游戏,然后系统从收集的关于用户 a 的数据中建议绝命毒师。
推荐系统不仅用于电影,还用于其他多种产品和服务,如亚马逊(书籍、商品)、Pandora/Spotify(音乐)、谷歌(新闻、搜索)、YouTube(视频)等。
Netflix Recommendations
在这篇文章中,我将向你展示如何实现 4 种不同的电影推荐方法,并对它们进行评估,看看哪一种具有最好的性能。
电影镜头数据集
我正在使用的数据集是 MovieLens ,这是互联网上最常见的数据集之一,可用于构建推荐系统。我正在使用的数据集版本( 1M )包含了 2000 年加入 MovieLens 的 6040 名 MovieLens 用户制作的约 3900 部电影的 1000209 个匿名评级。
在处理数据并进行一些探索性分析后,以下是该数据集最有趣的特性:
这是电影片名的文字云可视化:
MovieLens Titles
很美,不是吗?我可以识别出这个数据集中有很多电影特许经营权,例如 II 和 III …除此之外,还有日、爱、生、时、夜、男、死、美等
下面是用户评分的分布:
MovieLens Ratings
看起来用户对他们的评价很慷慨。在 5 分制中,平均得分为 3.58 分。一半的电影有 4 级和 5 级。我个人认为,5 级评级技能不是一个好的指标,因为人们可能有不同的评级风格(即,人 A 对一般电影总是使用 4,而人 B 对他们最喜欢的电影只给出 4)。每个用户至少评价了 20 部电影,所以我怀疑这种分布可能只是由电影质量的偶然差异造成的。
这里还有另外一个词——电影类型的云:
MovieLens Genres
排名前五的类型依次是:戏剧、喜剧、动作片、惊悚片和爱情片。
现在让我们继续探索可以使用的 4 个推荐系统。以下是他们,按照各自的展示顺序:
- 基于内容的过滤
- 基于记忆的协同过滤
- 基于模型的协同过滤
- 深度学习/神经网络
1-基于内容
基于内容的推荐器依赖于被推荐项目的相似性。基本思想是,如果你喜欢一个项目,那么你也会喜欢一个“相似”的项目。当很容易确定每个项目的上下文/属性时,它通常工作得很好。
基于内容的推荐器与用户提供的数据一起工作,该数据或者是针对电影镜头数据集的明确的电影评级。基于该数据,生成用户简档,然后使用该简档向用户提出建议。随着用户提供更多的输入或对推荐采取行动,引擎变得越来越准确。
数学
术语频率(TF) 和逆文档频率(IDF) 的概念用于信息检索系统以及基于内容的过滤机制(例如基于内容的推荐器)。它们用于确定文档/文章/新闻/电影等的相对重要性。
TF 就是一个单词在文档中出现的频率。IDF 是文档在整个语料库中出现频率的倒数。使用 TF-IDF 主要有两个原因:假设我们在谷歌上搜索“最新欧洲足球赛的结果。可以肯定的是""将比"足球比赛"出现得更频繁,但是足球比赛的相对重要性高于搜索查询角度。在这种情况下,TF-IDF 加权在确定项目(文档)的重要性时否定了高频词的影响。
下面是计算 TF-IDF 分数的公式:
TF-IDF Equation
在计算 TF-IDF 分数之后,我们如何确定哪些项目彼此更接近,而不是更接近用户简档?这是使用向量空间模型完成的,该模型根据向量之间的角度计算接近度。在该模型中,每个项目作为其属性的向量(也是向量)存储在一个 n 维空间中,并且向量之间的角度被计算以确定向量之间的相似性。接下来,也基于用户对项目的先前属性的动作来创建用户简档向量,并且也以类似的方式来确定项目和用户之间的相似性。****
Vector Space Model
句子 2 更可能使用术语 2,而不是术语 1。对于句子 1 反之亦然。计算这种相对度量的方法是通过取句子和术语之间角度的余弦来计算的。使用余弦的最终原因是余弦的值将随着角度值的减小而增加,这意味着更相似。向量被长度归一化,之后它们变成长度为 1 的向量,然后余弦计算简单地是向量的和积。
代码
有了这些数学知识,我将构建一个基于内容的推荐引擎,根据电影类型计算电影之间的相似性。它会根据电影的类型推荐与特定电影最相似的电影。
我没有一个量化指标来判断机器的性能,所以这将不得不做定性。为了做到这一点,我将使用来自 scikit-learn 的 TfidfVectorizer 函数,它将文本转换为可用作估计器输入的特征向量。
**from** **sklearn.feature_extraction.text** **import** TfidfVectorizer
tf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(movies['genres'])
我将使用 余弦相似度 来计算表示两部电影相似度的数值。由于我使用了 TF-IDF 矢量器,计算点积将直接给出余弦相似性得分。因此,我将使用 sklearn 的 linear_kernel 而不是余弦 _ 相似度,因为它要快得多。
**from** **sklearn.metrics.pairwise** **import** linear_kernel
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
我现在有了数据集中所有电影的成对余弦相似矩阵。下一步是编写一个函数,根据余弦相似性得分返回 20 部最相似的电影。
*# Build a 1-dimensional array with movie titles*
titles = movies['title']
indices = pd.Series(movies.index, index=movies['title'])
*# Function that get movie recommendations based on the cosine similarity score of movie genres*
**def** genre_recommendations(title):
idx = indices[title]
sim_scores = list(enumerate(cosine_sim[idx]))
sim_scores = sorted(sim_scores, key=**lambda** x: x[1], reverse=**True**)
sim_scores = sim_scores[1:21]
movie_indices = [i[0] **for** i **in** sim_scores]
**return** titles.iloc[movie_indices]
该建议
让我们尝试获得几部电影的最佳推荐,看看这些推荐有多好。
genre_recommendations('Good Will Hunting (1997)').head(20)
Recommendations Similar to “Good Will Hunting”
genre_recommendations('Toy Story (1995)').head(20)
Recommendations Similar to “Toy Story”
genre_recommendations('Saving Private Ryan (1998)').head(20)
Recommendations Similar to “Saving Private Ryan”
如你所见,我有一份相当不错的推荐名单,分别是《心灵捕手》(T12)、《剧情》(T13)、《玩具总动员》(T14)、《动画、儿童、喜剧》(T15)、《拯救大兵瑞恩》(T16)、《动作、惊悚、战争》(T17)。
总的来说,以下是使用基于内容的推荐的优点:
- 不需要关于其他用户的数据,因此没有冷启动或稀疏性问题。
- 可以推荐给口味独特的用户。
- 可以推荐新的和不受欢迎的项目。
- 可以通过列出导致项目被推荐的内容特征(在本例中是电影类型)来为推荐的项目提供解释
但是,使用这种方法有一些缺点:
- 找到合适的特征很难。
- 不推荐用户内容简档之外的项目。
- 无法利用其他用户的质量判断。
2 —协同过滤
协同过滤推荐器完全基于过去的行为,而不是基于上下文。更具体地说,它是基于两个用户的偏好、品味和选择的相似性。它分析一个用户与另一个用户的口味有多相似,并在此基础上提出建议。
例如,如果用户 A 喜欢电影 1、2、3,而用户 B 喜欢电影 2、3、4,那么他们有相似的兴趣,A 应该喜欢电影 4,B 应该喜欢电影 1。这使得它成为最常用的算法之一,因为它不依赖于任何附加信息。
一般来说,协同过滤是推荐引擎的主力。该算法有一个非常有趣的特性,即能够自己进行特征学习,这意味着它可以开始自己学习使用什么特征。
数学
有两种主要类型的基于记忆的协同过滤算法:
- 用户-用户协同过滤:在这里,我们根据相似性找到相似的用户,并推荐第一个用户的相似者过去选择的电影。这种算法非常有效,但需要大量的时间和资源。它需要计算每个用户对信息,这需要时间。因此,对于大型基础平台,如果没有非常强大的可并行化系统,该算法很难实现。
- 逐项协同过滤:与之前的算法非常相似,但我们不是寻找用户的相似物,而是尝试寻找电影的相似物。一旦我们有了电影的相似矩阵,我们就可以很容易地向从数据集中给任何电影评分的用户推荐相似的电影。该算法比用户-用户协同过滤消耗的资源少得多。因此,对于一个新用户,该算法比用户-用户协作花费的时间少得多,因为我们不需要用户之间的所有相似性分数。并且对于固定数量的电影,电影-电影相似矩阵随着时间是固定的。
在这两种情况下,我们都会建立一个相似度矩阵。对于用户-用户协同过滤,用户相似性矩阵将由一些度量任意两对用户之间相似性的距离度量组成。同样,项目相似性矩阵将测量任意两对项目之间的相似性。
在协同过滤中通常使用 3 种距离相似性度量:
- Jaccard 相似度:相似度基于对项目 A 和 B 评分的用户数量除以对项目 A 或 B 评分的用户数量。它通常用于我们没有数字评分而只有布尔值的情况,如购买的产品或点击的添加。
- 余弦相似度:(和基于内容的系统一样)相似度是 A 和 b 的项目向量的 2 个向量之间的夹角余弦,向量越近,夹角越小,余弦越大。
- 皮尔逊相似度:相似度是两个向量之间的皮尔逊系数。出于多样性的目的,我将在这个实现中使用皮尔逊相似度。
代码
由于我的笔记本电脑的计算能力有限,我将只使用评级的子集来构建推荐系统。特别是,我将从 100 万个收视率中随机抽取 2 万个收视率样本(2%)。
我使用 scikit-learn 库将数据集分成测试和训练。Cross _ validation . train _ test _ split根据测试实例的百分比将数据混洗并拆分成两个数据集,这里是 0.2。
**from** **sklearn** **import** cross_validation **as** cv
train_data, test_data = cv.train_test_split(small_data, test_size=0.2)
现在我需要创建一个用户条目矩阵。因为我已经将数据分为测试和训练,所以我需要创建两个矩阵。培训矩阵包含 80%的评级,测试矩阵包含 20%的评级。
*# Create two user-item matrices for training and testing data*
train_data_matrix = train_data.as_matrix(columns = ['user_id', 'movie_id', 'rating'])
test_data_matrix = test_data.as_matrix(columns = ['user_id', 'movie_id', 'rating'])
现在我使用 sklearn 的 pairwise_distances 函数来计算皮尔逊相关系数。该方法提供了一种将距离矩阵作为输入的安全方法,同时保持了与许多其他采用向量数组的算法的兼容性。
**from** **sklearn.metrics.pairwise** **import** pairwise_distances
*# User Similarity Matrix*
user_correlation = 1 - pairwise_distances(train_data, metric='correlation')
user_correlation[np.isnan(user_correlation)] = 0*# Item Similarity Matrix*
item_correlation = 1 - pairwise_distances(train_data_matrix.T, metric='correlation')
item_correlation[np.isnan(item_correlation)] = 0
有了相似性矩阵,我现在可以预测数据中没有包括的评分。使用这些预测,我可以将它们与测试数据进行比较,以尝试验证我们的推荐模型的质量。
*# Function to predict ratings*
**def** predict(ratings, similarity, type='user'):
**if** type == 'user':
mean_user_rating = ratings.mean(axis=1)
*# Use np.newaxis so that mean_user_rating has same format as ratings*
ratings_diff = (ratings - mean_user_rating[:, np.newaxis])
pred = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array([np.abs(similarity).sum(axis=1)]).T
**elif** type == 'item':
pred = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])
**return** pred
评估
有许多评估指标,但用于评估预测评级准确性的最常用指标之一是均方根误差(RMSE)** 。我将使用 sklearn 的 mean_square_error (MSE) 函数,其中 RMSE 就是 MSE 的平方根。我将使用 scikit-learn 的均方误差函数作为我的验证指标。比较基于用户和基于项目的协同过滤,看起来基于用户的协同过滤给出了更好的结果。**
**from** **sklearn.metrics** **import** mean_squared_error
**from** **math** **import** sqrt
*# Function to calculate RMSE*
**def** rmse(pred, actual):
*# Ignore nonzero terms.*
pred = pred[actual.nonzero()].flatten()
actual = actual[actual.nonzero()].flatten()
**return** sqrt(mean_squared_error(pred, actual))*# Predict ratings on the training data with both similarity score*
user_prediction = predict(train_data_matrix, user_correlation, type='user')
item_prediction = predict(train_data_matrix, item_correlation, type='item')*# RMSE on the train data*
print('User-based CF RMSE: ' + str(rmse(user_prediction, train_data_matrix)))
print('Item-based CF RMSE: ' + str(rmse(item_prediction, train_data_matrix)))## Output
User-based CF RMSE: 699.9584792778463
Item-based CF RMSE: 114.97271725933925
模型训练的 RMSE 是度量信号和噪声被模型解释了多少的度量。我注意到我的 RMSE 相当大。我想我可能过度拟合了训练数据。
总的来说,基于记忆的协同过滤易于实现并产生合理的预测质量。然而,这种方法有一些缺点:
- 它没有解决众所周知的冷启动问题,即当新用户或新项目进入系统时。
- 它不能处理稀疏数据,这意味着很难找到对相同项目进行评级的用户。
- 当没有任何评级的新用户或项目进入系统时,它会受到影响。
- 它倾向于推荐热门商品。
****注:基于内容和基于记忆的协同过滤的完整代码可以在这个 Jupyter 笔记本中找到。
Collaborative Filtering vs Content-Based Filtering
3 —矩阵分解
在之前的尝试中,我已经使用了基于记忆的协同过滤来根据用户的评分数据进行电影推荐。我只能在一个非常小的数据样本(20,000 个评级)上尝试它们,结果得到了相当高的均方根误差(糟糕的推荐)。计算项目或用户之间的距离关系的基于记忆的协同过滤方法有这两个主要问题:
- 它不太适合大规模数据集,尤其是基于用户行为相似性的实时推荐——这需要大量计算。
- 评级矩阵可能过度适合用户口味和偏好的嘈杂表示。当我们在原始数据上使用基于距离的“邻域”方法时,我们匹配稀疏的低级细节,我们假设这些细节代表用户的偏好向量而不是向量本身。
3 Reasons to Reduce Data’s Dimensionality
因此,我需要应用降维技术来从原始数据中提取口味和偏好,也就是所谓的低秩矩阵分解。为什么要降维?
- 我可以发现原始数据中隐藏的相关性/特征。
- 我可以删除无用的冗余和嘈杂的功能。
- 我可以更容易地解释和可视化数据。
- 我也可以访问更容易的数据存储和处理。
数学
基于模型的协同过滤 是在 矩阵分解(MF) 的基础上得到更大的曝光,主要作为潜变量分解和降维的无监督学习方法。矩阵分解被广泛用于推荐系统,与基于记忆的 CF 相比,它可以更好地处理可伸缩性和稀疏性:
- MF 的目标是从已知的评分中学习用户的潜在偏好和项目的潜在属性(学习描述评分特征的特征),然后通过用户和项目的潜在特征的点积来预测未知的评分。
- 当你有一个非常稀疏的矩阵,有很多维度,通过做矩阵分解,你可以把用户项矩阵重新构造成低秩结构,你可以用两个低秩矩阵相乘来表示矩阵,其中的行包含潜在向量。
- 通过将低秩矩阵相乘,填充原始矩阵中缺少的条目,使该矩阵尽可能接近原始矩阵。
一种众所周知的矩阵分解方法是 【奇异值分解】 。在高层次上,SVD 是一种将矩阵 A 分解为原始矩阵 A 的最佳低秩(即更小/更简单)近似的算法。在数学上,它将 A 分解为两个酉矩阵和一个对角矩阵:
SVD Equation
其中 A 是输入数据矩阵(用户评分) U 是左奇异向量(用户“特征”矩阵) Sum 是奇异值对角矩阵(实质上是每个概念的权重/强度) V^T 是右奇异向量(电影“特征”矩阵)。u 和 V^T 是列正交的,代表不同的东西: U 代表用户“喜欢”每个特征的程度和 V^T 代表每个特征与每个电影的相关程度。
为了得到较低等级的近似,我采用这些矩阵并只保留前 k 个特征,这可以被认为是潜在的品味和偏好向量。
代码
Scipy 和 Numpy 都有进行奇异值分解的函数。我将使用 Scipy 函数 svds ,因为它让我可以选择要使用多少潜在因素来逼近原始评级矩阵(而不是在此之后将其截断)。
**from** **scipy.sparse.linalg** **import** svds
U, sigma, Vt = svds(Ratings_demeaned, k = 50)
因为我要利用矩阵乘法来获得预测,所以我要将 Sum(现在是值)转换成对角矩阵形式。
sigma = np.diag(sigma)
我现在有了为每个用户预测电影收视率所需的一切。我可以通过数学和矩阵乘法 u,Sum,和 V^T,得到 a 的秩 k = 50 的近似值,一次完成
但是首先,我需要将用户均值加回去,以获得实际的星级预测。
all_user_predicted_ratings = np.dot(np.dot(U, sigma), Vt) + user_ratings_mean.reshape(-1, 1)
有了每个用户的预测矩阵,我可以构建一个函数来为任何用户推荐电影。为了便于比较,我返回用户已经评级的电影列表。
preds = pd.DataFrame(all_user_predicted_ratings, columns = Ratings.columns)
现在,我编写一个函数来返回指定用户尚未评级的预测评级最高的电影。
**def** recommend_movies(predictions, userID, movies, original_ratings, num_recommendations):
*# Get and sort the user's predictions*
user_row_number = userID - 1 *# User ID starts at 1, not 0*
sorted_user_predictions = preds.iloc[user_row_number].sort_values(ascending=False) *# User ID starts at 1*
*# Get the user's data and merge in the movie information.*
user_data = original_ratings[original_ratings.user_id == (userID)]
user_full = (user_data.merge(movies, how = 'left', left_on = 'movie_id', right_on = 'movie_id').
sort_values(['rating'], ascending=False)
)
*# Recommend the highest predicted rating movies that the user hasn't seen yet.*
recommendations = (movies[~movies['movie_id'].isin(user_full['movie_id'])].
merge(pd.DataFrame(sorted_user_predictions).reset_index(), how = 'left',
left_on = 'movie_id',
right_on = 'movie_id').
rename(columns = {user_row_number: 'Predictions'}).
sort_values('Predictions', ascending = False).
iloc[:num_recommendations, :-1]
)
**return** user_full, recommendations
评估
我将使用库来评估其在 MovieLens 数据集上的 RMSE(均方根误差),而不是像上次那样手动评估。这是 Python Scikit-Learn 的构建和分析推荐系统。
***# Import libraries from Surprise package*
**from** **surprise** **import** Reader, Dataset, SVD, evaluate
*# Load Reader library*
reader = Reader()
*# Load ratings dataset with Dataset library*
data = Dataset.load_from_df(ratings[['user_id', 'movie_id', 'rating']], reader)
*# Split the dataset for 5-fold evaluation*
data.split(n_folds=5)*# Use the SVD algorithm.*
svd = SVD()
*# Compute the RMSE of the SVD algorithm.*
evaluate(svd, data, measures=['RMSE'])**
我得到了一个平均值均方根误差0.8736,相当不错。**
该建议
让我们试着为 ID 为 1310 的用户推荐 20 部电影。
**predictions = recommend_movies(preds, 1310, movies, ratings, 20)predictions**
Recommendations using SVD
这些看起来是很好的建议。很高兴看到,虽然我实际上没有使用电影的类型作为特征,但截断矩阵分解的特征“拾取”了用户的潜在品味和偏好。我推荐了一些喜剧、戏剧和爱情电影——这些都是这个用户评价最高的电影类型。
****注:SVD 矩阵分解的完整代码可以在这本 Jupyter 笔记本中找到。
4 —深度学习
数学
使用深度学习的思路类似于基于模型的矩阵分解。在矩阵分解中,我们将原始稀疏矩阵分解成 2 个低秩正交矩阵的乘积。对于深度学习实现,我们不需要它们是正交的,我们希望我们的模型能够学习嵌入矩阵本身的值。对于特定的电影-用户组合,从嵌入矩阵中查找用户潜在特征和电影潜在特征。这些是进一步线性和非线性图层的输入值。我们可以将此输入传递给多个 relu、线性或 sigmoid 层,并通过任何优化算法(Adam、SGD 等)学习相应的权重。).
代码
Architecture for Neural Network
以下是我的神经网络的主要组成部分:
- 左侧嵌入层,通过潜在因素矩阵创建用户。
- 通过潜在因素矩阵创建电影的右嵌入层。
- 当这些图层的输入是(I)用户 id 和(ii)电影 id 时,它们将分别返回用户和电影的潜在因素向量。
- 采用这两个潜在向量的点积来返回预测评级的合并层。
然后,我使用均方误差(MSE)作为损失函数和 AdaMax 学习算法来编译模型。
***# Define model*
model = CFModel(max_userid, max_movieid, K_FACTORS)
*# Compile the model using MSE as the loss function and the AdaMax learning algorithm*
model.compile(loss='mse', optimizer='adamax')**
现在我需要训练模型。这一步将是最耗时的一步。在我的特殊情况下,对于我们的数据集,它有近 100 万个评级,近 6,000 个用户和 4,000 部电影,我在我的 MacBook 笔记本电脑 CPU 内每个时期大约 6 分钟(30 个时期~ 3 小时)训练了模型。我以 90/10 的比例分割了训练和验证数据。
***# Callbacks monitor the validation loss*
*# Save the model weights each time the validation loss has improved*
callbacks = [EarlyStopping('val_loss', patience=2),
ModelCheckpoint('weights.h5', save_best_only=True)]
*# Use 30 epochs, 90% training data, 10% validation data*
history = model.fit([Users, Movies], Ratings, nb_epoch=30, validation_split=.1, verbose=2, callbacks=callbacks)**
下一步是实际预测随机用户对随机电影的评价。下面,我对所有用户和所有电影应用新训练的深度学习模型,对每个用户和电影使用 100 维嵌入。
***# Use the pre-trained model*
trained_model = CFModel(max_userid, max_movieid, K_FACTORS)
*# Load weights*
trained_model.load_weights('weights.h5')**
这里我定义了一个函数来预测用户对未评级项目的评级。
***# Function to predict the ratings given User ID and Movie ID*
**def** predict_rating(user_id, movie_id):
**return** trained_model.rate(user_id - 1, movie_id - 1)**
评估
在上面的训练过程中,每当验证损失有所改善时,我都会保存模型权重。因此,我可以使用该值来计算最佳验证均方根误差。
***# Show the best validation RMSE*
min_val_loss, idx = min((val, idx) **for** (idx, val) **in** enumerate(history.history['val_loss']))**print** 'Minimum RMSE at epoch', '{:d}'.format(idx+1), '=', '{:.4f}'.format(math.sqrt(min_val_loss))## Output
Minimum RMSE at epoch 17 = 0.8616**
最好的验证损失是在第 17 个时期的 0.7424。取那个数的平方根,得到了 0.8616 的 RMSE 值,比 SVD 模型得到的 RMSE(0.8736)要好。
该建议
这里我给用户 ID 2000 做一个未分级的 20 部电影的推荐列表,按照预测值排序。让我们看看。
**recommendations = ratings[ratings['movie_id'].isin(user_ratings['movie_id']) == False][['movie_id']].drop_duplicates()recommendations['prediction'] = recommendations.apply(**lambda** x: predict_rating(TEST_USER, x['movie_id']), axis=1)recommendations.sort_values(by='prediction', ascending=False).merge(movies, on='movie_id', how='inner',
suffixes=['_u', '_m']).head(20)**
Recommendations using Deep Learning / Neural Networks
这个模型比我以前尝试过的所有方法(基于内容的、用户-项目相似性的协同过滤,SVD)都表现得更好。我当然可以通过增加更多的线性和非线性层来提高这个模型的性能。
****注:深度学习模型的完整代码可以在本 Jupyter 笔记本中找到。
最后一次外卖
推荐引擎是您的伴侣和顾问,通过为您提供量身定制的选项和创建个性化的体验来帮助您做出正确的选择。毫无疑问,推荐引擎在新时代越来越受欢迎和重要。学会使用它们对企业更有竞争力,对消费者更有效率,这将是对你最有利的。
我希望这篇文章有助于你了解 4 种不同的方法来建立你自己的电影推荐系统。你可以通过这个链接查看我的 GitHub repo 中的所有源代码(https://github.com/khanhnamle1994/movielens)。如果您有任何问题或改进建议,请告诉我!
— —
如果你喜欢这首曲子,我希望你能按下鼓掌按钮👏这样别人可能会偶然发现它。你可以在 GitHub 上找到我自己的代码,在【https://jameskle.com/】上找到更多我的写作和项目。也可以在 推特 , 上关注我直接发邮件给我 或者 在 LinkedIn 上找我。 注册我的简讯 就在你的收件箱里接收我关于数据科学、机器学习和人工智能的最新想法吧!