37

我正在开发我将出售食品的电子商店。我想要一个建议框,我会根据他在购物车中已有的东西建议我的用户还可以购买什么。如果他有啤酒,我希望他通过降低他也会购买的概率来推荐薯条和其他东西。但我希望我的算法能够学习根据所有用户之前的购买来推荐杂货。我应该从哪里开始?我有杂货桌user_id,,item_iddate类似的。如何在没有暴力破解的情况下制作建议框,这是不可能的。

4

12 回答 12

43

您描述的是推荐引擎;更具体地说是协同过滤。它是亚马逊“买了 x 的人也买了 y”功能和 Netflix 推荐引擎的核心。

这是一项不平凡的工作。例如,要获得任何对远程有用的东西,可能需要的不仅仅是首先建立电子商务网站。

例如:

  • 您不想推荐已经在购物篮中的商品。
  • 你不想推荐已经在篮子里的东西的更便宜的版本。
  • 您不想推荐缺货的商品。
  • 您不想推荐统计上有效但没有意义的商品(“嘿,你买了尿布,为什么不买啤酒?” - 有一个故事说,在超市,有一个统计相关性,因为爸爸出去晚上买尿布,同时拿起六包)。
  • 确实想推荐现在正在促销的商品
  • 现在不想推荐与促销中的商品相似的商品

当我尝试一个类似的项目时,很难向非技术人员解释计算机根本不理解推荐啤酒和尿布是不合适的。一旦我们得到基本解决方案的工作,构建排除和边缘案例逻辑至少需要同样长的时间。

实际上,我认为这些是您的选择:

  • 手动维护相关产品。耗时,但不太可能导致怪异。
  • 使用现成的解决方案 - SaaS 或包含支持此功能的 R 之类的库。
  • 推荐(半)随机产品。有一组你想推荐的产品,随机选择一个——例如,促销产品、“畅销”列表中的产品、价格低于 x 的产品。排除可能有问题的类别。

所有这些选择都可以在合理的时间内实现;从头开始构建一个合适的解决方案的问题在于,每个人都会根据亚马逊来衡量它,而且他们对你有一点领先……

于 2012-08-29T22:56:49.867 回答
8

这是数据挖掘中的Apriori算法解决的一个常见问题。您可能需要创建另一个表来维护此统计信息,然后根据首选组合提出建议

于 2012-08-30T10:10:39.900 回答
6

嗯……那么您正在寻找产品推荐引擎……嗯,它们基本上有三种风格:

  • 协同过滤
  • 基于内容的过滤
  • 混合推荐系统

   第一个收集并存储有关用户活动、偏好、行为等的数据……然后将这些数据发送到一个引擎,将其分成用户通道。每个频道都有特定的喜好和厌恶。因此,当您有一个新访问者时,他或她将被分类并被分配一个特定的用户配置文件。然后将根据此配置文件的喜欢/不喜欢显示项目。

   现在,基于内容的过滤使用了一种不同的方法——一种不太社​​交的方法——只考虑用户以前的浏览历史、他的偏好和活动。本质上,这将根据该用户之前喜欢/购买的内容创建推荐。

   但为什么只选择其中之一,对吧?混合推荐系统使用两者来提供个性化但社会化的推荐。在提供建议时,这些通常更准确。

   我认为,当您有大量用户涌入时,协同过滤是一个不错的选择——每月只有 42 个用户访问您的网站,很难建立良好的渠道。第二个选项,基于内容,更适合拥有大量产品的小型网站 - 但是,恕我直言,第三个是适合你的 - 构建一些可以让用户从一开始就开始并收集他们生成的所有数据的东西,在未来,能够提供类似亚马逊的推荐体验!

   构建其中之一并非易事,因为我相信您已经知道......但我强烈推荐这本书(使用个人历史过滤!)它在过去对我来说真的很重要:http://www .amazon.com/Algorithms-Intelligent-Web-Haralambos-Marmanis/dp/1933988665

祝你好运,好好学习!

于 2012-09-02T23:01:50.943 回答
5

根据其他购买该商品的顾客的购物习惯进行交叉销售。假设您的数据库(订单表)中有此购买历史记录:

  1. 啤酒、薯条、苏打水
  2. 啤酒、苏打水
  3. 苏打水、蛋糕
  4. 薯条、啤酒
  5. 蛋糕、薯条、啤酒

然后,如果您的客户的购物车中有啤酒,则根据您客户的购物习惯,您可以轻松进行查询并查看与啤酒相关的商品是:

  1. 筹码(3次)
  2. 苏打水(2次)
  3. 蛋糕(1次)

然后你可以推荐薯条和苏打水……你的购买历史越多,系统给出的建议就越准确。

于 2012-08-29T17:13:27.433 回答
5

我认为最好的方法是对您的物品进行分类并使用该信息来做出选择。

我在一个杂货网站上做了这个,结果效果很好。这个想法是将项目交叉分组到多个类别中。

例如,让我们拿一根香蕉。它是一种水果,但也常与玉米片或麦片一起用于早餐。谷物也是早餐食品,但某些谷物可能被认为是健康食品,而另一些则是含糖食品。

使用这种方法,您可以快速开始制作这样的表格:

Item         | Category
-------------+------------
Banana       | Breakfast
Banana       | Quick
Banana       | Fruit
Banana       | Healthy
Museli       | Breakfast
Museli       | Healthy
Sugar Puffs  | Breakfast
Sugar Puffs  | Treat
Kiwi Fruit   | Fruit
Kiwi Fruit   | Healtyh
Kiwi Fruit   | Dessert
Milk         | Breakfast

通过像这样的简单查找,您可以根据这些分组轻松找到要推荐的好项目。

假设某人的篮子里有香蕉、Museli 和糖泡芙。

那是三份早餐,两份健康,一份不是那么多。

建议牛奶,因为它匹配所有三个。没有冲动购买?再试一次,扔一个猕猴桃。等等等等。

这里的想法是匹配许多不同类别的项目(尤其是那些可能不直接出现的项目),并使用这些计数为您的客户推荐最好的项目。

于 2012-08-27T22:22:40.840 回答
1

您可能会喜欢非负矩阵分解算法,它可以完全满足您的需求(除了 Neville K 提到的东西)。购买杂货的数据库表将是分解的矩阵。一个因素是包含人们一起购买的东西的矩阵。该矩阵将比您将每个杂货店与所有其他杂货店进行比较的矩阵小得多。它会自动找到组合在一起的杂货“组”,例如 Fluffeh 建议的类别,您会自动找到这些。执行步骤:

  1. 每天或每周:在购买的杂货表上运行分解以找到新的“趋势”。保存因子矩阵。
  2. 如果有新的购物车到达:使用购物车作为参数调用求解器,您将获得一个包含非常适合的产品的购物车。建议尚未在购物车中的东西。

有人已经提到了《编程集体智能》一书。这是一个好的开始。

于 2012-09-01T12:11:27.930 回答
0

1 - categorize each product as 3 layered categorization (Type/function/price) as example so when a specific product selected, u can ignore all other categories this will save too much time and effort, then u can select random products from the same (类型/功能/价格)放入您的建议框。

这是如果您不想陷入理论机器智能或复杂算法编码的麻烦中。

祝你今天过得愉快 :)

于 2012-09-01T10:57:28.490 回答
0

就像上面每个人所说的那样,完成这项工作的关键是实施

“x 个用户”还购买了“y 个项目”

基本上,您需要做的是在现有数据库中试验更多的表行和列,或者链接新的,以保留有关人们查看的产品的统计数据。您需要的一个非常重要的列是评分或喜欢(不是 Facebook 喜欢)

您将需要新表,例如:

  • 朋友表(将 user_ID 链接在一起形成“朋友”)
  • Like 表(将链接 Friends 表和 Product 表以获取“匹配”产品)
  • 统计表(将链接到 Like 表和 Product 表)

您还需要使用额外的列更新现有表,例如:

  • Product_table 每个产品的平均评级(0-5/0-10/0-100 或类似 0/1)

如果用户 x用户 y是朋友,他们的 ID 将在 Friends 表中匹配。Like 表将采用一个产品,其中两个用户是朋友,并且喜欢产品 z,其中一个:(评分 0-5/0-10/0-100;喜欢 0/1)您决定哪种方法。

当一个产品被喜欢/评分时,它的 ID 将使用 +X 或 -X 更新特定列名称产品评分,具体取决于它的评分或喜欢。如果产品被评分或喜欢,您还需要确定平均正面。一个例子是 50% 的评分和 100 个喜欢的点赞。

完成所有这些后,当用户 x 购买产品时,您可以匹配以查看是否:

  • 用户有朋友
  • 用户的朋友也购买了产品 y
  • 朋友对产品 y 的评分/喜欢是多少
  • 用户 x 的朋友评价高或喜欢哪些其他产品
  • 用户 x 的朋友评价差或不喜欢哪些其他产品

您可以做的不仅仅是推荐产品。只需一点点努力,您就可以与人们及其朋友达成热门交易。新产品出现在市场上,与产品 z 一样,只有更好。如果 X 人和他们所有的朋友都喜欢产品 z,他们可能会喜欢并购买新产品。

于 2012-09-05T19:17:00.457 回答
0

我认为最好的方法是使用“标签模式”。例如:

products Table:
=================================
product_id
product_name

tags Table:
=================================
tag_id
tag_name

tags_products Table:
=================================
id_product
id_tag

products registry example:
=================================
1 | Beer
2 | Chips
3 | Cake

tags registry example:
=================================
1 | beer
2 | chips
3 | cake

tags_products registry example:
=================================
1 | 2
1 | 3
2 | 1
2 | 3
3 | 1

然后,您可以关联所有您想要的内容并轻松进行查询:)

要开心。

问候。

于 2012-09-03T14:00:37.763 回答
0

有两种基本方法可以做到这一点:

  1. 手动将数据库中的项目相互关联(耗时但灵活)。
  2. 根据过去的购买情况自动确定其他人购买的物品。

看起来你倾向于后者。我为一个销售各种商品并根据其他客户过去购买的商品推荐相关商品的网站写了类似的东西。这是我使用的查询:

SELECT items.*, COUNT( cartitems.itemid ) AS c FROM 
items
LEFT JOIN cartitems ON ( cartitems.itemid = items.id )
LEFT JOIN carts ON ( carts.id = cartitems.cartid )
WHERE (
    carts.id IN (
        /* Every cart with this item: */
        SELECT cartitems.cartid
        FROM cartitems
        WHERE ( cartitems.itemid = 123456 )
    )
        AND
    ( cartitems.itemid != 123456 ) /* Items other than this one */
        AND
    carts.checkedout = TRUE /* Carts that have checked out */
)
GROUP BY cartitems.itemid
ORDER BY c DESC
LIMIT 5

此示例假设他们正在查看的项目的 id 为 123456。“购物车”表包含过去的购买记录。“cartitems”表包含过去购买的单个项目。

于 2012-08-28T05:34:00.503 回答
0

您可以使用人工神经网络来学习根据以前的购买来组合不同的产品。

以下是有关该主题的两个资源:

http://en.wikipedia.org/wiki/Artificial_neural_network

http://www.ai-junkie.com/ann/evolved/nnt1.html

于 2012-08-27T22:17:15.180 回答
0

在为您的问题寻找有意义的答案时,我偶然发现了这份文件:

分析消费者购买行为的主题跟踪模型

我只阅读了文档的一部分,但看起来它可能是您问题的理论答案。我希望它有所帮助。

于 2012-08-29T22:37:47.503 回答