- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我目前正在尝试形成一种算法,该算法将根据某些特定条件计算 user
与另一个 user
的 relevance
数据位。
不幸的是,自从大约十年前离开学校以来,我的数学技能一直在下降,因此,我非常挣扎。我在网上找到了一种算法,可以将“热门”帖子推送到新闻源的顶部,并认为这是一个很好的起点。这是我在网上找到的算法/计算(在 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 之间的值:
现在您必须为它们中的每一个分配权重,以便找到最佳解决方案。分配总和为 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/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!