17

我做一个社区网站,需要我计算任意两个用户之间的相似性。每个用户都具有以下属性的描述:方法来计算相似度

年龄,皮肤类型(油性,干性),毛类(长,短,中),生活方式(积极的户外爱好者,电视毫无价值)等。

谁能告诉我如何去了解这个问题,或者我指向一些资源?

+2

相关:http://stackoverflow.com/questions/3007790/finding-the-closest-match/3007816#3007816 – Betamoo 2010-06-09 17:03:30

回答

2

你或许应该看一看的

帖Ë主题将让你的程序识别的相似性和集群在你的用户收集和尽量去适应他们。

然后,您可以了解不同的隐藏的公共组相关用户的...(即用户绿色的头发通常不喜欢看电视。)

作为一个建议,尽量使用现成的工具来实现此功能,而不是自己实现它的...
Open Directory Data Mining Projects

3

看看给每个属性一个适当的重量,并添加值之间的差异。

enum SkinType 
    Dry, Medium, Oily 

enum HairLength 
    Bald, Short, Medium, Long 

UserDifference(user1, user2) 
    total := 0 
    total += abs(user1.Age - user2.Age) * 0.1 
    total += abs((int)user1.Skin - (int)user2.Skin) * 0.5 
    total += abs((int)user1.Hair - (int)user2.Hair) * 0.8 
    # etc... 
    return total 

如果你真的需要相似而不是差异,用1/UserDifference(a, b)

0

看算法计算srting差异。它与你所需要的非常相似。将您的属性存储为位串并计算字符串之间的距离

14

另一种计算方法(在R中)计算数据集中观察值之间的所有成对不相似度(距离)。原来的变量可能是混合型的。通过使用Gower的一般相异系数(Gower,J.C。(1971)A general coefficient of similarity and some of properties,Biometrics 27,857-874)来实现标称,有序和(a)对称二进制数据的处理。更多检查this on page 47。如果x包含这些数据类型的任何列,则将使用高尔系数作为度量。

例如

x1 <- factor(c(10, 12, 25, 14, 29)) 
x2 <- factor(c("oily", "dry", "dry", "dry", "oily")) 
x3 <- factor(c("medium", "short", "medium", "medium", "long")) 
x4 <- factor(c("active outdoor lover", "TV junky", "TV junky", "active outdoor lover", "TV junky")) 
x <- cbind(x1,x2,x3,x4) 

library(cluster) 
daisy(x, metric = "euclidean") 

你会得到:

Dissimilarities : 
     1  2  3  4 
2 2.000000       
3 3.316625 2.236068     
4 2.236068 1.732051 1.414214   
5 4.242641 3.741657 1.732051 2.645751 

如果您有兴趣对降维分类数据的方法(也是一种方式来安排变量为均匀的簇)检查this

+0

'“高尔的距离”是由度量选择“高尔“或自动如果一些x的列不是数字的(?cluster :: daisy),所以你不必传递”metric“ - 这是令人困惑的。 – 2017-04-25 14:37:29

1

三个步骤实现两个数据点之间的差异的简单主观指标,可以在您的cas中正常工作E:

  1. 捕获的代表性数值变量所有变量,例如:皮肤类型(油性= -1,干= 1),头发类型(长= 2,短= 0,介质= 1),生活方式(活跃的户外情人= 1,电视Junky = -1),年龄是一个数字。
  2. 缩放所有数值范围,以便它们符合您给予它们指示差异的相对重要性。例如:10年的年龄差异与长发和中发之间的差异大致不同,以及油性和干性皮肤之间的差异。因此,在年龄尺度上10与在头发尺度上1不同,在皮肤尺度上与2不同,因此按年龄差0.1,在头发上1和在皮肤上按0.5评定
  3. 使用一个合适的distance metric来结合两个不同规模的人之间的差异在一个整体的差异。这个数字越小,它们越相似。我建议简单的二次差分作为您的距离函数的第一次尝试。

然后两个人之间的差异可能与计算(我假设Person.age,。皮肤,.hair等已经通过第1步走了,是数字):

double Difference(Person p1, Person p2) { 

    double agescale=0.1; 
    double skinscale=0.5; 
    double hairscale=1; 
    double lifestylescale=1; 

    double agediff = (p1.age-p2.age)*agescale; 
    double skindiff = (p1.skin-p2.skin)*skinscale; 
    double hairdiff = (p1.hair-p2.hair)*hairscale; 
    double lifestylediff = (p1.lifestyle-p2.lifestyle)*lifestylescale; 

    double diff = sqrt(agediff^2 + skindiff^2 + hairdiff^2 + lifestylediff^2); 
    return diff; 
} 

注这个例子中的diff并不是像(0..1)那样好的尺度。它的值可以从0(无差异)到大(高差)。此外,这种方法几乎完全不科学,它只是设计为快速给你一个工作差异指标。