浅入浅出:PageRank算法 使用 TextRank 算法为文本生成关键字和摘要 基于物品的协同过滤 如何使用MapReduce实现基于物品的协同过滤(1) 如何使用MapReduce实现基于物品的协同过滤(2) 浅入浅出:K近邻算法 使用mahout下的朴素贝叶斯分类器对新闻分类 使用Affinity Propagation进行聚类 K-medoids聚类 矩阵分解在推荐系统中的应用:NMF和经典SVD实战 使用特征递归消除筛选特征 如何分配权重 比较NMF、PCA和VQ 方差和协方差 基于SVD的协同过滤 逻辑斯谛回归代码实现 隐语义模型和NMF(非负矩阵分解) 使用PCA处理MNIST数据集 使用GBDT选取特征 基于贝叶斯的文本分类系统的数据库设计 在hadoop1.2.1上安装mahout 0.9 Hadoop 2.4 实现Kmeans聚类算法 在Iris数据集上对比PCA、LDA、NMF 基于贝叶斯的文本分类实战 单层决策树 Logistic regression(逻辑斯蒂回归) 基于用户的协同过滤 词袋模型与文档-词矩阵 如何实现拼音与汉字的互相转换 梯度下降法 如何判定相似度 MovieLens数据集介绍 基于KNN的文本分类实战 Jasper文本分类系列博客阅读摘录 使用 Mean Shift进行聚类 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 使用决策树处理iris数据集 浅入浅出:从Kmeans到Kmeans++ 如何持久化scikit-learn中训练好的模型 浅入浅出:DBSCAN聚类算法(1) 浅入浅出:DBSCAN聚类算法(2) 2015阿里移动推荐算法比赛第一赛季总结 爬山算法 使用朴素贝叶斯分类器划分邮件 层次聚类 基于MapReduce的频繁项集挖掘 搜狗实体关系提取比赛

如何分配权重


#机器学习


2014-03-27

基于用户的协同过滤基于物品的协同过滤 中在使用加权平均值方法时都有提到将相似度看作是权重。事实上基于欧几里得距离的相似度(或者说基于欧几里得距离的权重)的生成有多种方法。这些方法都是基于常见的递减函数

反函数

y=1/x便是反函数,但是考虑到距离为0以及权重应在一个有限范围内,便改写为y = 1/(1+x)

减法

如果距离是x,则权重为y=b-x,其中b是常数且为正数。如果y的值小于0,则y置为0;y不小于0,则保持原值。

高斯函数

资料[1]中给出了高斯函数的公式:

在实际应用中,多将a设为1,b设为0,这样f(x)x>=0时,将从1开始递减,但不会跌向0。c的值根据喜好和需求设定即可。

代码实现与总结

#-*-encoding:utf-8-*-
import math
def get_euclidean_distance(dot1, dot2):
    ''' 根据欧几里得距离判断相似性'''
    s = sum([pow(dot1[x] - dot2[x], 2) for x in range(len(dot1))])
    return math.sqrt(s)

def inverse_weight(distance):
    ''' 基于反函数的权重'''
    return 1.0 / (1.0 + distance)

def subtraction_weight(distance):
    ''' 基于减法的权重 '''
    result =  10.0 - distance
    if result < 0:
        return 0
    return result

def gaussian_weight(distance):
    ''' 基于高斯函数的权重 '''
    return math.e**(-distance**2 / 3.0**2)

if __name__ == '__main__':
    dot1 = [1, 1.2, 5]
    dot2 = [2, 1.2, 3]
    distance = get_euclidean_distance(dot1, dot2)
    print inverse_weight(distance)
    print subtraction_weight(distance)
    print gaussian_weight(distance)

运行结果如下:

0.309016994375
7.7639320225
0.573753420737

自然,这些方法不只能用在欧几里得距离上,还可以推而广之。

资料

[1] http://zh.wikipedia.org/wiki/高斯函数



( 本文完 )