+----+--------+------+---------+-----------+-------------+------------+------------+ | id | price | year | mileage | fuel_type | body_type | brand | model | +----+--------+------+---------+-----------+-------------+------------+------------+ | 1 | 4894 | 2011 | 121842 | "Benzin" | "Sedan" | "Toyota" | "Yaris" | | 2 | 4989 | 2012 | 33901 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 3 | 4990 | 2013 | 55105 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 3 | 5290 | 2013 | 20967 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 5 | 5594 | 2008 | 121281 | "Benzin" | "Hatchback" | "Mercedes" | "A170" | | 6 | 4690 | 2012 | 71303 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 7 | 5290 | 2013 | 58300 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 8 | 5890 | 2013 | 35732 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 9 | 5990 | 2013 | 38777 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | | 10 | 6180 | 2013 | 69491 | "Benzin" | "Hatchback" | "VW" | "up!" | | 11 | 6490 | 2012 | 72900 | "Benzin" | "Sedan" | "Renault" | "Clio III" | | 12 | 6790 | 2012 | 49541 | "Benzin" | "Hatchback" | "Renault" | "Clio III" | | 13 | 6790 | 2012 | 46377 | "Benzin" | "Hatchback" | "Renault" | "Clio III" | | 14 | 6790 | 2012 | 45200 | "Benzin" | "Hatchback" | "Renault" | "Clio III" | | 15 | 6894 | 2007 | 108840 | "Benzin" | "Sedan" | "VW" | "Golf V" | | 16 | 6990 | 2009 | 54200 | "Benzin" | "Sedan" | "Renault" | "Mégane" | | 17 | 6990 | 2012 | 40652 | "Benzin" | "Hatchback" | "Renault" | "Clio III" | | 18 | 6990 | 2012 | 38080 | "Benzin" | "Sedan" | "Renault" | "Clio III" | | 19 | 7290 | 2012 | 28600 | "Benzin" | "Hatchback" | "Renault" | "Clio III" | | 20 | 7290 | 2013 | 52800 | "Benzin" | "Hatchback" | "Renault" | "Twingo" | +----+--------+------+---------+-----------+-------------+------------+------------+
我想创建一个推荐引擎,它可以根据一些不同的标准返回20个最“相似”的匹配,例如:当用户搜索:brand =’Renault’且价格< 60000年和年> 2010年,我想在搜索结果之外提出一些其他的,与其他汽车相比更松散的结果,这是相似的,但不一定完全符合所有搜索条件. 我已经尝试在ruby中制作一些基于规则的代码,它可以执行以下操作:
>如果您通过’雷诺Clio’进行搜索,那么’Renen Twingo’也是一个非常接近的比赛
>如果您的最高价格为8000,那么请按最接近的价格订购
等等
基于此代码,我生成一个SQL查询,其中包含where和order by子句.
然而问题是,事情变得很大,因为我想根据初始标准考虑20个不同的列,我可以选择考虑.此外,我希望建议向后兼容,因为我不想只做一个简单的过滤(WHERE)查询,在这种情况下最终可能会返回零匹配.相反,我希望它做一些类似于使用文本相似度算法时的方法,您可以将一个短语与所有短语进行比较,并获得所有这些短语的比较分数,然后您可以对其进行排序.
我对如何实现这一点感到非常困惑,在一种方法中,这不是定义1000条规则和if / then语句来生成SQL查询.是否有其他技术我可以使用,或者可能是postgresql之外的其他技术?
解决方法
MADlib http://madlib.incubator.apache.org/是Postgres的扩展,使您能够在数据库内部使用各种机器学习算法.值得学习和尝试.
从你的向量的线性回归开始,然后尝试随机森林和其他算法,并比较在你的情况下更好的效果(评估算法质量的技巧很简单:你拿走你拥有的所有数据,使用70-80%的它训练,然后使用余数从训练的引擎得到估计 – 然后使用一些函数来计算偏差误差,通常人们使用均方误差方法).
此外,我可以推荐一个很棒的斯坦福在线课程,在Youtube上发布在线书籍和讲座(全部免费!):http://mmds.org/.构建推荐引擎的各种现代方法在其中有很好的描述.