我正在开发一个社区网站,需要计算任意两个用户之间的相似度。每个用户都有以下属性:
年龄、皮肤类型(油性、干性)、发型(长发、短发、中等长度)、生活方式(热爱户外运动、电视迷)等。
请问有没有人能告诉我如何解决这个问题,或者指向一些资源?
我正在开发一个社区网站,需要计算任意两个用户之间的相似度。每个用户都有以下属性:
年龄、皮肤类型(油性、干性)、发型(长发、短发、中等长度)、生活方式(热爱户外运动、电视迷)等。
请问有没有人能告诉我如何解决这个问题,或者指向一些资源?
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
如果您对用于分类数据降维的方法(也是将变量排列成同质群集的方式)感兴趣,请查看此处链接
给每个属性分配适当的权重,并添加值之间的差异。
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)
。三个步骤来实现一个简单的主观度量,用于比较两个数据点之间的差异,这在您的情况下可能非常有效:
那么两个人之间的差异可以通过以下方式计算(我假设Person.age,.skin,.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;
}
看看计算字符串差异的算法。它非常类似于您所需的内容。将您的属性存储为位字符串,并计算字符串之间的距离。