用户相似性度量

PearsonCorrelationSimilarity(皮尔逊相关系数)
原理:度量两个意义对应数列之间的线性相关程度,即度量两个数列中数字一起增大或一起减小的可能性。
场景:用于度量两个用户之间的相似性,度量两个用户针对同一物品的偏好值变化趋势的一致性。
优点:结果直观。
缺点:没有考虑到两个用户同时给出偏好值的数目。解决办法:引入权重,即加权。
          例如,两个用户如果同时对200件物品给出偏好值,可能更比两个用户仅同时对2件物品给出偏好值更相似。
          mahout in action 中1和5(同时对三件物品给出偏好值)的系数却比1和4(同时对两件物品给出偏好值)的相似度系数低

UncenteredCosineSimilarity(非中心化余弦距离相似度。中心化余弦距离相似度即皮尔逊相关系数)
原理:非中心化 的余弦距离。多维空间中两点与指定点之间的夹角,夹角越小越相似
缺点:没有考虑到两点之间的空间距离。例如,两个点之间的夹角度数较小,但空间距离较大,
          其算出来的相似度会比夹角大而空间距离更小的两个点的相似度更高。

TanimotoCoefficientSimilarity(谷本距离相似度)
原理:两个集合的交集闭上两个集合的并集(jaccard系数)
场景:当偏好值为布尔类型或没有偏好值时使用

LogLikelihoodSimilarity(对数似然比)
原理:类似于基于谷本系数的相似度。可以理解为两个用户发生重叠的非偶然概率。
场景:不考虑具体偏好值的度量方法。
          例如:假如两个用户都看过上百部电影,其中只有两部是共同看过的,则认为相似度非常小。
                     假如两个用户看过的电影数都非常少,其中有两部是共同看过的,则两者的相似度就较高,重叠占的比重大。
          对数似然比度量的是判断两个用户口味不相似的不可能性有多大,值越大,两个用户越相似。
优点:比谷本系数的相似度更智能。

SpearmanCorrelationSimilarity(斯皮尔曼相关系数)
原理:皮尔逊相关系数的一个变体,它是将原始的偏好值进行排名,然后再使用皮尔逊相关系数算法。
缺点:计算量非常大,大量的排序工作。推荐系统不适合使用。

EuclideanDistanceSimilarity(欧式距离相似度)
原理:利用欧式距离定义的相似度:s=1/(1+d)
优点:皮尔逊相关系数无法计算出两者相似度时可用欧式距离求出相似度。
缺点:基于同一个物品得到的结果不可靠

CityBlockSimilarity(曼哈顿距离相似度)
原理:类似于欧式距离,用于多维数据空间距离的测度
优点:比欧式距离计算量少,更智能。
   

总结
适用于带有偏好值的数据:
PearsonCorrelationSimilarity、 UncenteredCosineSimilarity、 SpearmanCorrelationSimilarity、 EuclideanDistanceSimilarity、
CityBlockSimilarity
适用于无偏好值的数据: TanimotoCoefficientSimilarity、 LogLikelihoodSimilarity、 CityBlockSimilarity


代码:
/***
	 * 用户相似度组件
	 * @param type
	 * @param dataModel
	 * @return
	 * @throws TasteException
	 */
	public UserSimilarity userSimilarityModel(SIMILARITY type,DataModel dataModel) throws TasteException{
		switch(type){
		case PEARSON :
			//原理:度量两个意义对应数列之间的线性相关程度,即度量两个数列中数字一起增大或一起减小的可能性。
			//场景:用于度量两个用户之间的相似性,度量两个用户针对同一物品的偏好值变化趋势的一致性。
			//优点:结果直观。
			//缺点:没有考虑到两个用户同时给出偏好值的数目。解决办法:引入权重,即加权。
			//	       例如,两个用户如果同时对200件物品给出偏好值,可能更比两个用户仅同时对2件物品给出偏好值更相似。
			//     mahout in action 中1和5(同时对三件物品给出偏好值)的系数却比1和4(同时对两件物品给出偏好值)的相似度系数低
			return new PearsonCorrelationSimilarity(dataModel);
		case COSINE :
			//原理:非中心化 的余弦距离。多维空间中两点与指定点之间的夹角,夹角越小越相似
			//缺点:没有考虑到两点之间的空间距离。例如,两个点之间的夹角度数较小,但空间距离较大,其算出来的相似度会比夹角大而空间距离更小的两个点的相似度更高。
			return new UncenteredCosineSimilarity(dataModel);//余弦距离相似度
		case TANIMOTO :
			//原理:两个集合的交集闭上两个集合的并集(jaccard系数)
			//场景:当偏好值为布尔类型或没有偏好值时使用
			return new TanimotoCoefficientSimilarity(dataModel);//谷本距离相似度
		case LOGLIKELIHOOD :
			//原理:类似于基于谷本系数的相似度。可以理解为两个用户发生重叠的非偶然概率。
			//场景:不考虑具体偏好值的度量方法。
			//	       例如:假如两个用户都看过上百部电影,其中只有两部是共同看过的,则认为相似度非常小。
			//	       假如两个用户看过的电影数都非常少,其中有两部是共同看过的,则两者的相似度就较高,重叠占的比重大。
			//对数似然比度量的是判断两个用户口味不相似的不可能性有多大,值越大,两个用户越相似。
			//优点:比谷本系数的相似度更智能。
			return new LogLikelihoodSimilarity(dataModel);//对数似然系数
		case SPEARMAN :
			//原理:皮尔逊相关系数的一个变体,它是将原始的偏好值进行排名,然后再使用皮尔逊相关系数算法。
			//缺点:计算量非常大,大量的排序工作。推荐系统不适合使用。
			return new SpearmanCorrelationSimilarity(dataModel);//斯皮尔曼相关系数
		case CITYBLOCK :
			//原理:类似于欧式距离,用于多维数据空间距离的测度
			//优点:比欧式距离计算量少,更智能。
			return new CityBlockSimilarity(dataModel);//曼哈顿距离相似度
		case EUCLIDEAN :
		default:
			//原理:利用欧式距离定义的相似度:s=1/(1+d)
			//优点:皮尔逊相关系数无法计算出两者相似度时可用欧式距离求出相似度。
			//缺点:基于同一个物品得到的结果不可靠
			return new EuclideanDistanceSimilarity(dataModel);//欧氏距离相似度
		}
	}



你可能感兴趣的:(mahout)