读书笔记《集体智慧编程》Chapter 8 : Build Price Models

简介:

本文概要

贝叶斯分类器 ,决策数和支持向量机对数值型数据处理能力较弱。本文介绍kNN(K Nearst Neighbor)算法,可以根据已有的数值型训练集合,对数值型数据做出预测。

 

KNN算法

正对当前被预测对象,在训练集合中找出最近的K个物品价格,算出平均值为预测价格。距离算法有很多,如皮尔森系数,余弦定理,欧氏距离等。本章例子是预测商品价格,采用的是欧氏距离(为什么呢?我的理解:商品的价格一般与商品重量,体积等成正比,所以距离的模大小比较重要,采用欧拉距离,可以将向量摸大小的因素考虑在内)。

 

K的选取

算法中有K的,都会遇到这个问题,k取多少?在KNN中,k太小,比如1,那么预测价格仅仅与最临近的训练数据相同,那么可能此数据由于噪音,不准确,使得预测数据也不准确。K太大了,也不好,因为范围太大,较小的值容易使整体预期偏低。

 

权重距离

K太多时,由于范围太大,较远的值会使总体预期偏低,那么可以采用加权平均值的思想,给较远的对象较低的权重,这样可以给出相对准确的预期。权重公司应该是一个单调递减函数,参数为距离,值为权重。有三种权重计算公司:

  • 权重函数1: 反函数,f(dist) = 1/(1+dist),分母加1是为了防止无限大。优点:计算快。缺点:较近的数据,给与较大的权重,权重降落的非常快,导致可能会对噪音数据比较敏感。
  • 权重函数2: 减函数,f(dist) = a - dist (dist < a) or 0 (dist >= a)。a为大于0的常量。优点,计算快。缺点:距离大于a的数值给出的权重是0,无法对预估起到作用,可能会漏掉一些数据。
  • 权重函数3: 高斯函数(如下图),当可距离无限延伸时,权重是无限接近于0的,但是当距离叫小时,权重变化相对平稳,所以对上面两种函数的不足都有弥补。不足的是,计量量较大。

image

 

交叉验证 cross validation

数据集被分为两份

  • train set: 训练集合,用于训练算法,通常较大,如95%左右。
  • test set:测试集合,通常较小,如5%左右。测试集合输入带入算法中,计算的结果对应的测试结果只差的平方(放大差异),求和,就可以作为验证分数。

通常需要重复上面的切分过程。使用这个方法进行验证需要满足一个条件,被验证算法需要输入训练数据集。

 

伸缩纬度

物品通常是由多为向量描述的,然而由于不同纬度变量描述特质不同,对整体影响也不一样。比如酒,由年份(范围0~100),级别(范围1~5),体积(范围500ml~2500ml)。可以看出,在欧式距离中,体积的影响最大。所以,需要将所有的酒的体积统一缩小,人为的给出一个伸缩比例,使得不同的纬度对距离的贡献相当。可以利用第五章中提到的优化方案自动求出最优伸缩比例。

 

不均匀的价格分布

有可能训练集合的数据有些因数并不能被对象的纬度描述出来,如果仍然这样计算,可能会低估预期。可以换一个角度预测,预测价格在一个范围区间内的概率。计算方法与knn类似,只不过将区域内的权重之和比上所有的权重之和,结果为概率。

 

KNN使用场景

距离计算耗时,最优范围选取耗时。

但是数值型预测,范围预测,其他预测方法都办不到,kNN比较直观且可行。

声明:如有转载本博文章,请注明出处。您的支持是我的动力!文章部分内容来自互联网,本人不负任何法律责任。
本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/11/20/2779738.html ,如需转载请自行联系原作者
相关文章
|
12月前
|
存储 程序员 C++
《高质量C/C++编程》读书笔记三
《高质量C/C++编程》读书笔记三
60 0
|
12月前
|
前端开发 Java 程序员
《高质量C/C++编程》读书笔记一
《高质量C/C++编程》读书笔记一
49 0
|
12月前
|
存储 人工智能 算法
C++ Primer Plus 第6版 读书笔记(7)第 7 章 函数——C++的编程模块
乐趣在于发现。仔细研究,读者将在函数中找到乐趣。C++自带了一个包含函数的大型库(标准 ANSI 库加上多个 C++类),但真正的编程乐趣在于编写自己的函数;另一方面,要提高编程效率,本章和第 8 章介绍如何定义函数、给函数传递信息以及从函数那里获得信息。
130 0
|
存储 编解码 JSON
Python编程从入门到实践-读书笔记(下)
基础知识重点摘录 字符串 在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。这种灵活性让你能够在字符串中包含引号和撇号:
|
存储 JSON 测试技术
Python编程从入门到实践-读书笔记(上)
基础知识重点摘录 字符串 在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。这种灵活性让你能够在字符串中包含引号和撇号:
|
6月前
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
6月前
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
|
6月前
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计