库里对火箭队说,这里是我的地盘

这场比赛,勇士队与上一场明显的区别,就是他们找回了拼搏的感觉,防守端倾尽所有,进攻端极力为库里做球,期许他早些找回手感,让G2失利的阴云彻底消散。

勇士队的防守

1.减缓库里防守端的消耗

上一篇文章提到了勇士队避免库里在防守端承担过多任务,导致他进攻端低迷,于是我用了很长的篇幅分析了如何解脱库里的办法。1. 让鲁尼首发。2.让伊戈达拉防哈登,反复延误,达不到效果也可耗火箭队进攻时间。3.让库里带轮换,错开哈登的上场时间。4.库里自己防守时应注意站位问题,减少赌博式抢断。从今天的比赛来看,后三点都应验了。第一点,没让鲁尼首发,可能是科尔更想用王牌五小抢开局,也是很棒的安排。

这场开局,勇士队用伊戈达拉防哈登,待阿里扎掩护时,伊戈达拉寸土不让。可是库里归位有个时间差,相当于包夹哈登,于是哈登将球传给阿里扎。上一场,阿里扎证明了他具备一定的持球与处理球能力。

然后8比4后,科尔迅速叫了暂停。这个暂停大致是交代库里延误时要及时归位,以及伊戈达拉要兼顾阿里扎,不能让他得到这类进攻机会。于是暂停后,这般回合我基本就没看到过了。勇士队依旧会用延误,只是会找准时间点,实在不行形成错位单打库里的机会也能接受,毕竟在延误的时候也消耗了火箭队进攻时间,而且今天库里在防哈登与保罗时,表现还是不错的。

以上回合,库里踩住右脚,不被哈登变向迷惑,让哈登走相对不擅长的右路时,哈登丢球。同时,本场比赛,库里共干扰投篮14次,对方命中6次,命中率为42.9%,比平时下降了-4.3%。这些数据,足以看得出库里在防守端的努力。

以及,当鲁尼或是尼克-杨在场时,火箭队的确会找他们二人的麻烦,所以多使用鲁尼与更改轮换阵容,的确减少了库里在防守端的消耗。

鲁尼防保罗
鲁尼防戈登

今天鲁尼因犯规困扰上场时间不多,可还是在防守端展现了他的价值,他的每个步伐都能展示出与他性格相符的稳重以及低调,一个赛季后,科尔用常规赛漫长历练为勇士队带来一个大防小的尖兵。

2.补防

今天勇士队也改变了一个防守策略,就是当哈登突进内线,即便火箭队三分手多,也要尝试补防,不让火箭队得到轻松得分。

如此图,哈登从左路强突进内线,勇士队三人放掉防守人协防。

格林看到阿里扎突入内线,迅速离开塔克前去补防。

前两场,勇士队顾及着火箭队的外线射手与卡佩拉内线的终结,当火箭队突入篮下的时候大多都放弃了补防。而今天,全队的态度很明确,就是不让对方轻松得分,即便你在上篮的时候会传球,那我也能靠机动性快速的补位来尽量弥补失位。

此回合,哈登强突内线,鲁尼快速干扰,而哈登已没有传球角度,只能自己终结。卡佩拉没有点到前场篮板,勇士队防守成功。

3.强硬的防守

当格林以这种姿态怒吼时,我们便能体会到在格林带动下,勇士队那熟悉的防守强度。

本场比赛,伊戈达拉抢断3次,全队共抢断11次,因为这些抢断,勇士队可打出他们喜欢的转换进攻,进入到他们熟悉的节奏。

以及,格林本场取得了17次篮板。由格林影射全队,我们能从每个人的动作中看出他们的拼搏,那股要洗刷掉上场失利的信念。

如这个回合,格林卡住位置,克莱与库里同时拼抢篮板。你能看的出,他们每球必争的态势。

勇士队的进攻

1.为库里找节奏

从开场后,全队便履行着为库里找节奏的进攻计划。于是第一节,库里就尝试了7次出手,6记三分。上一场库里全场只得到一次空位投篮的机会,而这场比赛,第一节库里就得到3次空位出手的机会,全场得到6次。

上场比赛,库里无球端跑动极少,而这场比赛,他开场就很活跃,也得到了不少机会,只是手感比较差,只投进一次三分。

持球端,库里也会利用错位找到出手的机会,动作都完成的很流畅,就是手感总差了一点。

上半场过后,库里三分仍然只有7中1,仿佛他要重复上两场的挣扎,可是队友们依旧相信库里,并且库里也同时保持着自信,以及最重要的是,科尔永远相信库里,他在下半场开场便为库里设置着进攻战术,帮助他找寻手感。

下半场开局的第一个回合。勇士队全员拉开,库里中路接球空切,造成保罗犯规,打成2+1。

以及,在快攻中,杜兰特找到库里,库里内切上篮,这是他第三节完成的第三个进球。就是依靠着这些铺垫,库里在西决,两个整场一个半场后,终于命中了一记库里式三分。

就是这样平地一声惊雷般的三分,彻底宣告了库里三分挣扎的结束,这之后,库里三分4中3,打破了所有的质疑。实力是回击质疑的最好办法,单节7中7得18分,库里用这样的表现敲碎了那些扑面而至的嘲讽。当他大声呼喊的那一刻,嘶吼般的喊出那句"This is my f------ house"的时候,我读到了库里散发出的强大自信以及他被人低估的逆风能力。

2.坚决找错位

上一场火箭队几乎每个回合都有找库里,让库里陷入防守困扰,而这场比赛,勇士队也如数奉还,当他们执行单打时,会找哈登、保罗的麻烦,当然,也会试图找卡佩拉、杰拉德-格林的麻烦。

前两场,杜兰特也会找一下错位,但是不找错位也无大碍,反正火箭队谁防都一样。不过这一场却不同,杜兰特只要单打就会借助克莱掩护,制造错位打哈登的机会。

这个球哈登防的其实还可以,但是身高与臂展差距太大,基本没造成什么干扰。

杜兰特不分什么左右路,状态好了就是强吃,哈登没有任何办法。于是德安东尼终于体会到了勇士队前两场进攻核心被杀伤的无奈,所以他尝试了一些保护手段,就是勇士队经常使用的提前换防。

这个回合,当克莱掩护时,卡佩拉提前与哈登换防,避免哈登被杜兰特杀伤。然而杜兰特并不管你换的是谁,一个变向完了就是一个中距离。

库里也会在进攻端找哈登的麻烦。而哈登也是除卡佩拉外,库里错位单打的第二选择。

以及第四节,利文斯顿也找到了哈登,在哈登面前完成了一个华美的背后过人,然后将篮球恰当好处的扣入框中。

除了以上放出的回合外,还有很多勇士队错位单打哈登、卡佩拉、保罗以及杰拉德-格林的回合,这些我都不一一列举。与前一场不同,这场比赛勇士队纵然也有很多单打,可是他们并不只依赖与单打,他们还有无球跑动,绕掩护,空切,以及转换进攻,这也是进攻端,他们与上场比赛最大的区别。

勇士队本场打了26回合转换进攻。而转换进攻,一是靠快速发球打对手立足未稳,二就是防守反击,由防守驱动进攻。当火箭队退防迅速时,勇士队很难靠发球抢出机会,他们更多的是依靠防守成功而打出的转换。所以我们看的出,进攻与防守是一个整体,好的进攻,可以保证落位及时不被打转换,好的防守,可以给予球队得到反击的机会。科尔一直强调,要在进攻端赐予球员球权,让他们参与到进攻中,从而提升他们的防守积极性,在今天这场比赛后,我深刻的体会到了这句话,以及他一直以来的长远目光。

3.分享两个本场我喜欢的战术吧。

这个回合是暂停后,科尔布置的一个战术,几乎和第三节开局为库里制造机会内切的战术相似。但是那个战术火箭队可以放掉格林与伊戈达拉前去协防库里,而这个边线球战术便彻底打消了这个顾虑。库里、克莱与杜兰特分别拉开空间,伊戈达拉发球时传底角杜兰特,杜兰特分内切的格林,格林轻松空切上篮。

这个回合,是火箭队为戈登设置的双掩护清防守人的战术,以前勇士队总用这个战术,让库里完成空位三分。我想当科尔看到这个战术后,下一场比赛,他便可能会使用这个战术,为库里创造机会。


这场,库里久而未见的三分让我感动,但更让我感动的是勇士队的团队文化,球员们团结一心为库里找回手感所做出的努力。前两场比赛,库里三分挣扎,杜兰特说,他对库里有信心,从不担心库里的投篮。科尔一直鼓励库里,他说库里是小一号的邓肯,能以各种方式帮助球队,并告诉大家,库里只是节奏不对,他会很快恢复状态的。然后这场比赛,我们能看出库里试图反弹的决心,以及队友们给予的帮助、信任和坚持。

大卫-韦斯特在采访中谈到,勇士队从不开球队会议,上一次他们集体开会的时候,是2017年夺冠,球队商量去哪里庆祝的时候。我想,球队文化是一支球队的内核与信仰,当他们有足够坚固的文化时,他们便能在困境中依靠团结来度过难关。团队文化是我在文章中反复提到过的东西,而我希望,我能在以后的复盘中更多次的提到这个,当他们团结起来的时候,我能真切的感知到他们因聚合而散发出来的魅力,这也是我区分勇士队与其他球队的根本,是让我不断追逐勇士队的原因,是让我牺牲业余时间去追求这支球队的不竭动力。


原创不易,喜欢我的文章可以扫码关注我的公众号:金州记,有些文章我不会搬运到其他平台,只会在公众号发表,最后,感谢大家的阅读。



来源:知乎 www.zhihu.com
作者:陷阱

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

止步于7950米的第十四座,难登的中国山峰

这个登山季,我只关注一个人,即将完攀14座八千级高峰的中国女性——罗静。

4月中旬,罗静起程前往希夏邦马大本营。

5月14日,正式冲顶。

5月14日上午,罗静团队得到消息,因天气原因,罗静在海拔7950米处下撤。与此同时,西藏登协宣布,希夏邦马攀登季已过,停止攀登。

5月15日,新华社报道确认希夏邦马因天气原因关闭。

一时间,罗粉们无所适从,很多人根本不明白发生了什么,依然在嚷嚷着静候佳音,有报道说登顶了,有报道说15日会再次冲顶。

所有的人都无法接受——罗静的希夏邦马攀登就这么结束了。


在连线罗静的校友张越之前,让我们先来了解两件事:


一、希夏邦马真假顶之争

希夏邦马峰,海拔8027米(中国称8012米),在世界14座8000米级高峰中排名第14,这是唯一一座完全在中国境内的8000米级山峰,也是14座8000米高峰中唯一被中国人首登的。

希夏邦马主要由三座高峰组成,主峰(8027米)、中央峰(8008米)以及希夏邦马北峰(7966米)

中央峰与主峰间有一道横切山脊,非常陡峭且暴露感极强,雪况极不稳定,很多商业攀登都止步于8008米的中央峰,国际上亦被称为"假顶"。据summitpost资料显示,截止2000年,共有434人成功登顶中央峰,但只有165人继续攀登至主峰。

(以上资料节录于始祖鸟官方公众号)

具体资料详见:

summitpost.org/shisha-p

主峰与中央峰


希夏邦马从中央峰通往顶峰的山脊


二、关于希夏邦马的登山许可

由于希夏邦马是唯一一座完全在中国境内的8000级山峰,所以中国人攀登希夏邦马只能跟圣山探险公司(西藏境内的所有的山,国人都必须跟圣山公司)。外籍人士报批国家体育总局后可自行组织攀登(希峰于1980年对外籍人士开放)。

据我了解到的有限资料,圣山探险组织的希夏邦马攀登都是以中央峰为顶峰,所以,目前所有登顶希夏邦马的中国人都是登的中央峰,而不是主峰。

查阅8264早期的帖子,只有陶瓷虾等极少数人提出了希夏邦马真假顶的概念,有人骂他舔欧洲人屁股,有人提到了爱国与主权,即"山是我们的,我们说哪个真顶哪个就是",也有登顶者说真假顶这个概念太矫情,不就是后面那座高十几米的小尖尖吗?有必要吗?

罗静认为有必要,我们都认为有必要,所以罗静此次出发的目标是登顶希夏邦马主峰。

在此,感谢圣山探险能满足罗静的心愿,许可她去完攀真正的被国际认可的十四座。


接下来,由罗静校友张越向我们介绍一下罗静此次攀登希夏邦马的全过程。

Q:能不能简单介绍一下罗静此次攀登过程?

张越:4月10日到拉萨;4月15日到希夏邦马大本营;4月23日开始拉练到C1;4月25日返回ABC休整;5月1日到定日休整;5月11日正式开始攀登,到C1;5月12日到C2;5月13日到C3;5月14日凌晨3点出发冲顶,早上7点多到达海拔7950米的位置,被要求下撤。

Q:罗静这次登希峰的路线是什么?

张越:先到中央峰,再走山脊路线到主峰。圣山公司说,如果天气不好,就只能到中央峰。

Q:圣山作出下撤决定的原因是什么?

张越:当时天气不好,能见度比较差。他们让罗静下撤,并表示二十几号会有好天气可再次冲顶。

Q:罗静下撤时的状态如何?

张越:非常好。她认为自己可以登顶,尽管当时天气不太好,但毕竟只有早上7点多,远不到关门时间,能见度虽然差,但也已经可以看到主峰,距离已经很近了。Nurbu当时已经作好冲顶准备,但他们后来还是听从了圣山的意见下撤了。

Q:罗静这次带了自己的协作?

张越:圣山公司也给安排了协作,Nurbu和Sanu是罗静在境外长期合作的夏尔巴协作,这些年在尼泊尔和巴基斯坦一起出生入死,结下深厚友谊,其中一人在为外国登山队支援时攀登过希夏邦马主峰。本来在国内登山他俩是没有必要跟来的,但他们考虑到罗静的安全,希望能陪着好友完成最后一座目标,特地向国内监管部门申请的许可,打算一起攀登。


Q:据我所知,罗静团队一直有购买天气预报,怎么会选择14号湿度这么大的天气去冲顶?

张越:是的,我们从罗静攀登南迦帕尔巴特和布洛阿特开始,就从瑞士的meteotest公司购买天气预报,他们的预报非常精准,这在以往攀登过程中是得到证实的。这次我们11号就得知14号湿度太大,不是冲顶的好气候,我于12号通过在前进营地的拍摄团队与希夏邦马攀登的总指挥旺青取得联系,把这个情况告诉他,并表示13号晚上得到瑞士更新的天气预报后再联系,但后来再也没联系上他。这次登山是由圣山主导的,我们服从他们意见。


购买的天气预买显示14号当天湿度非常大,绿色表示湿度


免费的高山气象网站


Q:圣山公司有购买天气预报吗?

张越:我不清楚,但所有免费的网站也显示14号并不是冲顶的好天气。

Q:你刚才说圣山让罗静下撤的时候说二十几号会有好天气,可以继续冲顶,可是怎么忽然就宣布希夏邦马登山季结束了?

张越:是的,我在14日上午10点多就得到封山这个消息,罗静是下撤到C2营地之前知道的,差不多是下午。西藏登协说是因为天气原因,可据我们查询,接下来有不少窗口天气。也有人说可能是因为保加利亚登山家Boyan失踪的关系,这当然只是猜测。但据我们得到的消息,当天冲顶时,协作一直接到某领导的电话,在指(GAN)挥(RAO)攀登,下撤的决定也是电话遥控的,而不是正在攀登的人作出的决定。

Q:据我所知,罗静的希夏邦马登山许可有效期只到5月17日,为什么圣山会跟她说二十几号还能再次冲顶呢?

张越:这个要问圣山了,不知道登山许可是否可延期。

Q:为什么登希夏邦马这样一座八千级的山,体育总局只批了一个月时间?

张越:这是由圣山公司报批的时间,同期的国际队报批的时间是一个半月。



罗静与张梁的登山许可
国际队的登山许可证

Q:如何判断一座山的登山季结束了?

张越:圣山公司应该知道,我们也很想知道衡量的标准是什么。

Q:如果因为个别登山者的失踪或遇难就关闭某座山,那八千的山岂不是都要被关闭了?

张越:到底是不是因为Boyan只是个别人的猜测,我们希望圣山能告诉我们真正的原因。

Q:罗静现在的情绪如何?

张越:非常难受,她表示非常不理解国内这样的攀登环境与制度,除非能回到一个公平、自主的环境下,才会考虑继续攀登希夏邦马。罗静以前大部分都是在国外完成的八千级高峰的攀登,对国内的登山体制不太了解,也不太习惯,她是比较有主见的,不喜欢被牵着鼻子走。

Q:帮我们代问罗静好,我们永远支持她。

张越:好的,谢谢大家。


罗静明天就会回到定日,随着她下山的脚步越来越近,希夏邦马登山过程将会被更完整的还原给大家。



后记

我曾经因为登不起八千躲在背窝里偷偷哭鼻子,现在我为朋友止步于希夏邦马的7950米也酸了鼻子。

八千的光环太过华丽,八千的盛名也远远超出了那些攀登者的负荷。太多的第一、首位,多少人还记得初心?这白色的战场没有硝烟,却充满了功利。

曾在宁金抗沙的帖子写过这个一个题引:"愿攀登不止于攀登,愿攀登仅仅只是攀登"。

一片干净的山,一次纯粹的攀登,是我们小小的心愿。


山是属于谁的?为什么只有这样一个公司能组织西藏境内山的攀登?圣山的水准毋庸置疑,但这样的垄断是否有利于中国登山运动的发展?政治、民族,我都不太懂,我接受现代文明的教育,我想要的只是——公平。


太多的通稿在罗静登顶前就已经写好,还有欢迎的盛宴,一场又一场的分享会。

当我的朋友被鲜花和掌声围绕时,我只会远远的看着她微笑。

当我的朋友遭受委屈时,我愿意站出来,为她抵挡第一颗子弹。


罗静,加油!


作者:另一种蓝

微信公众号:浮生四季(floatingseasons)


扩展阅读:

登山者罗静和她的13座8000米



来源:知乎 www.zhihu.com
作者:户外探险杂志

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

如何优雅地吃癌细胞?

谢邀,首先我们要确定要吃什么类型的癌细胞,从安全性上来说,有些细胞系是要避免食用的: 很多癌细胞系是病毒阳性的,比如肝癌细胞系PLC就是乙肝表面抗原阳性, 鼻咽癌细胞系C666-1 EBV阳性,显然是绝对不能吃的,而且这两类癌症也要尽量避免,胃癌细胞系也有很多EBV阳性,也尽量不食用。

从培养成本来看,有些细胞培养成本会比较高,比如白血病细胞系THP-1, 它的培养就需要质量比较好的胎牛血清FBS,一瓶500ml装的FBS 8000多块钱,最多能够培养50亿个细胞,估计只能吃一口。太奢侈了。这一类细胞系也要避免。

从口感来看,悬浮细胞系或者半悬浮细胞系因为黏附能力不强,很难形成一个完整的结构供你烹饪,所以绝大部分血癌,低分化癌种比如小细胞肺癌(一般半贴壁)等细胞系不合适。另外大部分癌细胞系都来源于上皮细胞,而在我们的食谱中,很少有上皮细胞来源的食物,所以上皮细胞来源的癌细胞系吃起来不大有嚼头。这一条就把绝大部分的癌细胞系给排除了。

综合上述考虑,我选了肉瘤(Sarcoma)细胞系作为主要食材。肉瘤也是一种恶性肿瘤,但严格意义上不属于癌症。它是来源于间叶组织(包括结缔组织和肌肉)的恶性肿瘤。显然,从肌肉来源的细胞系口味可能更好,所以我最后选择了A-673作为食材。它有以下几个特点:传代很快,每周能传2-3次,每次传代比例可达到1:20,使用最基础的DMEM培养基和FCS就可以培养。成本低廉。

那么我们怎么样来烹饪呢?平时我们吃的肉是有大量结缔组织和间质细胞的,所以有韧性有嚼头。而细胞系是单一细胞种类,结构会比肉类松散很多,红烧水煮等烹饪方法很可能会把细胞打散,所以不考虑。烧烤会是比较合适的烹饪方法,但因为单一细胞组分,不太可能像牛排一样一大块一起烤。考虑穿成串儿烧烤。加盐,孜然,辣椒面儿。至于口感,你可以想象成烤骨髓


评论里你们这些看饿了的人啊,简直。。。。。棒棒的。

我们一起去撸串儿吧


Cool Ape:博士研酒僧的诞生有什么可以打开新世界大门的摄影技能?经历痔疮手术是怎样一种体验?

来源:知乎 www.zhihu.com
作者:Cool Ape

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

此问题还有 22 个回答,查看全部。

听过的最难以忘记的鼓励的话是什么?

Thanks for inviting!

My first year in New York City was full of a lot of cool moments. I met Pirlo, David Villa, Dirk Nowitzki.

But I'll tell you the best one.

We were playing the Lakers in the second half of the season. Kobe Bryant came up to me after the game, and he said, "You have a bright future ahead of you."

That blew my mind. Kobe's my idol. It was an honor!

With stuff like that, I have to admit, I catch myself sometimes thinking too much these days.

Should I have done this better? Should I have made this play differently?

But then I remember — Keep it simple, like you always have. That's just my way of living.

I'm young. I'm having fun. Who'd have thought a kid from Latvia would be making noise in New York?

I'm not saving the world. I'm just playing basketball.

Keep it simple.

我来到纽约的第一年经历了很多很酷的事情,我见到了皮尔洛、大卫·比利亚和诺维茨基。

但这些都还不是最厉害的。

那个赛季我们和湖人的比赛结束后,科比来找到了我,他说:"你前方会是一个光明的未来。"

这句话给了我巨大的冲击。那可是科比!被他夸奖多么光荣!

之后的好多天里我都不停地想着这句话,想我是不是做的还不够好,是不是这个球没处理好,是不是有更好的方式。我不得不提醒自己要像以往一样保持简单,保持自己一贯的生活方式,好让自己冷静下来。

我没想拯救世界,我就是还比较会打篮球而已。

Keep it simple.



来源:知乎 www.zhihu.com
作者:波尔津吉斯

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

此问题还有 340 个回答,查看全部。
延伸阅读:
什么是爱?爱一个人是什么感觉?
你最孤独的时刻是什么?

防不胜防!当爹的基因明明没突变,竟也会导致自闭症?

药明康德/报道

自闭症是一类影响广泛的疾病。随着近年来人们对这一疾病关注热度的不断上升,越来越多的人对自闭症也有了更深的了解。


在多年的研究下,科学家们已经确认,自然产生的基因突变(de novo mutations)与将近三分之一的自闭症相关。而在今日最新上线的一项《科学》研究里,来自加州大学圣地亚哥分校(UCSD)的研究人员则发现,哪怕DNA突变没有影响到基因(术语是非编码区的突变),依然能导致自闭症的发生,成为发病的罪魁祸首。

▲自闭症的秘密,相当一部分藏在基因组的非编码区(图片来源:Pixabay)


"十年以来,我们都说自闭症的遗传因素里,部分是因为编码蛋白序列的基因出现新的突变,"该研究的通讯作者Jonathan Sebat教授说道:"但要知道,这些序列只占了基因组的2%。"


那剩下的98%对自闭症有什么作用呢?为了回答这个问题,在Human Longevity与Illumina两家著名公司的协助下,Sebat教授与他的同事们分析了2600个家庭里,9274名个体的完整基因组数据。随后,研究人员们分析了这些基因组信息里的异常,这包括结构上的变化、DNA元件的删除、以及DNA元件的复制等。从中,研究人员们希望找到关于自闭症的最新洞见。

▲研究人员们找到了不少非编码区的变异(图片来源:《科学》)


而结果正如他们所料,即便没有影响到基因,这些来自于非编码区的突变同样会遗传给后代,引起自闭症。"我们还发现这些变异主要来自父亲,这非常令人惊讶!"该研究的共同第一作者William M. Brandler博士说道。


这个发现可以说有着重要意义。过去人们发现,在编码区变异(常说的基因突变)导致的自闭症里,这些突变主要来自于母亲。而今日的这项研究则表明,父母双方的遗传信息都有可能造成后代的自闭症,两者从编码的信息上看有本质区别。


"这是一项非常出色的研究,它让我们从一个不同的角度来认识自闭症的遗传学,是对该领域做出的重大贡献。"华盛顿州立大学的神经学家Lucia Peixoto博士在《科学》杂志上评论道。

▲《科学》杂志对这项研究有着专文点评(图片来源:《科学》网站截屏)


基于这些发现,研究人员们提出了一个关于自闭症的全新解释。他们认为从母亲这里遗传到的基因突变,辅以父亲这里遗传到的非编码区突变,这两者相结合,导致了自闭症症状的产生。


随着人们对自闭症理解的不断加深以及基因疗法的迅猛发展,未来有一天,或许我们通过基因组测序,就能提前知道自己的后代罹患自闭症的风险,甚至在孩子出生前纠正这些突变。我们期待这一天的尽早到来。



本文题图来自Pixabay


参考资料:

[1] Autistic children may inherit DNA mutations from their fathers

[2] Variants in non-coding DNA contribute to inherited autism risk

[3] Paternally inherited cis-regulatory structural variants are associated with autism




来源:知乎 www.zhihu.com
作者:药明康德

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

勇士和火箭的问题,其实是照镜子的关系

勇士VS火箭(G3)




勇士防守:


汤普森VS保罗,伊戈达拉VS哈登,库里VS阿里扎,杜兰特VS塔克,格林VS卡佩拉


火箭防守:


保罗VS库里,哈登VS汤普森,塔克VS伊戈达拉,阿里扎VS杜兰特,卡佩拉VS格林


系列赛三场打完,仔细打量勇士和火箭,其实有点照镜子的意思:


  • 两边各自有一位超级单打手;
  • 两边都需要找到这位单打手之外的进攻发起方式;
  • 两边各有一位核心找不到状态;
  • 两边各有一个核心防守被针对;
  • 两边都想成为抓反击,打转换的一方。


G2的火箭,找到了哈登之外的进攻方式,他们也是防守更好的一方,成为了打转换的一方。


而G3又反过来,勇士把防守做到了极致,找回了一点传切的感觉,最后迎回了他们的库日天。


这轮系列赛的逻辑其实很简单,用某指导的话来说,双方要做的其实就是——加强进攻,加强防守...


当然,我们得把问题找的更具体一点。


火箭要怎样加强进攻?


火箭一直在寻找答案。G2他们就在尝试做一些卡佩拉的假掩护提前拆,但最后得到有效的答案却是戈登的颜射三分,阿里扎的定点突破,以及勇士进攻打崩后,火箭成为了推转换的一方——从掌握主动权的角度来说,你不能每场都指望自己成为打转换更强势的一方,当对手是勇士时,就更加不能期待。火箭需要找到哈登打库里之外的阵地战解法——毫无疑问,火箭的生死存亡都在这了。


用传球、定点突破和跑动破解勇士的防守轮转


G3的火箭,仍然在探索新的开发进攻方式——假掩护提前拆依然是不二选择,勇士开局用了库里大延误哈登的方式拖延哈登打库里出现的时间,哈登非常聪明的利用了这点,在库里大延误时找到了塔克和阿里扎,而塔克的处理球,阿里扎的上篮都得了分。


但勇士很快改变了防守策略——尽量让伊戈达拉挤掩护拖一会,然后老老实实换防,让库里坦然面对哈登,依靠篮下协防帮助库里,依靠弱侧轮转来补空位——火箭发现,打库里的难度又变大了。


但勇士这样防守不是没有漏洞——只要哈登在突破时注意一下弱侧,就会发现火箭的射手总会有机会。




格林协防哈登,汤神协防卡佩拉,保罗在弱侧是空的


勇士可以依靠轮转尽可能补位,但补位来不来得及,除了勇士自己的轮转速度,还得看哈登传球时机的把握,火箭射手们出手的决心。另外,如果火箭弱侧接球的球员可以再次发起突破,依然可以撕开防线——然而保罗这场球的突破实在难堪,阿里扎也没了G2的神奇。


火箭射手们在无球时,还是太老实了。阿里扎在把库里换给哈登后,不该留在弧顶,他应该沉到自己更熟悉的底角——他完全可以在弱侧与保罗跑一个交叉,扰乱汤神与伊戈达拉的选位,让他们俩没有精力去篮下帮助格林。


火箭进攻端要更果断、更有执行力


我能理解这场球火箭的那些不太成功的无球尝试——火箭很清楚,如果只是单纯的哈登打库里,哈登的能量总有用完的时候,打到第三节后半段很可能会维系不下去。但勇士的防守沟通非常好,火箭试验的那些假掩护其实并不好打。火箭在单打起手上,也太过墨迹,蠕轰运球过半场就比别的队花的时间多,然后先把球给无关球员做过渡,最后费半天劲才确定要怎么打,往往进攻时间剩下不多。再花上大笔时间秀胯下运球,剩下5秒启动突破,结果就是根本没有进攻后续操作的空间,只能是持球人做一锤子买卖。




磨蹭半天,做了个保罗打格林的选择,进攻时间还剩6秒




进攻时间就剩4秒了,戈登还在那一个劲试探步,最后24秒没出手


火箭很多回合是这种球,非得把时间弄的快不够了,才开始打——一旦篮下协防让你无法出手,分球后队友再做二次发起的机会都没有,甚至送空接都有可能超时。


火箭还有个问题——哈登打库里成功率是有保证的,但哈登有时候会莫名其妙在库里在场时,去打伊戈达拉、杜兰特。





至于哈登奇怪的传球失误,戈登接发球失误,就更加不应该——战术配合更简单的火箭,如果成为失误更多的一方,几乎不可能赢球。


保罗需要找到自己能打的对位


尽管保罗自己不承认,德安东尼也不承认,但从这场他莫名其妙放不进这样的终结球来看,他的脚应该真的有伤:





球员不愿承认小伤病是比较正常的情况——好胜心和自尊心,不愿找借口。主教练不承认,也许是怕对手予以针对。但不管保罗是不是真的有伤,能不能尽快复原,他必须要在这轮系列赛里找到自己能打的对位——至少到目前为,保罗打库里、打卢尼的效果都不够满意,打尼克杨都显得不够流畅。


我们通常不会担心火箭的进攻——一直进攻效率112.2的球队,没有理由担心他们的进攻。火箭的双核互为备用,让他们拥有延续全场的稳定输出——但是,当保罗找不到错位时,这种稳定输出就难以为继了。勇士是联盟里少数可以摆出几乎没有内线错位的球队——勇士让韦斯特退出轮转,几乎就没有真正意义上的4、5号位球员(卢尼在ESPN归类里是小前锋)。


莫雷和德安东尼构建的这套体系,就像诸葛亮的隆中对——待天下有变,荆益两路进兵,可逐鹿中原。如今的西决也是这个局势,天下会有变动(水花这轮系列赛手感并不稳定),但火箭若是只有一路兵马(哈登),怕是也难以搞出动静吧。


不管怎样,库里也好,卢尼也好,尼克杨也好,保罗需要找到他能打的点,以他的能力,现在的效率和产量,太低了。


可能要7人轮转拼到底了


巴莫特的终结已经不能看了,投篮毫无威胁,对空间是严重的伤害,他出场对进攻的拖累是非常彻底的。至于安德森和乔-约翰逊,前者会解放勇士的进攻,后者今天已经做了尝试,拖空间比巴莫特还严重。火箭这赛季比较可惜的是,常规赛非常好用的巴莫特遭遇伤病后,状态全失,让西决双方缩短轮转的搏命战里,火箭成为阵容深度不够的一方。而双方各自的X因素——杰拉德-格林和尼克杨,前者的进攻状态不如后者也就算了,前者防守毫无意外的差,后者防守却比预想的更好,火箭就有点倒霉了。




火箭要怎样加强防守?


火箭最大的问题是退防,但火箭可能解决不了这个问题。G2看似解决了被打转换的问题,其实是因为火箭进攻打的太好,让勇士干脆没有转换可打(还有一些战术犯规用的比较及时)。G3火箭的问题就回来了:进攻时,火箭两个球员站底角,卡佩拉站底线,哈登突破,一旦哈登不进,只有一名球员的位置比勇士球员更有利,其他球员很难跑回来。




底角的阿里扎,底线的卡佩拉落后太远了,哈登估计还没爬起来




退防人数有优势,但保罗、戈登、哈登追不上伊戈达拉




好不容易都退回来了,小阵容需要很多人堵篮下才能防住转换攻框,结果外线的尼克杨没人管




已经完全退防到位了,也没有漏人,但是大家还来不及关心持球人,这边杜兰特已经要突破哈登了,队友反应过来已经来不及了


没招没招的,除了打好进攻,少给转换机会,我也想不出火箭怎么办。但哈登还是要减少一些丢球或投丢后跟裁判抱怨而不立刻退防的情况,差一个人还是差不少事。


火箭防守最大的问题——哈登怎么保护?


这轮系列赛到目前为止,我印象里库里过哈登好像是100%成功率?杜兰特可能也只失手了个别几次(哈登今天有一次防杜兰特,两次横移预判都对了)。G1的赛后就说,火箭不该换防换的这么痛快,多少让勇士花一点找错位的时间成本,但火箭到目前为止,依然是毫不犹豫的积极换防。勇士在G2还会遇到格林、伊戈达拉、卢尼们拖空间,便于火箭协防的问题,但这场球,勇士注意了拖空间球员的站位,库里使出了突分接无球跑动再借掩护接球投篮的习惯套路,杜兰特也注意了突破分球,一下子让库杜打哈登的收益更大了——库里的持球投三分也终于开张了,把这块再放进来,火箭的防守恐怕就承受不住了。




库里走底线的难度极大,几乎100%走右手边,不懂哈登怎么横移错了方向


一个触目惊心的数据——库里季后赛单打,如果选择突破攻框,命中率是100%。注意:库里与鹈鹕的系列赛只单打了一次,还不是攻框,也就是说,几乎都是在哈登身上拿到的数据。


从现在的情况看,哈登和库里两个人互相找,其实是谁也防不住谁的局面,但依然有区别——就像你打王者荣耀,库里好歹能钻草丛迂回一下,等到队友救援就有机会反杀,而哈登野外被抓干脆双手离开手机...


说实话,不好想办法——你没办法让哈登一夜之间练好防守横移。哈登这赛季常规赛被安排了不少防控卫的任务,也一度让人觉得他防守进步不小——确实有进步,常规赛不会觉得哈登防面框这么差,只是偶尔会感慨一下他防无球还是总漏人,也不伸手。但季后赛三轮下来,对手越来越针对,哈登的防守横移就是个无解难题。卡佩拉可以帮他擦一些屁股,但勇士有时候会让射手用掩护牵制卡佩拉,甚至塔克有时都会被调出去,库里和杜兰特一些离篮筐稍远的终结也不好协防。哈登的第一道防线如果一点作用都不起,也许只能防伊戈达拉和格林的球员收再狠一点,然后等勇士再犯类似G2的错误了。


G3比G1赛后,能看到有调整余地的项目变少了,但火箭自带投疯属性,勇士也自带浪逼属性,G4还是有的打。万一火箭赢了G4,后面火箭两个主场,那系列赛又不好说了。


关注微信公众号:静易墨

微信号:jingyimo456

扫描二维码关注静易墨~~



来源:知乎 www.zhihu.com
作者:静易墨

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

手把手教你在Python中实现文本分类(附代码、数据集)

本文约2300字,建议阅读8分钟。

本文将详细介绍文本分类问题并用Python实现这个过程。


引言


文本分类是商业问题中常见的自然语言处理任务,目标是自动将文本文件分到一个或多个已定义好的类别中。文本分类的一些例子如下:


  • 分析社交媒体中的大众情感
  • 鉴别垃圾邮件和非垃圾邮件
  • 自动标注客户问询
  • 将新闻文章按主题分类


目录


本文将详细介绍文本分类问题并用Python实现这个过程:





文本分类是有监督学习的一个例子,它使用包含文本文档和标签的数据集来训练一个分类器。端到端的文本分类训练主要由三个部分组成:


1. 准备数据集:第一步是准备数据集,包括加载数据集和执行基本预处理,然后把数据集分为训练集和验证集。

特征工程:第二步是特征工程,将原始数据集被转换为用于训练机器学习模型的平坦特征(flat features),并从现有数据特征创建新的特征。

2. 模型训练:最后一步是建模,利用标注数据集训练机器学习模型。

3. 进一步提高分类器性能:本文还将讨论用不同的方法来提高文本分类器的性能。


注意:本文不深入讲述NLP任务,如果你想先复习下基础知识,可以通过这篇文章
analyticsvidhya.com/blo


准备好你的机器


先安装基本组件,创建Python的文本分类框架。首先导入所有所需的库。如果你没有安装这些库,可以通过以下官方链接来安装它们。



#导入数据集预处理、特征工程和模型训练所需的库
from sklearn import model_selection, preprocessing, linear_model, naive_bayes, metrics, svm
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn import decomposition, ensemble

import pandas, xgboost, numpy, textblob, string
from keras.preprocessing import text, sequence
from keras import layers, models, optimizers


一、准备数据集


在本文中,我使用亚马逊的评论数据集,它可以从这个链接下载:


gist.github.com/kunalj1


这个数据集包含3.6M的文本评论内容及其标签,我们只使用其中一小部分数据。首先,将下载的数据加载到包含两个列(文本和标签)的pandas的数据结构(dataframe)中。


数据集链接:


drive.google.com/drive/


#加载数据集
data = open('data/corpus').read()
labels, texts = [], []
for i, line in enumerate(data.split("\n")):
content = line.split()
labels.append(content[0])
texts.append(content[1])

#创建一个dataframe,列名为text和label
trainDF = pandas.DataFrame()
trainDF['text'] = texts
trainDF['label'] = labels


接下来,我们将数据集分为训练集和验证集,这样我们可以训练和测试分类器。另外,我们将编码我们的目标列,以便它可以在机器学习模型中使用:


#将数据集分为训练集和验证集
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(trainDF['text'], trainDF['label'])

# label编码为目标变量
encoder = preprocessing.LabelEncoder()
train_y = encoder.fit_transform(train_y)
valid_y = encoder.fit_transform(valid_y)


二、特征工程


接下来是特征工程,在这一步,原始数据将被转换为特征向量,另外也会根据现有的数据创建新的特征。为了从数据集中选出重要的特征,有以下几种方式:


  • 计数向量作为特征
  • TF-IDF向量作为特征
    • 单个词语级别
    • 多个词语级别(N-Gram)
    • 词性级别
  • 词嵌入作为特征
  • 基于文本/NLP的特征
  • 主题模型作为特征


接下来分别看看它们如何实现:


2.1 计数向量作为特征


计数向量是数据集的矩阵表示,其中每行代表来自语料库的文档,每列表示来自语料库的术语,并且每个单元格表示特定文档中特定术语的频率计数:


#创建一个向量计数器对象
count_vect = CountVectorizer(analyzer='word', token_pattern=r'\w{1,}')
count_vect.fit(trainDF['text'])

#使用向量计数器对象转换训练集和验证集
xtrain_count = count_vect.transform(train_x)
xvalid_count = count_vect.transform(valid_x)


2.2 TF-IDF向量作为特征


TF-IDF的分数代表了词语在文档和整个语料库中的相对重要性。TF-IDF分数由两部分组成:第一部分是计算标准的词语频率(TF),第二部分是逆文档频率(IDF)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。


TF(t)=(该词语在文档出现的次数)/(文档中词语的总数)

IDF(t)= log_e(文档总数/出现该词语的文档总数)

TF-IDF向量可以由不同级别的分词产生(单个词语,词性,多个词(n-grams))


  • 词语级别TF-IDF:矩阵代表了每个词语在不同文档中的TF-IDF分数。
  • N-gram级别TF-IDF: N-grams是多个词语在一起的组合,这个矩阵代表了N-grams的TF-IDF分数。
  • 词性级别TF-IDF:矩阵代表了语料中多个词性的TF-IDF分数。



#词语级tf-idf
tfidf_vect = TfidfVectorizer(analyzer='word', token_pattern=r'\w{1,}', max_features=5000)
tfidf_vect.fit(trainDF['text'])
xtrain_tfidf = tfidf_vect.transform(train_x)
xvalid_tfidf = tfidf_vect.transform(valid_x)

# ngram 级tf-idf
tfidf_vect_ngram = TfidfVectorizer(analyzer='word', token_pattern=r'\w{1,}', ngram_range=(2,3), max_features=5000)
tfidf_vect_ngram.fit(trainDF['text'])
xtrain_tfidf_ngram = tfidf_vect_ngram.transform(train_x)
xvalid_tfidf_ngram = tfidf_vect_ngram.transform(valid_x)

#词性级tf-idf
tfidf_vect_ngram_chars = TfidfVectorizer(analyzer='char', token_pattern=r'\w{1,}', ngram_range=(2,3), max_features=5000)
tfidf_vect_ngram_chars.fit(trainDF['text'])
xtrain_tfidf_ngram_chars = tfidf_vect_ngram_chars.transform(train_x)
xvalid_tfidf_ngram_chars = tfidf_vect_ngram_chars.transform(valid_x)


2.3 词嵌入


词嵌入是使用稠密向量代表词语和文档的一种形式。向量空间中单词的位置是从该单词在文本中的上下文学习到的,词嵌入可以使用输入语料本身训练,也可以使用预先训练好的词嵌入模型生成,词嵌入模型有:Glove, FastText,Word2Vec。它们都可以下载,并用迁移学习的方式使用。想了解更多的词嵌入资料,可以访问:


analyticsvidhya.com/blo


接下来介绍如何在模型中使用预先训练好的词嵌入模型,主要有四步:


1. 加载预先训练好的词嵌入模型

2. 创建一个分词对象

3. 将文本文档转换为分词序列并填充它们

4. 创建分词和各自嵌入的映射


#加载预先训练好的词嵌入向量
embeddings_index = {}
for i, line in enumerate(open('data/wiki-news-300d-1M.vec')):
values = line.split()
embeddings_index[values[0]] = numpy.asarray(values[1:], dtype='float32')

#创建一个分词器
token = text.Tokenizer()
token.fit_on_texts(trainDF['text'])
word_index = token.word_index

#将文本转换为分词序列,并填充它们保证得到相同长度的向量
train_seq_x = sequence.pad_sequences(token.texts_to_sequences(train_x), maxlen=70)
valid_seq_x = sequence.pad_sequences(token.texts_to_sequences(valid_x), maxlen=70)

#创建分词嵌入映射
embedding_matrix = numpy.zeros((len(word_index) + 1, 300))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector


2.4 基于文本/NLP的特征


创建许多额外基于文本的特征有时可以提升模型效果。比如下面的例子:


  • 文档的词语计数—文档中词语的总数量
  • 文档的词性计数—文档中词性的总数量
  • 文档的平均字密度--文件中使用的单词的平均长度
  • 完整文章中的标点符号出现次数--文档中标点符号的总数量
  • 整篇文章中的大写次数—文档中大写单词的数量
  • 完整文章中标题出现的次数—文档中适当的主题(标题)的总数量
  • 词性标注的频率分布
    • 名词数量
    • 动词数量
    • 形容词数量
    • 副词数量
    • 代词数量


这些特征有很强的实验性质,应该具体问题具体分析。


trainDF['char_count'] = trainDF['text'].apply(len)
trainDF['word_count'] = trainDF['text'].apply(lambda x: len(x.split()))
trainDF['word_density'] = trainDF['char_count'] / (trainDF['word_count']+1)
trainDF['punctuation_count'] = trainDF['text'].apply(lambda x: len("".join(_ for _ in x if _ in string.punctuation)))
trainDF['title_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.istitle()]))
trainDF['upper_case_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.isupper()]))

trainDF['char_count'] = trainDF['text'].apply(len)
trainDF['word_count'] = trainDF['text'].apply(lambda x: len(x.split()))
trainDF['word_density'] = trainDF['char_count'] / (trainDF['word_count']+1)
trainDF['punctuation_count'] = trainDF['text'].apply(lambda x: len("".join(_ for _ in x if _ in string.punctuation)))
trainDF['title_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.istitle()]))
trainDF['upper_case_word_count'] = trainDF['text'].apply(lambda x: len([wrd for wrd in x.split() if wrd.isupper()]))
pos_family = {
'noun' : ['NN','NNS','NNP','NNPS'],
'pron' : ['PRP','PRP$','WP','WP$'],
'verb' : ['VB','VBD','VBG','VBN','VBP','VBZ'],
'adj' : ['JJ','JJR','JJS'],
'adv' : ['RB','RBR','RBS','WRB']
}

#检查和获得特定句子中的单词的词性标签数量
def check_pos_tag(x, flag):
cnt = 0
try:
wiki = textblob.TextBlob(x)
for tup in wiki.tags:
ppo = list(tup)[1]
if ppo in pos_family[flag]:
cnt += 1
except:
pass
return cnt

trainDF['noun_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'noun'))
trainDF['verb_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'verb'))
trainDF['adj_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'adj'))
trainDF['adv_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'adv'))
trainDF['pron_count'] = trainDF['text'].apply(lambda x: check_pos_tag(x, 'pron'))


2.5 主题模型作为特征


主题模型是从包含重要信息的文档集中识别词组(主题)的技术,我已经使用LDA生成主题模型特征。LDA是一个从固定数量的主题开始的迭代模型,每一个主题代表了词语的分布,每一个文档表示了主题的分布。虽然分词本身没有意义,但是由主题表达出的词语的概率分布可以传达文档思想。如果想了解更多主题模型,请访问:


analyticsvidhya.com/blo


我们看看主题模型运行过程:


#训练主题模型
lda_model = decomposition.LatentDirichletAllocation(n_components=20, learning_method='online', max_iter=20)
X_topics = lda_model.fit_transform(xtrain_count)
topic_word = lda_model.components_
vocab = count_vect.get_feature_names()

#可视化主题模型
n_top_words = 10
topic_summaries = []
for i, topic_dist in enumerate(topic_word):
topic_words = numpy.array(vocab)[numpy.argsort(topic_dist)][:-(n_top_words+1):-1]
topic_summaries.append(' '.join(topic_words)


三、建模


文本分类框架的最后一步是利用之前创建的特征训练一个分类器。关于这个最终的模型,机器学习中有很多模型可供选择。我们将使用下面不同的分类器来做文本分类:


  • 朴素贝叶斯分类器
  • 线性分类器
  • 支持向量机(SVM)
  • Bagging Models
  • Boosting Models
  • 浅层神经网络
  • 深层神经网络
    • 卷积神经网络(CNN)
    • LSTM
    • GRU
    • 双向RNN
    • 循环卷积神经网络(RCNN)
    • 其它深层神经网络的变种


接下来我们详细介绍并使用这些模型。下面的函数是训练模型的通用函数,它的输入是分类器、训练数据的特征向量、训练数据的标签,验证数据的特征向量。我们使用这些输入训练一个模型,并计算准确度。


def train_model(classifier, feature_vector_train, label, feature_vector_valid, is_neural_net=False):
# fit the training dataset on the classifier
classifier.fit(feature_vector_train, label)

# predict the labels on validation dataset
predictions = classifier.predict(feature_vector_valid)

if is_neural_net:
predictions = predictions.argmax(axis=-1)

return metrics.accuracy_score(predictions, valid_y)


3.1 朴素贝叶斯


利用sklearn框架,在不同的特征下实现朴素贝叶斯模型。


朴素贝叶斯是一种基于贝叶斯定理的分类技术,并且假设预测变量是独立的。朴素贝叶斯分类器假设一个类别中的特定特征与其它存在的特征没有任何关系。


想了解朴素贝叶斯算法细节可点击:


A Naive Bayes classifier assumes that the presence of a particular feature in a class is unrelated to the presence of any other feature


#特征为计数向量的朴素贝叶斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_count, train_y, xvalid_count)
print "NB, Count Vectors: ", accuracy

#特征为词语级别TF-IDF向量的朴素贝叶斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf, train_y, xvalid_tfidf)
print "NB, WordLevel TF-IDF: ", accuracy

#特征为多个词语级别TF-IDF向量的朴素贝叶斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "NB, N-Gram Vectors: ", accuracy

#特征为词性级别TF-IDF向量的朴素贝叶斯
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf_ngram_chars, train_y, xvalid_tfidf_ngram_chars)
print "NB, CharLevel Vectors: ", accuracy
#输出结果
NB, Count Vectors: 0.7004
NB, WordLevel TF-IDF: 0.7024
NB, N-Gram Vectors: 0.5344
NB, CharLevel Vectors: 0.6872


3.2 线性分类器


实现一个线性分类器(Logistic Regression):Logistic回归通过使用logistic / sigmoid函数估计概率来度量类别因变量与一个或多个独立变量之间的关系。如果想了解更多关于logistic回归,请访问:


analyticsvidhya.com/blo


# Linear Classifier on Count Vectors
accuracy = train_model(linear_model.LogisticRegression(), xtrain_count, train_y, xvalid_count)
print "LR, Count Vectors: ", accuracy

#特征为词语级别TF-IDF向量的线性分类器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf, train_y, xvalid_tfidf)
print "LR, WordLevel TF-IDF: ", accuracy

#特征为多个词语级别TF-IDF向量的线性分类器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "LR, N-Gram Vectors: ", accuracy

#特征为词性级别TF-IDF向量的线性分类器
accuracy = train_model(linear_model.LogisticRegression(), xtrain_tfidf_ngram_chars, train_y, xvalid_tfidf_ngram_chars)
print "LR, CharLevel Vectors: ", accuracy
#输出结果
LR, Count Vectors: 0.7048
LR, WordLevel TF-IDF: 0.7056
LR, N-Gram Vectors: 0.4896
LR, CharLevel Vectors: 0.7012


3.3 实现支持向量机模型


支持向量机(SVM)是监督学习算法的一种,它可以用来做分类或回归。该模型提取了分离两个类的最佳超平面或线。如果想了解更多关于SVM,请访问:


analyticsvidhya.com/blo


#特征为多个词语级别TF-IDF向量的SVM
accuracy = train_model(svm.SVC(), xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram)
print "SVM, N-Gram Vectors: ", accuracy
#输出结果
SVM, N-Gram Vectors: 0.5296


3.4 Bagging Model


实现一个随机森林模型:随机森林是一种集成模型,更准确地说是Bagging model。它是基于树模型家族的一部分。如果想了解更多关于随机森林,请访问:


analyticsvidhya.com/blo


#特征为计数向量的RF
accuracy = train_model(ensemble.RandomForestClassifier(), xtrain_count, train_y, xvalid_count)
print "RF, Count Vectors: ", accuracy

#特征为词语级别TF-IDF向量的RF
accuracy = train_model(ensemble.RandomForestClassifier(), xtrain_tfidf, train_y, xvalid_tfidf)
print "RF, WordLevel TF-IDF: ", accuracy
#输出结果
RF, Count Vectors: 0.6972
RF, WordLevel TF-IDF: 0.6988


3.5 Boosting Model


实现一个Xgboost模型:Boosting model是另外一种基于树的集成模型。Boosting是一种机器学习集成元算法,主要用于减少模型的偏差,它是一组机器学习算法,可以把弱学习器提升为强学习器。其中弱学习器指的是与真实类别只有轻微相关的分类器(比随机猜测要好一点)。如果想了解更多,请访问:


analyticsvidhya.com/blo


#特征为计数向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_count.tocsc(), train_y, xvalid_count.tocsc())
print "Xgb, Count Vectors: ", accuracy

#特征为词语级别TF-IDF向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_tfidf.tocsc(), train_y, xvalid_tfidf.tocsc())
print "Xgb, WordLevel TF-IDF: ", accuracy

#特征为词性级别TF-IDF向量的Xgboost
accuracy = train_model(xgboost.XGBClassifier(), xtrain_tfidf_ngram_chars.tocsc(), train_y, xvalid_tfidf_ngram_chars.tocsc())
print "Xgb, CharLevel Vectors: ", accuracy
#输出结果
Xgb, Count Vectors: 0.6324
Xgb, WordLevel TF-IDF: 0.6364
Xgb, CharLevel Vectors: 0.6548


3.6 浅层神经网络


神经网络被设计成与生物神经元和神经系统类似的数学模型,这些模型用于发现被标注数据中存在的复杂模式和关系。一个浅层神经网络主要包含三层神经元-输入层、隐藏层、输出层。如果想了解更多关于浅层神经网络,请访问:


analyticsvidhya.com/blo





def create_model_architecture(input_size):
# create input layer
input_layer = layers.Input((input_size, ), sparse=True)

# create hidden layer
hidden_layer = layers.Dense(100, activation="relu")(input_layer)

# create output layer
output_layer = layers.Dense(1, activation="sigmoid")(hidden_layer)

classifier = models.Model(inputs = input_layer, outputs = output_layer)
classifier.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')
return classifier

classifier = create_model_architecture(xtrain_tfidf_ngram.shape[1])
accuracy = train_model(classifier, xtrain_tfidf_ngram, train_y, xvalid_tfidf_ngram, is_neural_net=True)
print "NN, Ngram Level TF IDF Vectors", accuracy
#输出结果:
Epoch 1/1
7500/7500 [==============================] - 1s 67us/step - loss: 0.6909
NN, Ngram Level TF IDF Vectors 0.5296


3.7 深层神经网络


深层神经网络是更复杂的神经网络,其中隐藏层执行比简单Sigmoid或Relu激活函数更复杂的操作。不同类型的深层学习模型都可以应用于文本分类问题。





  • 卷积神经网络


卷积神经网络中,输入层上的卷积用来计算输出。本地连接结果中,每一个输入单元都会连接到输出神经元上。每一层网络都应用不同的滤波器(filter)并组合它们的结果。





如果想了解更多关于卷积神经网络,请访问:


analyticsvidhya.com/blo


def create_cnn():
# Add an Input Layer
input_layer = layers.Input((70, ))

# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

# Add the convolutional Layer
conv_layer = layers.Convolution1D(100, 3, activation="relu")(embedding_layer)

# Add the pooling Layer
pooling_layer = layers.GlobalMaxPool1D()(conv_layer)

# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(pooling_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')

return model

classifier = create_cnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "CNN, Word Embeddings", accuracy
#输出结果
Epoch 1/1
7500/7500 [==============================] - 12s 2ms/step - loss: 0.5847
CNN, Word Embeddings 0.5296


  • 循环神经网络-LSTM


与前馈神经网络不同,前馈神经网络的激活输出仅在一个方向上传播,而循环神经网络的激活输出在两个方向传播(从输入到输出,从输出到输入)。因此在神经网络架构中产生循环,充当神经元的"记忆状态",这种状态使神经元能够记住迄今为止学到的东西。RNN中的记忆状态优于传统的神经网络,但是被称为梯度弥散的问题也因这种架构而产生。这个问题导致当网络有很多层的时候,很难学习和调整前面网络层的参数。为了解决这个问题,开发了称为LSTM(Long Short Term Memory)模型的新型RNN:





如果想了解更多关于LSTM,请访问:


analyticsvidhya.com/blo


def create_rnn_lstm():
# Add an Input Layer
input_layer = layers.Input((70, ))

# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

# Add the LSTM Layer
lstm_layer = layers.LSTM(100)(embedding_layer)

# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')

return model

classifier = create_rnn_lstm()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-LSTM, Word Embeddings", accuracy
#输出结果
Epoch 1/1
7500/7500 [==============================] - 22s 3ms/step - loss: 0.6899
RNN-LSTM, Word Embeddings 0.5124


  • 循环神经网络-GRU


门控递归单元是另一种形式的递归神经网络,我们在网络中添加一个GRU层来代替LSTM。


defcreate_rnn_gru():

# Add an Input Layer
input_layer = layers.Input((70, ))

# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

# Add the GRU Layer
lstm_layer = layers.GRU(100)(embedding_layer)

# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')

return model

classifier = create_rnn_gru()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-GRU, Word Embeddings", accuracy
#输出结果
Epoch 1/1
7500/7500 [==============================] - 19s 3ms/step - loss: 0.6898
RNN-GRU, Word Embeddings 0.5124


  • 双向RNN


RNN层也可以被封装在双向层中,我们把GRU层封装在双向RNN网络中。


defcreate_bidirectional_rnn():
# Add an Input Layer
input_layer = layers.Input((70, ))

# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

# Add the LSTM Layer
lstm_layer = layers.Bidirectional(layers.GRU(100))(embedding_layer)

# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(lstm_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')

return model

classifier = create_bidirectional_rnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "RNN-Bidirectional, Word Embeddings", accuracy
#输出结果
Epoch 1/1
7500/7500 [==============================] - 32s 4ms/step - loss: 0.6889
RNN-Bidirectional, Word Embeddings 0.5124


  • 循环卷积神经网络


如果基本的架构已经尝试过,则可以尝试这些层的不同变体,如递归卷积神经网络,还有其它变体,比如:


  • 层次化注意力网络(Sequence to Sequence Models with Attention)
  • 具有注意力机制的seq2seq(Sequence to Sequence Models with Attention)
  • 双向循环卷积神经网络
  • 更多网络层数的CNNs和RNNs


defcreate_rcnn():
# Add an Input Layer
input_layer = layers.Input((70, ))

# Add the word embedding Layer
embedding_layer = layers.Embedding(len(word_index) + 1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

# Add the recurrent layer
rnn_layer = layers.Bidirectional(layers.GRU(50, return_sequences=True))(embedding_layer)

# Add the convolutional Layer
conv_layer = layers.Convolution1D(100, 3, activation="relu")(embedding_layer)

# Add the pooling Layer
pooling_layer = layers.GlobalMaxPool1D()(conv_layer)

# Add the output Layers
output_layer1 = layers.Dense(50, activation="relu")(pooling_layer)
output_layer1 = layers.Dropout(0.25)(output_layer1)
output_layer2 = layers.Dense(1, activation="sigmoid")(output_layer1)

# Compile the model
model = models.Model(inputs=input_layer, outputs=output_layer2)
model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy')

return model

classifier = create_rcnn()
accuracy = train_model(classifier, train_seq_x, train_y, valid_seq_x, is_neural_net=True)
print "CNN, Word Embeddings", accuracy
#输出结果
Epoch 1/1
7500/7500 [==============================] - 11s 1ms/step - loss: 0.6902
CNN, Word Embeddings 0.5124


进一步提高文本分类模型的性能


虽然上述框架可以应用于多个文本分类问题,但是为了达到更高的准确率,可以在总体框架中进行一些改进。例如,下面是一些改进文本分类模型和该框架性能的技巧:


1. 清洗文本:文本清洗有助于减少文本数据中出现的噪声,包括停用词、标点符号、后缀变化等。这篇文章有助于理解如何实现文本分类:


analyticsvidhya.com/blo


2. 组合文本特征向量的文本/NLP特征:特征工程阶段,我们把生成的文本特征向量组合在一起,可能会提高文本分类器的准确率。


模型中的超参数调优:参数调优是很重要的一步,很多参数通过合适的调优可以获得最佳拟合模型,例如树的深层、叶子节点数、网络参数等。


3. 集成模型:堆叠不同的模型并混合它们的输出有助于进一步改进结果。如果想了解更多关于模型集成,请访问:


analyticsvidhya.com/blo


写在最后


本文讨论了如何准备一个文本数据集,如清洗、创建训练集和验证集。使用不同种类的特征工程,比如计数向量、TF-IDF、词嵌入、主题模型和基本的文本特征。然后训练了多种分类器,有朴素贝叶斯、Logistic回归、SVM、MLP、LSTM和GRU。最后讨论了提高文本分类器性能的多种方法。


你从这篇文章受益了吗?可以在下面评论中分享你的观点和看法。


原文链接:analyticsvidhya.com/blo

作者: Shivam Bansal

翻译:申利彬

校对:丁楠雅



来源:知乎 www.zhihu.com
作者:清华大学数据科学研究院

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载

季后赛五件事:KD+库里,勇士季后赛主场保持不败

"季后赛五件事" 的意思是:希望用简短的五个点总结回顾季后赛阶段联盟里有意思的事情。


喂出来的手感

西部决赛的第三场,一向擅长于打花对手的火箭被勇士三节打花了,干脆利落的。

全场比赛勇士最大领先对手41分,这也是他们比赛结束时的分差。四节比赛勇士均领先对手,而且第一、第三、第四节的单节得分都超过了30分。

其中第三节的34分,有超过一半是来自于史蒂芬·库里。库里今天第三节交出了18分,一场完美的刺客归来好戏。


但一些从数据上比较难体现的要点:今天的库里并不是全场比赛都像第三节那样打得水银泻地,反倒是在库里命中比赛第一记三分后,交出了一连串的三分打铁,半场比赛结束时,库里的三分球只有7投1中


"我认为有些球员经过三天休息的生疏,加上你们一直在询问他手感冰冷的问题,他们会变得很暴躁。但库里不是,他对于低迷的情况处理得很好。" 史蒂夫·科尔在接受 ESPN 采访时说道。


"我总是说你不能失去信心,我常常对自己说这样的话,至少有时候你需要成为自己最狂热的球迷。" 恢复状态的库里如是说。


然而库里第三节的7投7中,不止有他的个人努力,还有队友的成全。在这样一场西部决赛上,勇士队还能够做出全队给库里喂球,帮助他激活手感的举动,底气的确是太足了……


勇士还有杜兰特

库里今天开了,火箭又多了一道难题需要处理,而在处理库里的问题前,他们已经囤积了一道难题——系列赛场均33.3分的杜兰特。

库里的单节18分帮助勇士终结了比赛,他打出了让火箭倒地的制胜一拳。但这场比赛、这个系列赛的基调,暂时来看是由杜兰特定下的。

系列赛的第一场的主基调是"哈登Vs.杜兰特",第二场则是杜兰特单挑火箭全套侧翼,第三场杜兰特则稍微改变了思路——减少一对一的落位单打,更多快速出手增加回合数带动球队节奏。

你可以看到杜兰特今天一反前两场的疯狂单挑状态,反倒是多了推进球和反击中的远距离三分。

还有,今天的杜兰特传出6次助攻,比前两场加起来还要多5次助攻。


那么,勇士全队用了一场比赛把库里喂开了,这对于火箭的防守又多了一重考验。假设库里能够在后续的系列赛中维持近似的发挥,那么火箭应该如何防守这两个不讲道理的单打点呢?

在某些库里专属的时刻里,这位后卫的不讲道理程度甚至要超过杜兰特。就像这场比赛。

根据官网提供的数据,库里今天受防守干扰的投篮,7投5中。


用快攻赢德安东尼

在库里的爆发背后,勇士今天赢球的基础是——他们的快攻反击。

第一节刚开始不到4分钟,勇士就在尝试通过反击把节奏给提起来,他们连续三个回合通过火箭的投篮不中或者失误创造快攻,整个第一节勇士就打下了比赛的基调——"让我们跑~起来!"

全场比赛,勇士利用快攻拿下了23分,通过火箭的20次失误收获28分。相反,火箭全场只有10分的快攻得分,而勇士也没有给火箭太多利用失误得分的机会,全场比赛勇士只有8次失误。

哈登突破失误,勇士反击


有意思的是,勇士今天用快攻瓦解了火箭的比赛节奏,而火箭的主帅恰恰是炮轰的标志性人物——德安东尼。


但要注意的是,德安东尼没有把火箭打造成太阳式的炮轰球队。相反,由于哈登和保罗的存在,他们的节奏不算快,是季后赛节奏倒数第八慢的球队。火箭的进攻哲学还是围绕着哈登和保罗的一对一优势,他们也是季后赛单打回合最多的球队,领先第二名的凯尔特人30回合。

当然,转换进攻也是德安东尼进攻体系下的得分方式之一,他们的确也是季后赛转换进攻次数第二多的球队。但第一多的,是勇士。而且勇士还保持了联盟最高的转换进攻效率,每次平均1.23分,第二的火箭只有1.08分。


无罚球哈登

整个赛季都把对方防守当作稻草人的哈登,今天在勇士的防守组面前吃瘪了。从系列赛的第一场开始,哈登打得就不如之前写意。虽然哈登在系列赛的第一场就打出了41分,但难易度和消耗程度和之前的系列赛不同。

最主要的,勇士能够排出一套限制哈登错位单挑的阵容,在用小球组合的情况下,也没有降低球队的护框能力,这就让哈登的进攻成本提高了。

凯文-卢尼、伊戈达拉、克莱·汤普森,这三位防守球员只让哈登进了一个运动战进球。而且哈登全场只有5次罚球,其中有3次还是三分犯规。


当然,库里是勇士防守体系中的弱点,哈登也在一直通过掩护制造错位来创造和库里一对一的机会。哈登这场比赛在库里的防守下7投4中,拿到9分。

虽然库里是火箭进攻端的突破点,但库里也没有达到 "防守漏洞" 级别,在一对一的防守中他依然可以通过脚步和预判来干扰持球者的单挑或者出球。而且比起第一场,火箭为哈登创造和库里的一对一机会变得更难了。

但另一方面,火箭的防守组谁会成为库里的单挑突破口呢?库里也有通过一对一错位单挑对手的能力。这场比赛库里在保罗的防守下,5投3中拿下9分;戈登防他则4投2中;阿里扎防库里,今天3投3中;哈登防他,4投3中。

库里对位哈登的三分


主场不败纪录

和凯尔特人一样,勇士季后赛主场还没有输过球:7胜0负,平均每场有115.9分,净胜对手17.3分。

而且根据 ESPN 提供的数据,勇士还打破了季后赛的最长主场纪录——16场季后赛主场连胜,超越了1990/91赛季公牛的15连胜。

ESPN 提供的数据对比图

系列赛的下一场还是在甲骨文球馆进行,这对于火箭来说应该是属于赛季大考级别的测验。他们需要尽可能地在客场狙击勇士,把系列赛搬回主场,利用他们联赛第一的优势。

但另一方面呢,勇士季后赛的客场战绩3胜3负……



来源:知乎 www.zhihu.com
作者:Brad Zeng

【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载