【问题标题】:get match percentages between two objects by parameters通过参数获取两个对象之间的匹配百分比
【发布时间】:2013-06-16 14:28:07
【问题描述】:

我想创建一个程序来自动化我今天手动执行的过程。 如果解决方案看起来很简单,我很抱歉,我只是不想专门为我的问题考虑新算法,因为我确信有人已经考虑过了。 我的场景是这样的: 我有正在寻找工作的候选人列表,并且我有工作列表。 对于每个候选人,我都知道他正在寻找的工作的以下要求。喜欢:

  1. 工资
  2. 工作地点
  3. 公司规模(大/小)

在手动过程中,我所做的是将这些候选人的要求参数与工作的要求参数进行匹配,并“返回”似乎适合候选人的工作(不一定要完全匹配)。 当然我正在考虑候选人的要求是“很高兴拥有”或“必须拥有”。

我正在寻找一种算法,它可以返回每个候选人与每个工作的匹配百分比。 有人可以指点我这样的匹配算法的任何名称。

谢谢

【问题讨论】:

  • 根据您现在手动使用的任何比例将点分配给拟合参数,将所有点的总和除以可达到的总点数,然后确定匹配所需的点阈值有才能被考虑?对于破坏交易的情况(例如“必须位于美国境内”对于在巴巴新几内亚的工作),您可以添加一个非常小的负值(意思是 -10000 之类的),这样它就可以抵消任何正值总分,以确保分数保持在接受阈值以下。

标签: c# algorithm


【解决方案1】:

我的建议是将每个对象转换为 3-D 空间中的向量,然后在两个向量(对象)之间找到Euclidean distance

  • 首先,将salarylocationsize分配给xyz 轴。
  • 然后将属性映射到[0, 1]轴的区间。

例如,如果您的最低薪水为 1'000,最高薪水为 10'000,那么您将映射:

  • $ 1'000 -> x 轴上的 0,
  • $ 10'000 -> 在 x 轴上为 1。

映射位置很难,但是假设您有一个地图网格,并且您根据地理位置为网格的每个补丁分配一个值 - 更接近的具有相似的值。例如,美国各州为我们提供了一个很好的例子:

  • 纽约 -> y 轴上的 1.0,
  • 新泽西州 -> y 轴上为 0.99,
  • ...
  • 加利福尼亚 -> y 轴上为 0.1。

映射公司规模类似于:

  • 启动 -> z 轴上 0.2,
  • ...
  • 跨国 -> z 轴上的 1.0。

举个例子:约翰想要 9.000 的薪水,想要在纽约找到一份工作,并想要在一家初创公司工作。他在 3D 空间中的向量是[0.82, 1.00, 0.1]Peter 想要 5.500 的薪水,想要在新泽西找到一份工作,并且想要在一家非常大的公司工作 - [0.5, 0.99, 0.8]。最后,Mike 想要一份 8.000 的薪水,一份在加利福尼亚的工作,还有一家初创公司 - [0.73, 0.1, 0.1]

根据 3D 空间中的欧式距离公式:

d(a, b) = sqrt((a1-b1)^2 + (a2-b2)^2 + (a3 - b3)^2)

Distance between John and Peter is: d(J, P) = 0.77
Distance between John and Mike is:  d(J, M) = 0.90

所以结论是约翰和彼得比约翰和迈克更亲近。

您可以做的另一件事是在每个轴上引入一些常量以强调其重要性(例如,位置比公司规模更重要)因此在公式中您可以执行以下操作:

d(a, b) = sqrt((a1-b1)^2 + (C*a2 - C*b2)^2 + (a3 - b3)^2), where C = 10

【讨论】:

    【解决方案2】:
    similiarity(A,B) = 1 / (1 + (distance(A,B) / unit))
    

    距离为 0 的情况:

    similarity(A,A)
    = 1 / (1 + (distance(A,A) / unit))
    = 1 / (1 + (0 / unit))
    = 1 / (1 + 0)
    = 1.0
    ~ 100 %
    

    距离无限的情况:

    similarity(A,Z)
    = 1 / (1 + (distance(A,Z) / unit))
    = 1 / (1 + (infinity / unit))
    = 1 / infinity
    = 0.0
    ~ 0 %
    

    代码:

    JobComparison* compare (Job a, Job b)
    {
    
        // define units based on measurement
        double unit1 = 1000.0;
        double unit2 = 100.0;
        double unit3 = 10.0;
    
        // calculate distance
        double d1 = abs(a.salary - b.salary);
        double d2 = distance(a.location, b.location);
        double d3 = abs(a.companySize - b.companySize);
    
        // calculate similiarity
        double p1 = 1 / (1 + (d1 / unit1));
        double p2 = 1 / (1 + (d2 / unit2));
        double p3 = 1 / (1 + (d3 / unit3));
    
        return new JobCompare(p1, p2, p3);
    
    }
    

    public class JobCompare
    {
      public:
        double salarySimiliarity;
        double locationSimiliarity;
        double companySimiliarity;
    }
    
    public class Job
    {
      public:
        double salary;
        Location location;
        double companySize;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-08
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多