美文网首页
相似度计算和p-value

相似度计算和p-value

作者: wong小尧 | 来源:发表于2017-10-11 09:46 被阅读0次

推荐系统中的itembased和userbased协同过滤算法在计算评分时需要用到相似度计算。
记录几个常见的相似度计算代码
引用自【机器学习实战】

import numpy as np  
from numpy import linalg as la  
  
#欧式距离1
import math
#假设p1,p2维度相同
def EuclidSimilarity(p1,p2):
    sum_of_squares = sum([pow(p1[i] - p2[i] , 2) 
    for i in range(0,len(p1))])
##未归一化
    return math.sqrt(sum_of_squares)
##归一化
    return 1/(1+math.sqrt(sum_of_squares))
#欧式距离2
def euclidSimilar(inA,inB):  
    return 1.0/(1.0+la.norm(inA-inB))  
#皮尔逊相关系数  
def pearsonSimilar(inA,inB):  
    if len(inA)<3:  
        return 1.0  
#把值域[-1,1]缩放到[0,1]
    return 0.5+0.5*np.corrcoef(inA,inB,rowvar=0)[0][1]  
#余弦相似度  
def cosSimilar(inA,inB):  
    inA=np.mat(inA)  
    inB=np.mat(inB)  
    num=float(inA*inB.T)  
    denom=la.norm(inA)*la.norm(inB)  
    return 0.5+0.5*(num/denom)  

欧氏距离公式:


欧氏距离公式

在日常使用中,一般习惯于将相似度与1类比,相似度在数值上反映为0<=Similarity(X,y)<=1,越接近1,相似度越高;那么我们在使用欧几里得距离时,可以通过 1/(1+Distance(X,Y))归一化。
皮尔逊相关度计算 PearsonSimilarity:
协方差代表了两个变量之间的是否同时偏离均值。
cov(X, Y) = E(X-EX)(Y-EY)= E(XY)-E(X)E(Y)
当 cov(X, Y)>0时,表明 X与Y 正相关;
当 cov(X, Y)<0时,表明X与Y负相关;
当 cov(X, Y)=0时,表明X与Y不相关。

计算:
Xi 1.1 1.9 3
Yi 5.0 10.4 14.6
E(X) = (1.1+1.9+3)/3=2
E(Y) = (5.0+10.4+14.6)/3=10
E(XY)=(1.1×5.0+1.9×10.4+3×14.6)/3=23.02
Cov(X,Y)=E(XY)-E(X)E(Y)=23.02-2×10=3.02 协方差计算
标准差计算:
方差:D(X)=E(X2)-E2(X)=(1.12+1.92+32)/3 - 4=4.60-4=0.6 开根号的标准差 σx=0.77
方差:D(Y)=E(Y2)-E2(Y)=(52+10.42+14.62)/3-100=15.44 σy=3.93
X,Y的相关系数:
协方差/(标准差X*标准差Y)
r(X,Y)=Cov(X,Y)/(σxσy)=3.02/(0.77×3.93) = 0.9979

实际应用中大部分相似度计算还是调用sklearn,scipy中的包,一方面是速度原因,另一方面是自己写的相似度度量通常是两两比对,包中的度量是返回一个相似度矩阵,可以同时快速计算多个特征的相似度,下面列举一些相似度以及一些例子:

##余弦相似度,返回一个相似度矩阵,即对角线为1的矩阵
## sklearn.metrics.pairwise中定义:相似度 = 1 - 距离
#例如:余弦相似度 = 1 - 余弦距离
from sklearn.metrics.pairwise import pairwise_distances
row_similarity =1 - pairwise_distances(R, metric='cosine')
column_similarity =1 - pairwise_distances(R.T, metric='cosine')

##欧氏距离
from sklearn.metrics.pairwise import pairwise_distances
row_similarity = pairwise_distances(R, metric='euclidean')
column_similarity = pairwise_distances(R.T, metric='euclidean')

##通过修改参数metric来改变度量方式:
##metric =[ 'euclidean', 'l2', 'l1', 'manhattan', 'cityblock', 'braycurtis', 'canberra', 'chebyshev', 'correlation', 'cosine', 'dice', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'yule', 'wminkowski']

##皮尔逊相关系数
#又叫皮尔森卡方检验,这是一种最常用的卡方检验方法,它有两个用途:
#1是计算某个变量对某种分布的拟合程度,
#2是根据两个观测变量的[Contingency table]来计算这两个变量是否是独立的。
#主要有三个步骤:
#第一步用方差和的方式来计算观测频率和理论频率之间卡方值;
#第二步算出卡方检验的自由度(行数-1乘以列数-1);
#第三步比较卡方值和对应自由度的卡方分布,判断显著性

from sklearn.metrics.pairwise import pairwise_distances
#行和行之间的相关系数
row_similarity =1 - pairwise_distances(R, metric='correlation')
#列和列之间的相关系数
column_similarity = 1 - pairwise_distances(R.T, metric='correlation')
#或者:
from scipy.stats import pearsonr  
a = pearsonr(x, y)
#scipy中的pearsonr函数返回皮尔逊相关系数和p-value,相关性越强,p-value越低
#p-value只是用来说明是否有相关性,p-value<0.05,就存在相关性,并不是越小越好
##或者:
#列和列之间的相关系数
df.corr()
#行和行之间的相关系数
df.T.corr()
##用sklearn中的f_regression可以批量计算
#批量计算F_score,p_value:
#计算df中第一列(df[0])和整个df每列的F_score,p_value
F_score,p_value = f_regression(df, df[0])

p-value:

上面的皮尔逊相关度中用到了p-value 和F score, 下面简单介绍p-value。
p-value只是用来说明是否有相关性,p-value<0.05,就存在相关性,并不是越小越好,如果p-value<0.05时第一个值绝对值较大,这两个返回值一起表明有较强相关性。p值不是完全可靠的。
p-value就是为了验证假设和实际之间一致性的统计学意义的值,即假设检验。有些地方叫右尾概率,根据卡方值和自由度可以算出一个固定的p-value。
sklearn f_regression文档:

sklearn.feature_selection.f_regression(X, y, center=True)

一元线性回归测试:
线性模型用于检验每一个回归的个体效应。这是一个在特征选择过程中使用的评分函数,而不是独立的功能选择程序。
这是在两个步骤中完成的:
每个回归和目标之间的关联计算,即,((X[:, i] - mean(X[:, i])) * (y - mean_y)) / (std(X[:, i]) * std(y)).
它被转换成F score,再转化成p-value。

Parameters: 
X : {array-like, sparse matrix} shape = (n_samples, n_features)
将按顺序进行测试的一组回归器。

y : array of shape(n_samples).
一个array维度为样本数n,需要计算的数据矩阵

center : True, bool,
如果选择True,X和y将被中心化。
(矩阵中心化是使用数据减去数据的均值,其实就是一个平移的过程,平移后所有数据的中心是(0,0),将所有维度上的数据减去其均值后,数据变成均值为0的较为稳定的数据(必要时还可进行标准化),此时进行计算,则不同维度之间的数据相差不会太大,可以有效降低误差,提高准确率。)

Returns:    
F : array, shape=(n_features,)
特征的F score

pval : array, shape=(n_features,)
F-scores 的p-values 

相关文章

  • 相似度计算和p-value

    推荐系统中的itembased和userbased协同过滤算法在计算评分时需要用到相似度计算。记录几个常见的相似度...

  • 计算句子相似度

    计算句子相似度,①常用方法有基于语义和词序相似度计算方法,②基于关系向量模型基于语义和词序的句子相似度计算方法简介...

  • senLDA实践—长短文本相似度

    背景:计算短文本与长文本的相似度,如在搜索场景中,计算query和doc的相似度,用于排序。 经过调研,找到百度的...

  • p-value&q-value&FDR

    P-value 的计算方式 1) P-value 是 (在H0 = true的情况下)得到和试验数据一样极端(或更...

  • NLP详解

    (一)余弦相似度、向量空间模型 1、相似度 • 相似度度量:计算个体间相似程度• 相似度值越小,距离越大,相似度值...

  • 图像相似度计算

    利用直方图特征计算图像之间的相似度,得到相关矩阵

  • 文章相似度计算

    算法思路 首先看个简单的例子: 句子A: 我喜欢看电视,不喜欢看电影句子B: 我不喜欢看电影,也不喜欢看电视 基本...

  • SNN相似度计算

    共享最近邻相似度SNN原理 如果向个点都与一些相同的点相似,则即使直接的相似度度量不能指出,我们也认为他们相似。 ...

  • 相似度计算统计

    在计算跨语种文本相似度的过程,部分统计数据展示在这里。 耗时25分钟,处理中文130句,英文190句。 计算...

  • 句子相似度计算

    思路一:先求句向量,然后求余弦相似度 1.求得两个句子的句向量 生成文本词频向量用词频来代替,句子,当然这样做忽略...

网友评论

      本文标题:相似度计算和p-value

      本文链接:https://www.haomeiwen.com/subject/sfjuyxtx.html