1.前言
一直想给自己的网站文章做个排行功能,比如按热门排序,或者按某种推荐算法的计算结果来排,怎么做呢?
考虑了下有可以以从这么几个关联的纬度来计算,发布时间,点击率,评论数,文章类型等等。
那么发布时间越近,点击评论越高,有深度的文章应该排前面。
2.原始数据
假设有这么三篇文章
A,发表于2014年7月,点击400,评论0,类型为随笔
B,发表于2015年7月,点击200,评论5,类型为技术
C,发表于2016年7月,点击100,评论10,类型为感想
时间以2014.7为起点,单位为月,得到发表时间纬度的分值;以技术3,感想2,随笔1给类型打分,我们得到了以下原始数据。.
time = [0, 12, 24]
click = [400, 200, 100]
comment = [0, 5, 10]
type = [1, 3, 2]
但,这4组数据单位不同,如何做统计呢,还好大学的数学知识还有点印象,我想到了一个词归一化,马上去查了下资料,果真有这么个玩意,可以消除数据统计中量纲或者说单位不同导致处理上的困难,终于想起来了这个统称的词叫数据标准化。
3.标准化算法
标准化算法有多种,常见的是线性函数归一化和Z-score标准化,还有其他的一些非线性的,如log、指数,正切,以及特征归一化等等,这里列出常见的两种。
3.1.线性函数归一化(Min-Max scaling)
将原始数据经线性函数等比缩放到[0 1]的范围:
3.2.标准分数(Z-score standardization)
0均值归一化方法将原始数据集归一化为均值为0、方差1的数据集:
其中,μ、σ分别为数据集的平均值和标准差。该方法要求原始数据的分布可以近似为正态分布。
突然发现我连标准差的计算公式都忘了,太久没用数学了。标准差定义是总体各单位标准值与其平均数离差平方的算术平均数的平方根
当然这两种归一化的应用场景有所不同:
1、在不涉及距离度量、协方差计算、数据不符合正态分布时,可以使用第一种方法。比如这次我要做的文章评分排行就是需要将所有分类纬度缩放到同一范围。
2、在分类、聚类算法中,需要使用距离来度量相似性的时候、数据近似正态分布,Z-score更好。
4.实现及计算
4.1.线性归一化实现
这次不用搞复杂的方式了,直接线性归一化好了,
public static void normalization(double [] arr){
double max=arr[0],min=arr[0];
for (int i = 1; i < arr.length; i++) {
max=arr[i]>max?arr[i]:max;
min=arr[i]>min?arr[i]:min;
}
double v = max - min;
for (int i = 0; i < arr.length; i++) {
arr[i]=(arr[i]-min)/ v;
}
}
4.2.排行分数计算
标准化结果如下
time = [0.0, 0.5, 1.0]
click = [1.0, 0.3333333333333333, 0.0]
comment = [0.0, 0.5, 1.0]
type = [0.0, 1.0, 0.5]
当然,实际分数还可以做个加权什么的,比如我想让类型分数占得比重更大之类,这个就很简单了。
把四项分数相加,或者乘以加权系数相加就得到排行分数了。
5.结语
这个算法还是很简单的,但突然发现自己竟然连一个标准差的计算公式都给忘了,离开数学太远了,想到了一本书《数学之美》,也许应该看看了。
作者:初龙
本文由MetaCLBlog于2017-07-17 09:18:20自动同步至cnblogs
本文基于 知识共享-署名-非商业性使用-禁止演绎 4.0 国际许可协议发布,转载必须保留署名及链接。