本篇文章给大家谈谈tiktok核心函数,以及怎样在切入切出虚拟摄像头时营造卡顿效果对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

怎样在切入切出虚拟摄像头时营造卡顿效果
背景介绍:本人原先是android逆向工程师,后来因为工作变动,离开了协议分析这类的岗位,目前在做直播机与第三方应用兼容性分析相关分析,所以就有了这篇兼容性分析文章。
问题:tiktok在我们推流设备直播时,经过几个特定步骤后切换前后置摄像头会出现卡住的问题。
重现步骤:直播界面打开更多菜单->然后退到后台->回到前台->切换前后置菜单。
现象:直播画面卡住不动了。
解决思路:找到点击切换按钮后的点击事件回调,找到切换摄像头的核心逻辑,来找到卡住原因。
1、如果了解ART虚拟机的同学会知道,jni函数和java函数都会调用到art虚拟机ArtMethod的Invoke函数。

输出日志:
findtargetmethod:android.view.View.performClick
ArtMethodInvoke【22955】:;lr:0x4af78c;libart.so:android.view.View.performClick
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:java.lang.Enum.toString
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:X.Ggh.LIZ
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:java.util.LinkedHashMap.<init>
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:java.util.HashMap.putAll
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:java.util.HashMap.put
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:X.DED.LIZ
ArtMethodInvoke【22955】:;lr:0x2e2800;libart.so:X.D5k.onClick
通过fridahooklibart.so的ArtMethod的Invoke函数,我们找到了点击事件的回调类X.D5k.

找到这个类对应的onClick函数后,我对整个流程做个简单的研读,感觉发现了核心代码在注释直播流处理。

跟着核心代码一路往下找到LiveCore这应该就是直播的核心代码,其实现类为LiveCoreImpl,ILiveStream的实现类为LiveStream。


发现此处只是做了日志信息的合成和应用镜像之类的代码,但是又找到一个核心的类LiveStreamVideoCapture。

追踪到这里发现链路断了,又凑巧通过frida打开tiktok卡死在启动页上,那么接下来使用Xposed继续理流程。
上面的代码虽然没有追中到切换摄像头的核心逻辑,但是我们找到了两个核心逻辑的类LiveStreamVideoCapture和LiveCoreImpl,分别和直播视频流控制直播核心流程控制相关,所以Xposed继续走的时候以这两个类为重点,那么此处就开始放大招了,hook这两个类的所有函数,贴上代码。注意这里使用的classloader是application的classloader。


日志太多了,这里通过shell命令setprop做了个日志控制。



然后找到CameraVideoCapturer类的tryDeliverFrame,这里是处理相机的视频帧,感觉越来越接近真相了,继续hook这个方法,然后发现相机切换卡住以后,这个方法也停止调用了,那么没办法,继续往上找堆栈中run方法的调用调用处。

继续hook。


找到这个类。

至此,熟悉相机开发的同学应该知道,这就是SurfaceTexture.setOnFrameAvailableListener后,相机的可用帧会回调到这个函数,切换相机后卡顿,可用帧也同时不回调。
接下来hook原生相机。



调用的是android.hardware.Camera,也就是camera1相关的api,切换卡顿的时候并没有调用Camera.open函数。


首次开直播的时候调用了这两个函数,点击切换相机的时候并没有调用,在X.HCF这个类里找到switchCamera函数,那么猜测首次开相机,和切换前后相机走的并不是同一个流程,因为这个bug只有在切换相机时才会出现,所以我们就不关注首次开相机的流程。


果然,切换相机的时候走了这个流程,这是又发现了LiveStreamVideoCapture这个核心类,那么简单进去看看SwitchCaptureRunnable这个有没有被创建。


经过测试,发现这个类只会被创建一次,而run方法每次切换都会被调用,而且卡住的情况下也会被调用,那么结合上面Camera.open卡住时没有调用,可以大胆的猜测中间过程某个条件不满足被return了。根据堆栈信息继续往下找几个关键点。


发现CameraVideoCapture里也有切换相机的流程,切一步步往下走,能调用到上面我们hook过的X.HCF的switchCamera,那么我们就看看这里的switchCamera有没有调用吧。
•情况一:先滑动直播界面,再按home键,然后回到tiktok,再切换相机,此时status()函数返回1,走了后续Camera.open流程。


•情况二:先滑动界面,再切换相机,然后按home键,接着回到tiktok,最后切换相机,此时status()函数返回2,没走后续Camera.open流程。

从日志看switchCamera两种情况都走了,再结合switchCamera的源码看,源码里的status()函数的返回值决定了是否继续往下调用切换相机的流程,很遗憾的是,两种情况都出现了,而且都会卡住(为什么两个status值会不一样呢,这里先留个坑,最后来填)。这可把我难住了!
就在这时脑子突然开窍,既然画面卡住,那么必然有错误信息回调,果然一搜索CameraVideoCapture这个核心类有onError函数,毫不犹豫hook它,发现每次出错时,这个函数的错误码都会报-421错误(截图省略-421错误码的测试过程)。


错误信息非常明确的告诉我们是因为相机不支持缩放,导致的打开相机失败,那么至此相机卡住的直接原因找到了,但是还没找到为什么特殊的操作流程后会卡住,而正常的操作不会。于是乎继续跟着堆栈信息往上找。

发现走进了这里的流程,导致的相机进缩放流程,为了验证猜想,我决定在这个函数调用前,把message里的what字段改成2,让它不走这个流程,来看看是不是就不会导致界面卡住,于是就有了下面这段代码。

经过这一番篡改,果真随便怎么折腾,直播界面都不会卡住了。那么我只要找到那里给handler发送的这个message就应该离真想很近了。


然后找这个handler的sendMessage相关切message的what字段赋值为1的函数。

然后我找到了它,这个函数还和缩放相关,那就八九不离十了。


按之前的堆栈继续hook,发现卡住的时候这些方法确实都走了,而正常的时候是不走的,那么在X.Dvc的LIZ继续用抛堆栈大法。
得到如下两种堆栈:
•X.DCM接收到了touch事件,然后交由X.DCc这个类进行手势判断,发现是需要执行缩放的手势,于是执行了相机的缩放功能(由于我们业务原因需要隐藏底部NavigationBar,在Window底部上划会显示NavigationBar,上划的手势同时触发了控件的以为需要执行相机缩放),但是我们的虚拟摄像头又不支持缩放,导致打开相机失败,画面就卡在了之前相机拿到的最后一帧。

X.DCc类

X.DCO的invoke方法

•点击tiktok的切换相机Button,触发进入相机的缩放,这里就和我们之前的点击事件联系上了,红框部分就是补上了之前没关注但是最重要的相机缩放功能判断部分。


至此,我们已经把相机卡住的直接原因和根本原因都找到了,先手势再点击切换相机触发了进入相机缩放功能判断流程,由于我们的虚拟相机不支持缩放,导致打开相机失败,卡在相机的最后一帧(也可能是黑屏)。所以只要交付给framework组开发人员,让他们支持相机缩放相关功能就可以了。
接下来来填前面留下的坑,为什么退到后台会导致status函数的返回值不一样?
我们回到CameraVideoCapturer类,看看这个status()函数到底是个什么鬼!

发现他是父类ExternalVideoCapturer的函数,而且就是返回个字段,那再看看他那里进行了赋值。

通过AndroidStudio自带的字段读写索引功能,很容易找到父类里的start、stop和release函数,以及自身的onErrorOnHandler函数里(也就是我们之前抛-421错误堆栈的函数)。如果熟悉相机开发的同学应该知道,一般我们界面退到后台会释放相机,然后回到前台重新打开。那么接下来我们把这几个函数都hook一下,来验证猜想。

这里我多hook了一个onCaptureStarted函数,这个函数会调用父类的onStart函数,想看看是否会有调了onCaptureStarted但是没调父类的onStart的情况。然后还hook了CameraVideoCapturer自身重写的onStart和父类ExternalVideoCapturer的onStart函数。
下面是刚打开直播时的日志,此时status=1。

•情况一:先滑动直播界面,再按home键,然后回到tiktok,再切换相机,此时status()函数返回1,走了后续Camera.open流程。
这是直播退到后台时的调用,说明确实释放掉了,但是又调用了父类的onStart函数,那么此时的应该为2的status又变回了1。

接下来回到前台,此时一切正常status还是为1,而且重走了自身的onStart函数,相当于相机整个流程完全重开。

再接着切换相机第一次,这时的status还是为1,相机正常,紧接着我们发现了-421错误,发现又重走了父类的onStart函数,那么此时status还是1。

接下来切换相机画面卡住了,但还是走了父类的onStart。


以上就是第一种情况,由于每次切换相机都会抛完-421错误后,再调用父类ExternalVideoCapturer的start函数来重置status,也就造成了能调用Camera.open但是画面卡住的情况。
•情况二:先滑动界面,再切换相机,然后按home键,接着回到tiktok,最后切换相机,此时status()函数返回2,没走后续Camera.open流程。
前面流程就不贴了,直接开后面的流程记录。
退到后台status=1

回到前台status=1

切换相机第一次,画面正常status=1

切换相机第二次,在调用switchCamera之前先抛了一次-421的错误,导致status=2,然后switchCamera函数里判断status为2就被return,没有调用Camera.open函数,接下来也没有更多函数来重置status的状态,所以无论怎么切换相机,都无法执行到Camera.open(),除非tiktok退到后台,再回到前台。


以上就是第二钟情况。
浙江大学国际商务考研经验
本科就读于杭州某不知名学院(doge),本专业考研,二战上岸。一战二战选择的都是浙江大学的国际商务专业。
初试分数411,比一战提高了50+分,最终排名11/16上岸。
现在考研圈子各个科目真的有太多不同的老师和机构了,乱花渐欲迷人眼,大家也没必要太焦虑妄图去寻找一个最有用最完美的方法,有时候最笨的方法往往也是最正确的方法。整个考研过程的时间线大体来说是:因为大三上学期还有一些课程,所以3月开始只学习了数学,6/7月份开始认真学习其他科目,下面我分科目进行仔细介绍~
择校的准备
在准备复习之前,我就上知乎和其他网站浏览了许多考研相关的帖子,了解了一些关于考研的基础信息(包括考研的流程,专硕学硕的区别等等……)
之后我在研招网上挑选了一些我比较喜欢的学校浏览了它们学校的研究生网站,查询了公开的资料,比如每年招多少人,报录比(一些学校没有),复试的名单和分数情况等等。就我而言,择校需要考虑以下两点:
1、意愿
城市:你可以先考虑自己想在哪个城市读研(大概率是你想继续发展的城市),我当时的想法是想在南方,特别是江浙沪这一带,如果能留在杭州是最好不过了。
学校:对我个人而言,学校可能是我比专业更加注重的因素。一开始我就确定了要考985、211院校的想法,如果能有机会在顶尖院校求学那是最好了。比起两财一贸,我更倾向于综合性的大学,当时重点关注了浙江大学、中国人民大学、南京大学、东南大学、中山大学、南开大学、上海大学、上海外国语大学、河海大学等等(有点儿多哈哈)。
2、能力
专业选择:我自知自己数学不是特别好,所以当时也考虑了不考数学的一些跨专业学科。但是不考数学的专业由于分数区分度不是很大,竞争也是非常激烈,再加上没有特别适合的专业选择,最终也是放弃了这个想法。在数学三和396经济联考的选择上呢,我不太喜欢396的考试形式,抱着自己数学还能抢救的想法,主要考虑考察数三的学校。
当然,在正式复习专业课之前,甚至对统考的同学来讲,学校不用过早确定,而且在后续复习阶段,你的选择也可能会不停摇摆。可以把目标院校分为几档,依据自己的复习情况再做决定。
初试复习经验
434国际商务专业基础
专业课我复习了两年,还是有很多经验和自己的见解的,浙大的专业课不算难,给分也高,参考书目只有两本书,考察更偏向于记忆和背诵。其中国际贸易部分的内容比较多。
-推荐资料:
两本参考书目,学长学姐高分笔记(或者自己的笔记)
国际商务,马述忠版
国际商务新进展(第二版)
第一阶段:首先是知识积累阶段,也就是进行背诵之前,七月份之前。这是我进行知识积累阶段,进行笔记的整理和知识体系的构建。这个过程大概需要三个星期,因为浙大国际商务的专业知识其实不是特别的多。也就是说六月份是知识的积累期。
第二阶段:然后是知识的背诵与补充阶段。因为我本科就是国际商务专业的,所以我会在学姐传授的知识的基础上进行一些知识的补充,大概占到了总体知识的2—3成,这还是比较不容忽视的一部分。而且我整理的一些知识也确实在最后的考试中有考到的情况。这个阶段持续的时间最长,也是最痛苦的阶段,因为要不断的进行重复的记忆。这个是我在八月份的计划表,基本上就是每天背诵一个章节。每天背诵的时间大概是两个小时左右,最显著的特征就是背了就忘,当时一度认为自己的记忆力有问题…但是好在坚持了下来,重复背诵了大概是3遍之后,就开始进行整体框架的梳理,就会发现国际商务的专业的知识,前后连接十分的紧密。而且在这个过程中,我会对一些理解不太懂得点,找自己的本科的一些专业的教材来进行梳理,这对我的背诵和理解也有很大的帮助。这个阶段大概会到十月末。
第三阶段:就是冲刺阶段。十一月初,在这个阶段的主要特征就是会每个星期找一个时间来进行整体的模拟,来找出自己在考场上的不足。这个时候我还是没有停止对于专业课背诵,大概会每天背诵两个章节,如果太累或者章节知识点的话,可能只是背诵一个章节。背诵这种东西千万不能有很长时间的间隔,可以一两天不背,但是太长时间不背的话,就会让自己的框架散架。然后就是十一月中旬,我会有意的收集一些专业的热点问题,因为现在浙江大学国际商务专业的一些考试的趋势就是进行一些热点问题的考察,这对我们来说相当的重要。
热点问题:
还有就是需要找一些热点的话题,其实今年国商出题融合了很多热点,但是今年专业课给分普遍很高,所以这个区分度也不太大。
大家主要是要关注一下浙大国际商务专业的导师的一些论文,特别是马老师的论文。比如今年的新冠疫情、跨境电商和数字贸易等。然后关注热点,比如华为和tiktok在海外封禁的事件、RCEP协议等等,将这些热点问题融合你的专业课储备,再结合一些具体的做法记到专业课的笔记本上。这个在复试阶段也大有用处。
-时间建议:
5-6浏览精读课本,做框架
7-9做框架,理解课本,整理笔记,开始背诵
10-11反复背诵,准备热点问题
12依旧是背诵,掐表做几次全套真题
英语一82分
对于英语来说,其实我英语基础还可以,但太久不练习,导致单词阅读什么的比较差所以最后拿到81分还是比较满意的
首先买的唐迟阅读的逻辑和田静的语法长难句这两本书,但是都成功地闲置了。其中唐迟这本书全都是真题的解析,在前期我还没有自己做过真题的情况下,我不是太想提前知道答案所以就一直没看,后期也觉得没必要看了。语法的话我也是没有进行系统的学习,我觉得可能认识单词比较重要一点点。
然后真题是98—09年的一共刷了两遍,10—21年的一共刷了三遍,每次都可以记录一下自己的分数,但我觉得只刷真题对我来说是远远不够的,所以还写了以下的一些练习(也有人会说不要写练习题,这个就看自己了)主要是保证阅读一些新的内容,毕竟真正考试的时候肯定没有读过嘛。
最后作文的话主要就是自己根据往年真题整理一些话题,另外内容很重要,但是我觉得练字其实是很能加分的,我在作文部分也是得到了不错的分数
复习核心:
英语核心就是抓好单词和阅读这两块。
背单词:一战我是用红宝书背,感觉词汇差不多,我没用软件背诵,主要是爱玩手机,自制力差的你碰了手机根本停不下来。
阅读:最重要的就是阅读,做阅读的话最基础的就是单词的积累,只有看得懂你才会做题,但是你也不用要求每个词你都知道,通篇能理解在讲什么就是好的。关于一些技巧方面强烈推荐唐迟的阅读课,阅读的本质是逻辑。另外,刷真题阅读即可。
作文:作文其实是我准备的蛮痛苦的一个模块,写作文无话可说是最痛苦的。最好遵循前期输入,后期输出模式。由于我磨磨蹭蹭没准备输入,后期输出非常痛苦。如果不求高分,准备小作文模板,大作文第一段和最后一段模板,积累各话题词句就行。作文各个话题积累一些内容和表述这些内容的好词好句。
新题型完形翻译:这几个模块主要刷真题,不用花费太多的时间。新题型可以看一下陈正康的视频,其他不需要。
时间建议:
3-9背单词、阅读,如果有时间可以积累一些作文的内容。
10-12进行新题型完形翻译的训练。最后是掐时间做全套真题。
政治——72分
政治两年的分数都比较稳定,最后也得到一个不会给初试拖后腿的分数。政治的复习真得不用着急,是一门投入少收获多的课程,可以在后期开始,把省下的时间更多的用在数学和专业课上。
推荐资料:
徐涛强化课视频,徐涛核心考案,徐涛冲刺背诵笔记,肖秀荣1000题,肖4肖8。
复习核心:
选择题!选择题!选择题就是政治复习的重中之重!可以通过反复疯狂刷1000题巩固提高。
主观题等肖4出来了背就完事儿了,我主观题就只背了肖四(四套卷大概60道题,热点几乎都会包括在内),最后成绩也还可以。配合带背更有效率。
时间建议:
7-10
看徐涛强化课视频,配合核心考案,但是用冲刺背诵手册(小黄书)做笔记(就是相当于小黄书是你的笔记本,因为上面有很多总结性的结论)。这时候可以配合肖老的1000题刷题,注意别把答案写在书上,专门拿一些纸记录答案,再在书上做个错题的记号)
大概学完一章做一章,最重要的就是1000题反复刷,然后自己不清楚的,混淆的,或者没有在意的知识点,记到小黄书上和自己的笔记本上。
11-12
刷肖4肖8的选择题,大概刷了两遍,如果还有空余时间之后就是刷其他老师的预测卷选择题,分数不重要,查漏补缺看自己错的地方。
后期疯狂背肖4主观题。
数学——117
⑴寒假前两个月到寒假。我课比较少,每天都会抽两个小时来学一下数学。用的是汤家凤的高数讲义,听的汤家凤的网课,跟着汤记笔记,一张一张的写。
⑵寒假回来。由于寒假什么也没学,都快忘干净了。自己花了两周重新学高数讲义。然后接着听汤的课。这个时候也买了1800题,做了高数部分基础题。
⑶三月、四月、五月。买了李正元的书,高数部分真的很好,由于用汤打过了基础,我就开始啃这本李正元的书。这时候我开始制定每周计划。我会每天都进行复习之前学过的。我记得花了不到两个月,学完了第一遍。这本书题量很大,没再做习题册。第一遍高数啃完做张宇1000题,惨不忍睹,硬着头皮做了80%。
⑷六月。啃第二遍李正元。这一次看的很粗,只是把标记的之前错过的题看了一下。由于要准备考试,所以每天学数学的时间,由五六个小时减少到了两三个小时。并且开始用李永乐的线代讲义。
⑸七月、八月。天气很热,我从图书馆搬到了教室。每天早晨七点半开始到十一点半或者十二点,前两个小时看张宇闭关修炼,后两个小时做题。然后下午四点多到五点多看闭关修炼的线代。线代比高数要少,看闭关修炼线代的同时,我还会看李永乐的线代讲义。主要是看李永乐的线代讲义。差不多八月初结束了线代,但是高数还没学完,我接着开始学概率论。概率论刚开始学,太难了,尤其是分布函数那一章。我把张宇、李正元的都刷了好几遍。
⑹九月。我开始做真题,往年八几年九几年的真题,做的不行。当时很迷茫,学了这么多,怎么做题还是不行。我就觉得自己基础不行,我就把李正元的高数再次拿出来认认真真的看。我留给数学的时间很多,所以看完自己计划的高数,还会再看张宇线代和概率论。
⑺十月、十一月。开始不断做真题,基本每两天一套,做完整理。不做真题我就学李永乐的线代和张宇的概率论。真题最后留了两套。国庆的时候花了十多天做了660题。
⑻十一月、十二月。模拟题开始做,李正元的、李永乐的、张宇的、合工大超越、共创等等。心得:我学数学有个缺点看的很快,但是记不住,我就是靠遍数堆上去的,这些书我都看了好几遍,也做了好几遍。买的书也很多,现在想想大可不必,专精深即可。
推荐材料:
武忠祥高数视频,李永乐线性代数视频,学长笔记,660,330,张宇1000题,张宇真题大全解,李林4+6预测卷。我数学复习笔记,整体很有逻辑归类也比较清晰,在数学复习期间帮助了我很多。
复习作息表
学习是一件很枯燥的事情,每个人能专注复习的时间是有限的,劳逸结合才是科学的方法,效率比时间来的重要。我一般采取做六休一的方法,后期是每星期放一个半天的假,当然每个月也会主动被动的参加一些聚餐活动,让自己紧张的情绪放松下来。
平时的一天我一般是这样计划的:
7:00左右起床
7:00-8:00洗漱、早饭
8:00-11:45数学➕英语
11:45-12:30吃饭
12:30-13:30午休,睡一会儿
13:30-17:30英语复习和专业课复习
17:30-18:30晚饭,散步一会儿
18:30-22:00政治➕英语复习
22:00-23:30洗澡,玩手机,准备睡觉
仅供参考啊,我自己也无法完全按照这个来的,完美的作息是不存在滴:p
写在后面,一些心里话
我觉得考研更多的真得是考察一个人耐得住寂寞的能力,比起学习掌握考研的知识,更难是怎么坐在那里认认真真的学习,学到实处而不是假学习。学习的知识说到底是没有那么难的,我们并不是学到每门都要满分的程度,但是考研就是要考察你在一定的时间内掌握知识的能力,这里面包括了搜集信息的能力,计划安排的能力,学习能力,自控能力,管理情绪的能力等等。
复习是比较辛苦的,我经常会在老子天下第一和我就是个弟弟两种心态中反复摇摆。不自信的心态贯穿我整个考研阶段,直到9,10月份我都有考虑要不要换一个学校的问题;还有学数学学到崩溃,觉得自己啥也不会,真题一团糟的阶段。悄悄告诉你,没有人不焦虑,而要考得学校越好,这份焦虑和压力就会越大。大家都在掩饰自己的脆弱,你要做的就是坚持坚持再坚持,如果是现在,我一定会走到过去的自己身边,告诉她,你做的每一道题,你背得每一遍书,你到考试前坚持复习的最后一秒,都很有用,因为你始终没有放弃,所以你最后真的会得到想要的结果。就算是调剂,就算是失败,我也不会放弃我的人生的,因为人生很长,不在于走的这几步,而在于走的每一步!
短视频系统及大数据推荐机制
三个商业维度决定了短视频已经成为主流,分别为网络流量趋势,信息高效传达,变现价值能力。这三个方面的分别为平台,用户,创作者满足了各取所需的形态,这是实际价值的存在点。
网络流量趋势顾名思义,则是网络平台的唯一KPI。网络平台拥有越多的活跃用户就越证明该平台的成功,每一个网络巨头无一例外都是利用自身的流量,获取市场的广告效益,所以平台只有拥有流量才会成为具有实际价值的平台。
信息高效传达则是针对用户而言,能够在网络平台上获取到自己需要的信息更高效的方式。无论是娱乐,财经,体育,知识,消费各方面的视频内容都是对网络1.0时代以图文为主的博客,新闻知识获取渠道的升级。视频的每一帧都可能涵盖成百上千字的文字内容,在这个数据爆炸的时代,提高获取内容成本是对用户的一次体验升级。
变现价值能力,这是对于创作者的努力创造优质内容的原动力。这三者的高效配合形成一个正向循环齿轮,这样蛋糕就会越做越大。
我个人认为一个优秀的短视频平台需要具备以下3个方面:
(1).视频的实时性,热点性,个性化推荐
(2).检索提取干货信息,作为更高效的搜索引擎
(3).有娱乐性,实用学习性,传播性
2020年8月份科技部明确指出将基于数据分析的个性化服务推送服务技术列为限制出口名单,这必然会让大家联想到最近抖音海外版Tiktok的出售风波。因为推荐算法一般是根据海量app用户信息经过核心算法服务进行建模计算出来的。这里面包含大量用户隐私数据,核心算法技术积累,所以在目前初步人工智能时代,算法的重要程度在日益加重。
说到推荐算法则不得不说到机器学习,在抖音热门推荐区推荐的视频都是通过对每个用户进行建模后根据权重进行个性化推送的,平台也会通过计算点赞概率影响排序顺序,然后推荐给用户。用数学来表示的话:
针对已知用户,视频和环境和未知行为,比如点击去预测它产生的概率,这就是推荐算法的核心。
(1).特征X:用户,视频,环境
比如用户年龄就可以作为特征,根据不同年龄进行特定内容推送,越多的特征可以帮助更好的帮助我们去给他们挑选感兴趣的内容。更多的用户特征也可以从用户的手机型号,来自哪里,收藏内容标签,观看停留时间,兴趣标签;当然也可以从视频内容获取特征信息,视频标签,用户评论信息提取,视频类别,视频的平均点击率,弹幕内容,评论量,转发量;用户在什么样的环境中看到的视频,白天或者晚上,使用手机看到的还是电脑看到的。很多做推荐算法的工程师会花很多时间用在制作一些特征的工程,用机器去实现用户的标签或者视频内容的理解,这部分是构成了推荐算法很重要的一部分。等到我们的特征准备完毕,就可以作为我们的输入去送给我们的模型,也就是Fx函数。
(2).构建模型F(y|x)
目前主流市场上有2种模型,第一种是基于树的模型,就比如说决策树。在实际的推荐算法工程里,这个决策树模型可以制作得非常深,并且根据板块门类的划分也可能不止一颗树,可能是很多树构成,相关树之间通过关联主键进行连接,一起加权构成了一个决策树的森林,它们会合在一起去做一个推荐算法,模拟计算Fx函数。另一种模型是基于神经网络去做的一些数据的拟合。(模型见图1)
第二种是基于人工神经网络(ArtificialNeuralNetworks)简称连接模型(ConnectionModel),它是一种模仿动物神经网络行为的特征,进行分布式并行星系处理的算法数学模型。这种网络以考系统的复杂度,通过调整内部大量节点之间的相互关连的关系,从而达到处理信息的目的。神经网络是一种数据挖掘的方法,不仅可以使用与决策树大体相同的方式预测类别或分类,而且还能更好的确定属性之间的关联强度(模型见图2)。通常构建神经网络模型个人比较推荐RapidMiner,通过Excel或者DB导入各类不同属性的分类数据,比如医院里病人的血脂,体重,体温等各类指标数据,然后进行流程连接并设置条件,最终得出神经网络数据结果。
(3).制定目标Y
需要预测的位置行为Y指的就是推荐权重,通过一系列数据计算得出这类视频是否适合推荐给用户观看。
这也是很多短视频平台,一直以综合互动量为考核内容创作的最终指标。
机器学习算法其实就是普通算法的进化版。通过自动学习数据规律,让你的程序变得更聪明些。这里举一个生活中的案例说明这一点,某天你去买芒果,小贩摊了满满一车芒果,你一个个选好,拿给小贩称重,然后论斤付钱。自然,你的目标是那些最甜最成熟的芒果,那怎么选呢?你想起来,外婆说过,明黄色的比淡黄色的甜。你就设了条标准:只选明黄色的芒果。于是按颜色挑好、付钱、回家。
机器学习算法其实就是普通算法的进化版。通过自动学习数据规律,让程序变得更聪明些。那么如何让程序变得更聪明一些喃?则需要利用算法进行数据训练并在过程中对数据预测结果集进行效验。
根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。
在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见算法有逻辑回归(LogisticRegression)和反向传递神经网络(BackPropagationNeuralNetwork)
在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。
在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(GraphInference)或者拉普拉斯支持向量机(LaplacianSVM.)等。
在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporaldifferencelearning)
tiktok核心函数和怎样在切入切出虚拟摄像头时营造卡顿效果的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
