Blog

协同过滤算法的弊病

Content #

例如你会经常看到,你浏览手机之后购买了一个手机,但是接下来几周,某些电商网站里还是会坚持不懈地给你推荐手机,这是因为协同过滤不是针对你个体进行的推荐。同时,因为基于集体智慧,所以对于一些很冷门的商品来说,最初始的这些用户流量是需要有引导的,否则会导致有些很不错的商品一直放在角落里无人问津。这对一些优秀但冷门的产品,例如小制片人的电影其实就不是特别友好。

同样因为协同过滤只是考虑到了物品和用户之间的关系,没有考虑到用户所处的场景,所以推荐的内容可能就不太有效。例如在上班的时间给你去推荐一些餐厅,但你那个时候并不能去;你带着孩子出去游玩,开车的路上不停给你推荐一些课程,这其实都只是考虑到了用户之间物品之间的关系,没有考虑到场景这个点。这就需要数据分析师、算法科学家结合具体的业务场景和实际所有的数据再进行特殊的算法优化,这样协同过滤在场景当中才能有更高的使用性。

而使用协同过滤的算法最大的弊病在于,这个算法就像是一个溺爱你的妈妈,永远会给你想要的东西,它并没有价值观,你会被“惯”得越来越没有节制,把时间全都花费到各种各样的短视频、小文章、和你钟爱的小圈子里,但最终你并没有什么拓展和收获。它不是一个严肃的爸爸,能告诉你你应该去学什么、哪些价值观是对的,这些其实是协同过滤算法无法做到的,只有通过人的选择和经验才能告诉你,你应该去学什么,而不是拼命满足你自己的某些爱好。

Viewpoints #

From #

19 | 协同过滤:你看到的短视频都是集体智慧的结晶

Apriori算法思想

Content #

Apriori 的基本的逻辑其实不复杂,我把它称为“连坐算法”。我们的目标是去掉过多的组合,如果按个去统计有价值的组合,那么在所有组合中有关联性的组合会有如下逻辑:

  1. 如果一个组合是频繁组合,则它所有的非空子集也是频繁组合——连坐,一家子都是明星组合,任何跳出来两个人也都是明星组合;

  2. 如果一个非空组合是非频繁组合,则其所有的父集也是非频繁组合——连坐,如果有一个人不是明星,他和谁组合都不会是明星组合。

例如,如果 123 是频繁组合,则 12、13、23 也是频繁组合;若 12 是非频繁组合,则 123 也是非频繁组合,即其他数据集里只要含 12 都可直接判定其为非频繁组合。这种方法能够帮我们去掉很多没有必要测试的组合。这样我们再去分析余下组合的支持度和置信度,就可以得到我们的最终要的规则了。

Apriori 算法的优点是可以产生相对较小的候选集,而它的缺点是要重复扫描数据库,且扫描的次数由最大频繁项目集中项目数决定,因此 Apriori 适用于最大频繁项目集相对较小的数据集中。后续的 FP-growth 算法修正了这些问题。

Viewpoints #

From #

16 | 关联规则:为什么啤酒和尿布一起卖?

支持度、置信度、提升度

支持度(support) #

某个商品组合出现的次数与总次数之间的比例,也就是这个商品组合整体发生的概率怎样。

5 次购买,4 次买了啤酒,啤酒的支持度为 4/5=0.8; 5 次购买,3 次买了啤酒 + 尿布,啤酒 + 尿布的支持度为 3/5=0.6。

置信度(confidence) #

购买了商品 A 后有多大概率购买商品 B,也就是在 A 发生的情况下 B 发生的概率是多少。

买了 5 次啤酒,其中 2 次买了尿布,(尿布→啤酒) 的置信度为 2/5=0.4;买了 4 次尿布,其中 2 次买了啤酒,(啤酒→尿布) 的置信度为 2/4=0.5。

提升度(lift) #

衡量商品 A 的出现对商品 B 的出现概率提升的程度,A 和 B

提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)。

提升度 >1,证明 A 和 B 的相关性很高,A 会带动 B 的售卖;

提升度 =1,无相关性,相互没作用;

提升度 <1,证明 A 对 B 有负相关,也就是这两个商品有排斥作用,买了 A 就不会买 B。

...

强符号与弱符号

Content #

Linux链接器所谓的“强符号”包括哪些?

  1. 函数。
  2. 已初始化的全局变量。

Linux链接器所谓的“弱符号”包括哪些?未初始化的全局变量。

ssh端口转发实例

Content #

从Ringo主机通过forwarded connection去查询John主机上的LDAP服务器,创建 forward connection的命令该怎么写?

stahnke@ringo: ~> ssh -L12345:john:389 paul

www服务器上有23号端口的telnet服务,要在rack主机上通过ssh隧道来访问 telnet服务,请问在www主机上该怎样建立隧道?

ssh -R12345:www:23 rack

www服务器上有23号端口的telnet服务,要在rack主机上通过ssh隧道来访问 telnet服务,请问在rack主机上该怎样建立隧道?

ssh -L12345:localhost:23 www

改变正在运行的sshd服务器的配置

Content #

要改变正在运行的sshd服务器的配置,但又不想重启它(重启会导致已有的连接丢失),可以怎么做?

1.修改配置,测试配置文件的正确性。 2.向sshd进程发送HUP信号。

kill -HUP `lsof -t -c sshd`

ssh拷贝文件,远程需要sudo

Content #

拷贝本机文件到远程主机上,用户在远程主机的目标路径上没有写权限,必须借助于sudo来完成,如何用一条命令来实现?

cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"
cat local.conf | ssh user@server 'sudo bash -c "cat - > /etc/local.conf"'