作者:潘一鸣
本文在PMCAFF社区发布(www.pmcaff.com),转载请注明作者及出处。
引子
开一个新系列吧,算法的通俗解释,目标是希望没有公式的情况下,尽可能解释算法原理。
本公众号染上了挖更的恶习,已有系列更新缓慢又开新坑。最近业余时间都在《刺客信条:英灵殿》中帮助维京人征服英格兰,公众号已经变成周更了,我检讨,但让我努力更新的话,得等我势力遍布英格兰,杀了魔狼芬里尔。
新系列也不是空穴来风,本来想更新策略产品经理二三事系列的推荐系统部分,感觉不能就讲协同过滤这种简单算法,而目前用的比较多的算法底层都是一堆高数公式,读者没法看。所以为了更这个系列,我感觉有必要先开一个系列通俗地讲一讲算法。
而且这一两年我和这个互联网世界慢慢和解了,之前我觉得公司相关人员不懂算法是他们蠢,他们应该闭嘴看我表演。后来发现,要推动一个系统发展,解释性远比算法效率重要。而且往往解释性强的方法,系统的泛化能力也更强。
当前的互联网行业里,在不懂算法的人眼里,算法就是魔法。可是毕竟这是个麻瓜占据多数的世界,如果能通俗解释算法,也是一个不错的尝试。
四大名著也有少儿简化版,高中物理也在不引入微积分的情况下把原理都讲了,算法也未尝不能科普。
于是有了这个系列。
一个大的原则就是:一般不放公式,除非逼不得已,如果一定要放,公式复杂度不超过初中的运算。
那么,这一期就从基本概念开始吧。
特征
如果你的工作需要和算法系统打交道,那么想必你一定听过特征这个词。
特征的通俗理解就是一类事物某个维度的值,群体中的每个个体在这个维度上可能有不同的值。比如人的性别、民族、身高就是典型的特征。一般而言性别只分男女(LGBT团体对不起!),因为是两个取值,在数据上可以用布尔值表示,还有一些类似的取值为”是否“和”有无“的特征——是不是会员,有没有下载客户端。民族是一个分类值,就是有分类但是分类的值只是区分,没有大小之分,各民族平等。身高是典型的连续值,有零有整的数。当然除此之外还有别的数据类型,比如取值表示等级的游戏段位,一个维度的不同类别之间有相对大小关系。
当我们有了越来越多的特征,对一个事物的描述就越具体。但是这并不意味着特征越多越好。有的时候新增的特征并没有什么用,可能是因为这个因素本身对于具体的问题不重要,或者就是因为这个特征和已有特征完全相关。
没什么用可以理解,比如预测外卖员的准时程度和外卖员的星座就应该没啥关系。
为了解释特征完全不相关,引入一个新概念——相关性。在线性代数里面会描述向量之间的相关性,如果一个向量可以被某几个其他向量用线性组合的方式表示,则可以认为这个向量和其他向量线性相关。一个特征如果可以被其他特征组合表示的话,也可以认为这个特征和其他特征完全相关。
完全相关是我造出来的概念,相关性一般有大小关系,完全相关代表新的特征可以用老的特征完全造出来,因为现在算法不是只用到线性关系,所以我们也不要求是新特征需要老特征用线性组合表示,只要是老特征能推导出新特征,新特征就和老的特征完全相关。
这里有点绕,举个例子。比如身高和体重都是人的特征,BMI( 身体体重指数)也是人的特征,但是BMI就和身高、体重这两个特征完全相关,因为,BMI=体重(千克)除以身高(米)的平方。对于算法而言,如果需要用BMI的特征做计算,算法在理论上不需要引入BMI这个新的特征。
信息量
信息量也是一个大家常说的词,香农给出了一个准确的定义以及数学表达。这里不展开这部分精确的描述。仅仅谈一些通俗的解释和理解。
我们平时说一个事件信息量大,一般是说,这个事件罕见、影响大、对之前的认知有很大的改变。这些感觉实际上和信息量的基本定义基本吻合,信息量就是描述不确定性降低的程度。
当我们不知道一个人的某些事情时,我们对这个人的了解有很大的不确定性,如果知道了这个人的一些八卦,我们对这个人认知的不确定性就降低了,我们就可以说,这些八卦信息量大。
在实际工作用中,孤立地讨论信息量意义不大,一般都是需要一些比较。
“引入了某个信息量很大的特征之后,模型效果提升明显。“这里的信息量是对特征的修饰,代表着引入了这个特征,提高了模型预估的准确性,降低了算法预估的不确定性。
“特征A的信息量比特征B的信息量更大。”这里是引入特征A和引入特征B相比,引入特征A对于模型效果提升更加明显。
”引入新特征效果不明显,新特征信息量几乎为零。“这里的意思是新的特征中蕴含的信息在老的特征中已有,所以引入新的特征没有意义。
这里讨论信息量主要围绕特征展开,上面提到的新特征和老特征完全相关,也是因为新特征没有给系统带来新的信息量。
之所以提这个概念,是希望大家有一个新的视角。我在考虑各种算法系统的时候,都是在用信息量的视角去思考的,哪些处理可以更好利用信息量,哪些数据引入可以更大程度提高信息量。
特征工程
虽然在理论上引入一些完全相关的特征对于模型没有影响,但大部分算法并不能完全开发出信息量。所以就我们上面的例子讨论,比如预测人的一些消费习惯,在有身高、体重的情况下,引入BMI可能依旧有意义。
与此同时,虽然在理论上加入特征越多,系统信息至少不会减少,对算法有益。但是算法在引入特征时,不仅仅接入了特征中的信息,同时也接受了无效信息,而这会给算法带来误差。所以对于算法而言,减少无效特征会提升算法模型的效率。
对于原始的数据特征进行各种参数处理,让特征中的信息量更容易被系统挖掘,这一系列的方法叫做特征工程。就像是从金矿中冶炼好金子一样,粗加工去除杂质非常重要。这样的预处理对于算法的效果意义重大。
这个领域有一句有名的话——”More data beats clever algorithms, but better data beats more data“,更多的数据打败聪明的算法,更好的数据打败更多的数据。这也是在强调特征工程的重要性。
而特征的选取和处理是数据分析和业务理解之后的结果,并不一定非得是算法工程师的工作,也可以数据分析师或者产品经理去做。但一切的前提,都是这个角色的人能够对算法、数据、产品有足够深入的理解。
最后:
通俗意味着没有采用最准确的描述,同时算法这个部分我本身也就是泥腿子,水平有限如有错误,欢迎留言纠正。
如果有没写清楚的也欢迎交流。
这个系列的下一篇主要聊算法系统的评价。
网友评论