美文网首页
unit8 估算价格

unit8 估算价格

作者: 巴拉巴拉_9515 | 来源:发表于2018-05-24 18:56 被阅读0次

    你的酒庄有一批葡萄酒,但你不知道每瓶酒的价格要标为多少。通常把拥有类似年份、同一等级的葡萄酒价格作为参考,标个差不多的价格出售。《集体智慧编程》第八单元“构建价格模型”就是通过算法实现以上人工的标价。

    01 KNN算法

    kNN(k-NearestNeighbor)的基本思想有点类似“物以类聚,人以群分”,打个通俗的比方就是“如果你要了解一个人,可以找到他最亲近的几个朋友从而去推测他是什么样的人”。

    算法原理

    距离计算
    KNN算法是基于距离判断的,A和B计算的距离近,就认为A和B相似。
    欧式距离:

    相似样本提取
    欧式距离算完以后,提取距离最近的前K个点,计算价格平均值,默认这个平均值就是就的价格

    改进提升
    1、把距离转换为权重:欧氏距离换成高斯距离
    2、引进概率,计算价格落在某个范围上的概率

    02 葡萄酒价格预测

    2.1、数据集

    数据包含300条葡萄酒的等级、年份、售价。

    2.2、KNN算法

    模型实现很简单,假如有瓶酒已知等级和年份A(x,y)

    1、计算A与300个样本之间的欧式距离
    2、算完以后排排序,提出距离值最小的前K个(这几瓶酒和A最相似)
    3、计算这k瓶酒的均价 = A的价格
    备注:K自己设置

    以下代码为一瓶等级得分为70,年份30年(70,30)葡萄酒的定价。KNN算法提取出与该酒最相似的3瓶酒,定价都为0。

    knnestimate(data,(70,30),k=3)
    {'input': (68.14244705624718, 29.723469509659), 'result': 0.0}
    {'input': (67.42073943376387, 29.025455255036253), 'result': 0.0}
    {'input': (67.30702587967116, 28.388088291115615), 'result': 0.0}
    Out[10]: 0.0
    

    2.3、KNN升级:话语权

    如果这是一个投票游戏,以上KNN选取前5个亲近的小伙伴投票,每个人票的价值都一样。
    可是你想要根据亲密程度,赋予这些票的价值,最亲密小伙伴的票拥有更多的价值。
    一般通过反函数、减法函数、高斯函数等方式,根据距离远近赋予权重,这样距离近的话语权更大。
    价格由原本的简单粗暴计算平均值,更新为:

    使用加权KNN为一瓶等级得分为99,年份为5年(90,5)葡萄酒的定价。前3瓶权重明显高且接近,最后给这瓶酒定价为34美元。

    weightedknn(data,(99,5))
       权重                                    等级,年份                          价格
    0.9621720131362144 {'input': (98.2637541693455, 3.8226963432567485), 'result': 22.616639220097067}
    0.9554825120304244 {'input': (99.72883538561834, 3.678735501303465), 'result': 25.55923929063641}
    0.9347186212711716 {'input': (98.70782460331614, 6.813868870030371), 'result': 42.86339463054278}
    0.6520988058381347 {'input': (94.87960720692257, 7.097694573281638), 'result': 39.339845329955985}
    0.651433568695905 {'input': (96.69070660540599, 9.01200158691655), 'result': 47.95519085690764}
    Out[14]: 34.44274734842865
    

    2.4、KNN升级:变量权重

    对于多维数据的预测,以上KNN处理效果不太好。
    当葡萄酒的变量除了等级、年份外还多了一些有的没的,和价格没多大关系变量。这时候用KNN 做判断。


    原始KNN算法通过计算300个样本(A价格-样本价格)、(A年份-样本年份)、(A##-样本##)、(A酒瓶-样本酒瓶)的欧式距离判断亲密程度,可是##和###一段乱七八糟的数据和价格没有什么关系。
    这个时候就要给这些变量赋予权重。价格影响程度高的权重高点,没什么关系的权重低些,300个样本的每个变量乘以不同的权重。然后开始正常的KNN运算。

    2.4、KNN升级:概率表示

    升级KNN算法,得到落在某一个价格范围内的概率。概率=落在范围里的权重和/所有权重
    估算一瓶等级得分为90,年份20年[90,20]葡萄酒的价格范围,判断价格落在100-120的概率为45%。

    probguess(data,[99,20],100,120)
                 等级                    年份                             价格
    {'input': (98.13591534623879, 21.458633335072935), 'result': 117.98094083686266}
    {'input': (96.52185877978742, 18.699301922046697), 'result': 101.7540174819874}
    {'input': (99.84936912903818, 23.068123446367732), 'result': 121.00666214480627}
    {'input': (98.03206508547703, 24.298966166929098), 'result': 134.3776674274043}
    {'input': (95.48103048901007, 22.704230363454574), 'result': 133.60168133982722}
    Out[34]: 0.45338334200992164
    

    从概率分布图来看,等级得分为90,年份20年[90,20]葡萄酒价格100%低于150美元。


    ·

    03 备注小结

    相关文章

      网友评论

          本文标题:unit8 估算价格

          本文链接:https://www.haomeiwen.com/subject/hkbsjftx.html