草庐IT

php - 根据特定数据计算用户的相关性

coder 2023-06-12 原文

我目前正在尝试形成一种算法,该算法将根据某些特定条件计算 user 与另一个 userrelevance数据位。

不幸的是,自从大约十年前离开学校以来,我的数学技能一直在下降,因此,我非常挣扎。我在网上找到了一种算法,可以将“热门”帖子推送到新闻源的顶部,并认为这是一个很好的起点。这是我在网上找到的算法/计算(在 MySQL 中):

LOG10(ABS(activity) + 1) * SIGN(activity) + (UNIX_TIMESTAMP(created_at) / 300000)

我希望做的是调整上述概念以处理我自己的应用程序中的数据和模型。考虑这个用户对象(修剪):

{
    "id": 1
    "first_name": "Joe",
    "last_name": "Bloggs",
    "counts": {
        "connections": 21,
        "mutual_connections": 16
    },
    "mutual_objects": [
        {
            "created_at": "2017-03-26 13:30:47"
        },
        {
            "created_at": "2017-03-26 14:25:32"
        }
    ],
    "last_seen": "2017-03-26 14:25:32",
}

上面有3位相关信息需要在算法中考虑:

  • mutual_connections
  • mutual_objects 但考虑到旧对象不应该像新对象那样提高相关性,因此 created_at 字段。
  • last_seen

谁能提出一个相当简单(如果可能的话)的方法吗?

这是我的想法,但老实说,我不知道它在做什么,所以我不能确定它是否是一个好的解决方案,而且我也错过了 last_seen 因为我不能想办法添加这个:

$mutual_date_sum = 0;

foreach ($user->mutual_objects as $mutual_object) {
    $mutual_date_sum =+ strtotime($mutual_object->created_at);
}

$mutual_date_thing = $mutual_date_sum / (300000 * count($user->mutual_objects));

$relevance = log10($user->counts->mutual_connections + 1) + $mutual_date_thing;

为了清楚起见,我不打算实现某种政府级别的 AI,50,000 行数学天才的算法。我只是在寻找一个相对简单的解决方案,暂时可以解决问题。

更新

我玩了一点游戏,并设法构建了以下测试。似乎 mutual_objects 在这个特定算法中非常重要,因为我希望看到用户 4 和 5 在结果列表中排名靠前,因为他们有大量 mutual_connections

我不知道这是否更容易修改/玩,但这可能是我能做的最好的。如果您有任何建议,请提供帮助:-)

$users = [
    [
        'id' => 1,
        'mutual_connections' => 15,
        'mutual_objects' => [
            [
                'created_at' => '2017-03-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-26 14:25:32'
            ],
            [
                'created_at' => '2017-02-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-15 14:25:32'
            ],
            [
                'created_at' => '2017-01-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-26 14:25:32'
            ],
            [
                'created_at' => '2016-03-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-26 14:25:32'
            ]
        ],
        'last_seen' => '2017-03-01 14:25:32'
    ],
    [
        'id' => 2,
        'mutual_connections' => 2,
        'mutual_objects' => [
            [
                'created_at' => '2016-03-26 14:25:32'
            ],
            [
                'created_at' => '2015-03-26 14:25:32'
            ],
            [
                'created_at' => '2017-02-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-15 14:25:32'
            ],
            [
                'created_at' => '2017-01-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-26 14:25:32'
            ],
            [
                'created_at' => '2016-03-26 14:25:32'
            ],
            [
                'created_at' => '2016-03-26 14:25:32'
            ],
            [
                'created_at' => '2016-03-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-15 14:25:32'
            ],
            [
                'created_at' => '2017-02-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-15 14:25:32'
            ],
            [
                'created_at' => '2017-01-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-12 14:25:32'
            ],
            [
                'created_at' => '2016-03-13 14:25:32'
            ],
            [
                'created_at' => '2017-03-17 14:25:32'
            ]
        ],
        'last_seen' => '2015-03-25 14:25:32'
    ],
    [
        'id' => 3,
        'mutual_connections' => 30,
        'mutual_objects' => [
            [
                'created_at' => '2017-02-26 14:25:32'
            ],
            [
                'created_at' => '2017-03-26 14:25:32'
            ]
        ],
        'last_seen' => '2017-03-25 14:25:32'
    ],
    [
        'id' => 4,
        'mutual_connections' => 107,
        'mutual_objects' => [],
        'last_seen' => '2017-03-26 14:25:32'
    ],
    [
        'id' => 5,
        'mutual_connections' => 500,
        'mutual_objects' => [],
        'last_seen' => '2017-03-26 20:25:32'
    ],
    [
        'id' => 6,
        'mutual_connections' => 5,
        'mutual_objects' => [
            [
                'created_at' => '2017-03-26 20:55:32'
            ],
            [
                'created_at' => '2017-03-25 14:25:32'
            ]
        ],
        'last_seen' => '2017-03-25 14:25:32'
    ]
];

$relevance = [];

foreach ($users as $user) {

    $mutual_date_sum = 0;

    foreach ($user['mutual_objects'] as $bubble) {
        $mutual_date_sum =+ strtotime($bubble['created_at']);
    }

    $mutual_date_thing = empty($mutual_date_sum) ? 1 : $mutual_date_sum / (300000 * count($user['mutual_objects']));

    $relevance[] = [
        'id' => $user['id'],
        'relevance' => log10($user['mutual_connections'] + 1) + $mutual_date_thing
    ];
}

$relevance = collect($relevance)->sortByDesc('relevance');

print_r($relevance->values()->all());

打印出来:

Array
(
    [0] => Array
        (
            [id] => 3
            [relevance] => 2485.7219150272
        )

    [1] => Array
        (
            [id] => 6
            [relevance] => 2484.8647045837
        )

    [2] => Array
        (
            [id] => 1
            [relevance] => 622.26175831599
        )

    [3] => Array
        (
            [id] => 2
            [relevance] => 310.84394042139
        )

    [4] => Array
        (
            [id] => 5
            [relevance] => 3.6998377258672
        )

    [5] => Array
        (
            [id] => 4
            [relevance] => 3.0334237554869
        )

)

最佳答案

这个问题是机器学习的候选问题。找一本介绍性的书,因为我觉得它不是很复杂,你可以做到。如果没有,根据您通过网站赚取的收入,您可以考虑聘请专人为您做这件事。

如果您更喜欢“手动”操作;您将针对不同的因素构建具有特定权重的自己的模型。请注意,我们的大脑经常欺骗我们,您认为完美的模型可能远非最佳。

我建议您立即开始存储每个用户与哪些用户交互更多的数据;这样您就可以将结果与真实数据进行比较。此外,将来您将为构建适当的机器学习系统奠定基础。

话虽如此,这是我的建议:

最后,您想要这样的列表(有 3 个用户):

A->B: relevance
----------------
User1->User2: 0.59
User1->User3: 0.17
User2->User1: 0.78
User2->User3: 0.63
User3->User1: 0.76
User3->User2: 0.45

1) 对于每个用户

1.1) 计算并缓存每个用户“last_seen”的年龄,以天为单位,整数向下舍入(下限)。

1.2) 存储 max(age(last_seen)) - 我们称它为 max-。这是一个值,而不是每个用户一个。但是你只能在你之前计算出每个用户的年龄后才能计算它

1.3) 对于每个用户,用(max-age)/max的结果改变存储的年龄值,得到0到1之间的值。

1.4) 以天为单位计算并缓存每个对象的“created_at”。

2)对于每个用户,与其他每个用户进行比较

2.1)关于相互连接,想一想:如果A有100个连接,其中10个与B共享,C有500个连接,其中10个与D共享,你真的把10作为计算的值吗在这两种情况下?我会接受百分比。对于 A->B,它将是 10,对于 C->D,它将是 2。然后/100 的值介于 0 和 1 之间。

2.2) 选择相互关联的对象的最大年龄。让我们以 365 天为例。

2.3) 在用户 A 中,删除超过 365 天的对象。不要真正删除它们,只是为了这些计算而将它们过滤掉。

2.4) 从剩余的对象中,计算与每个其他用户的共同对象的百分比。

2.5) 对于这些其他用户中的每一个,计算上一步中共同对象的平均年龄。取最大年龄 (365),减去计算的平均值和/365 得到一个介于 0 和 1 之间的值。

2.6) 获取其他用户的年龄值。

因此,对于 A->B 的每个组合,您有四个介于 0 和 1 之间的值:

  • MC:相互联系 A-B
  • MO:互对象 A-B
  • OA:平均相互对象年龄 A-B
  • BA:B 岁

现在您必须为它们中的每一个分配权重,以便找到最佳解决方案。分配总和为 100 的百分比,让您的生活更轻松:

相关性 = 40 * MC + 30 * MO + 10 * OA + 20 * BA

在这种情况下,由于 OA 与 MO 如此相关,您可以将它们混合使用:

相关性 = 40 * MC + 20 * MO + 20 * MO * OA + 20 * BA

我建议每天通宵运行。有很多方法可以改进和优化流程……玩得开心!

关于php - 根据特定数据计算用户的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43030565/

有关php - 根据特定数据计算用户的相关性的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐