gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:44:49 25 4
gpt4 key购买 nike

我目前正在尝试形成一种算法,该算法将根据某些特定条件计算 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com