阿里大数据竞赛(天猫推荐算法)

莫名其妙搞了这个比赛(戳这里看比赛内容)

然后被虐得生活不能自理 ...开始还能排到top80

现在都要掉出Top500了

感觉到了瓶颈木有提升空间

就放弃治疗了

就把我的一些思路&想法记录下来吧


比赛大致内容是 给你几个月的封装后的数据(用户对品牌的一些操作行为的记录)推测下一个月用户可能会购买神马

因为字段都是加密过的(其实就是用户和品牌都是用ID表示)

这样就无法考虑用户之间和品牌之间的相互作用

这种情况下我们来考虑用户A是否会购买品牌X的商品只需要考虑之前用户A对品牌X的操作行为就好

这一点应该很容易想到

然后实现这一点的话大部分人的第一反应应该都是把用户和品牌都给Hash掉吧...(好吧我的第一反应是这个...不知道大家是怎么样)

然后我仔细想了想 发现Hash其实是不必要的

我们只需要按用户和品牌双关键字排序就好 这样逐记录处理即可(你当前处理的操作记录中的用户和品牌和上一条不一样就说明之前的处理完了)

再考虑到方便输出 就令用户为第一关键字,品牌为第二关键字


现在就该考虑如何判断用户A是否会购买品牌X的商品了

我的想法是 给予每个操作行为类型一个权值k,再乘上一个与时间相关的函数f(t)

当用户A对品牌X的所有操作的 k*f(t) 之和大于某一特定值L时 就认为A会买X了

函数f(t)应该是这个操作行为越久远对现在的影响就越小 突然就想到了记忆曲线这玩意儿了...然后就用了个e为底的指数函数拟合了

再之后就是考虑系数k和特定值L的确定了

因为我对这一方面没有任何知识储备...弄大数据预测也是第一次...

系数的确定就只能凭感觉了>。<

L的确定其实还算好弄

我们可以将给我们的数据分成两部分 用前一部分的作为输入来预测后一部分的 再写个程序来计算召回率和准确率及最终成绩F1

(因为给的数据是4.15到8.15的,需要我们预测的是接下来一个月的,所以我取4.15到7.15为输入来预测7.16到8.15的)

再根据我的直观认为 K确定的情况下,以F1为纵坐标,L为横坐标的函数图像应该是先上升后下降的

我就确定了一种寻找近似峰值点的方法...代码描述如下:

double L=0,ind=0.5;
double now,next;
now=f1(L);
while(true)
{
	back:next=f1(L+ind);
	if (next

f1(L)函数即上文中根据4.15到7.15内的数据来预测7.16到8.15的所得的F1

ind的初值越大找到极值点的速度越快,但是越容易越过去...

第十行的判断语句中的0.001是精度


这样一来我们就能在系数K确定的情况下获得一个较优的L值了


然后我的比赛历程就死在这里了...>。<

默哀...

你可能感兴趣的:(阿里大数据竞赛(天猫推荐算法))