gpt4 book ai didi

php - 如何找到最接近的匹配数组

转载 作者:行者123 更新时间:2023-12-04 02:34:10 25 4
gpt4 key购买 nike

家具店网站的客户可以选择产品并将其添加到“样式簿”中。每个产品都属于一个“样式”。这家家具店有一些造型师,他们每个人都制作了代表自己风格和专业知识的风格手册。我希望能够找到最符合客户风格手册的造型师。对于每本样式书,我都统计了每种样式的产品数量。

$stylists = [
'Nanda' => [
'Design' => 20,
'Retro' => 0,
'Rustiek' => 0,
],
'Angelique' => [
'Design' => 0,
'Retro' => 20,
'Rustiek' => 0,
],
'Lissy' => [
'Design' => 10,
'Retro' => 10,
'Rustiek' => 0,
],
];

客户的样式书也是如此:

$customer = [
'Design' => 15,
'Retro' => 10,
'Rustiek' => 0,
];

在这种情况下,Lissy 应该是最佳匹配。

产品数量并不重要,因为这取决于造型师的活跃程度。更重要的是造型师匹配了大部分顾客的风格。例如:

'Stylist'     => [
'Design' => 10,
'Retro' => 10,
'Rustiek' => 0,
]

应该还是比

更好的匹配
'Stylist'     => [
'Design' => 300,
'Retro' => 0,
'Rustiek' => 180,
]

我已经尝试根据客户风格书的重要性顺序为造型师的风格书评分和百分比,但我仍然无法 100% 地获得最佳匹配。Google 也没有带我到任何地方。

最佳答案

正如我们已经讨论过的,您的模型的问题在于它依赖于产品的数量。但我们需要的是造型师所用风格的指标。换句话说,我们消除了计数并用相对加权的指标(在本例中为百分比)代替它。例如,拥有以下产品组合的造型师:

[
style1 => 30,
style2 => 10,
style3 => 5
]

产品数量是 45 = 30 + 10 + 5 这将导致样式配置文件如下所示:

[
style1 => 0.66,
style2 => 0.22,
style3 => 0.11
]

为了将 stylist-style-profile 与 client-style-profile 相匹配,我们需要为 client-stylebook [15, 10, 0] 做同样的事情:

[
style1 => 0.60
style2 => 0.40
style3 => 0.00
]

这背后的想法是,我们评估造型师如何受某种风格的影响,并且对于我们想要找到最适合的造型师的产品,结果可能非常相似。

如果造型师制作的产品的风格不是我们真正需要的搭配,我们会使用加权相关因素对这一事实进行评分,例如0.11。这不是那么重要,但我们仍然承认设计可能有些偏颇这一事实。

因此,如果造型师有很多我们正在寻找的某种风格的产品,它不会对结果产生太大影响。

请让我知道,如果这有帮助,如果你想改变什么。从这里我们还可以实现其他选项和规则。

下面是我的 RatingModel。

<?php

class RatingModel {
private $name;
private $preferences;
private $preferencesWeighted;

public function RatingModel($name, array $preferences) {
$this->name = $name;
$this->preferences = $preferences;
$this->init();
}

private function init() {
$total = 0;
foreach ($this->preferences as $value) {
$total += $value;
}
if ($total > 0) {
foreach ($this->preferences as $value) {
$this->preferencesWeighted[] = $value / $total;
}
} else {
$this->preferencesWeighted = array_fill(0, sizeof($this->preferences), 0);
}
}

public function getName() {
return $this->name;
}

public function getPreferences() {
return $this->preferences;
}

public function getPreferencesWeighted() {
return $this->preferencesWeighted;
}

public function distanceToModel($ratingModel) {
$delta = [];
for ($i = 0; $i < sizeof($this->preferencesWeighted); $i++) {
$delta[] = abs($this->preferencesWeighted[$i] - $ratingModel->getPreferencesWeighted()[$i]);
}
return $delta;
}

public function scoreToModel($ratingModel) {
$distanceToModel = $this->distanceToModel($ratingModel);
$score = [];
foreach ($distanceToModel as $value) {
$score[] = $value * $value;
}
return sqrt(array_sum($score));
}
}

$customer = new RatingModel('Customer', [15, 10, 0]);
$nanda = new RatingModel('Nanda', [20, 0, 0]);
$angelique = new RatingModel('Angelique', [0, 20, 0]);
$lissy = new RatingModel('Lissy', [10, 0, 0]);
$mary = new RatingModel('Mary', [0, 0, 0]);
$max = new RatingModel('Max', [12, 0, 5]);
$simon = new RatingModel('Simon', [17, 2, 5]);
$manuel = new RatingModel('Manuel', [17, 8, 10]);
$betty = new RatingModel('Betty', [16, 9, 5]);
$sally = new RatingModel('Sally', [15, 10, 4]);
$peter = new RatingModel('Peter', [16, 9, 1]);

$stylists = [$nanda, $angelique, $lissy, $mary, $max, $simon, $manuel, $betty, $peter, $sally];

$relativeToClient = [];
foreach ($stylists as $stylist) {
$relativeToClient[] = [
'stylist' => $stylist->getName(),
'distance' => $stylist->distanceToModel($customer),
'score' => $stylist->scoreToModel($customer)
];
}

echo '<pre>';
print_r($stylists);
echo '<hr>';
print_r($customer);
echo '<hr>';
print_r($relativeToClient);
echo '<hr>from best fit to worst (low score means low delta)<hr>';
$results = array_column($relativeToClient, 'score', 'stylist');
asort($results);
print_r($results);
echo '</pre>';

下面是结果(值越低越好):

Array
(
[Peter] => 0.067936622048676
[Sally] => 0.1700528000819
[Betty] => 0.20548046676563
[Manuel] => 0.35225222874108
[Simon] => 0.3942292057505
[Max] => 0.50765762377392
[Nanda] => 0.56568542494924
[Lissy] => 0.56568542494924
[Mary] => 0.7211102550928
[Angelique] => 0.84852813742386
)

如果我们观察我们注意到的两个最合适的造型师,Peter 胜过 Sally,因为 Sally 有更多不同风格的产品。

Sally: [15, 10, 4]
Peter: [16, 9, 1]

您可能还注意到,Nanda 和 Lissy 的分数相同:

Nanda: [20, 0, 0]
Lissy: [10, 0, 0]

// relatively, for both => [1.00, 0.00, 0.00]

他们都被认为同样合适。第一种风格的 Nanda 多了 5 种产品,而 Lissy 少了 5 种产品,但这并不重要,因为他们都只提供一种风格,这才是最重要的:他们离理想的客户风格有多远。

您还可以实现逻辑,这样您就没有偏差因素并且在比较时更加严格。在这种情况下,您可能希望排除一些参数。

例如只需比较 [15, 10][16, 9] - 在这种情况下,Sally 实际上会赢,因为在偏好方面她与客户没有差异:

莎莉:

[
style1 => 0.60,
style2 => 0.40
]

彼得:

[
style1 => 0.64,
style2 => 0.36
]

关于php - 如何找到最接近的匹配数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62658462/

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