Optimization 优化

PCI里面介绍了两个算法:simulated annealing,模拟退火和genetic algorithms,遗传算法。

无论哪种优化算法,这里都需要一个代价计算函数来判定计算过程中产生的结果的好坏

sa要设置一个较高的初始温度,按照由快变慢的速度在迭代过程中降温

算法是同一个随机结果开始,在解向量空间的某一维度上做一个小的随机变化而生成一个新的解。用代价函数来判断新解的好坏,如果好,就作为下一次迭代的初始值;如果坏,也给人家一定的几率来继续下去。这个几率是根据温度来计算的,所以当计算刚开始的时候,结果有较大的几率变坏,这样是为了避免受限于局部最优值。

ga的灵感来自于基因进化。

算法是从一组随机生成的解开始。用代价函数计算解的优劣,选取最好的解进行进化得到下一次迭代的解集。

进化的方法有两种:mutation和combination(crossover or breeding)。

当经过若干代演化解集不再优化或者达到迭代次数上限时算法结束。

其实PCI里面还有个Hill Climbing,爬山算法也是用来做优化的。

hc是从一个随机解开始,找到这个解所有临近的向量(就是在每个维度上做一个小的变化),然后找出最优的解作为下一步迭代的起始值。

k-Nearest Neighbors kNN(不要问我叫什么)
PCI里面用kNN做了一个价格预测模型,还有一个简单的电影喜好预测。简单来说就是要对一个东西做数值预测,就要先有一堆已经有数值的东西,从里面找出和要预测的东西相似的,再通过计算这些相似东西的均值来作出预测。

kNN里面首先遇到的问题是如何定义“相似”。

把物品的各种属性量化,这样就构成了一个若干维度的向量空间。于是我们说相似就是离得近。这个量化的时候学问很大,毕竟各种不同的属性用不同的量化方法算出来的数值千差百异。所以还要根据各自的重要性进行伸缩调整,不重要的干脆就乘以一个零直接去掉省心。这是一个非常费心的活儿。不同的问题伸缩系数肯定各异,如何来确定这些系数就要加上主观判断、反复调整、结果比较、cross validation。这个时候优化算法是个不错的选择。这个我们后面还会提到。

怎么计算离得近呢?方法很多,PCI给了几个:欧式距离,Pearson相关度和Tanimoto分数。具体如何计算就不重复了,让我重复也重复不出来。

当然只选择一个最相似的来进行预测是不够准确的,所以有了k——选k个最相似的来平均——这就是kNN的来历。

如何计算平均也是一个很有意思的事情。直接把k个数值加起来一除可以,就是有点简单粗暴,不像读书人做的事情,虽然暴力美有时候也是很诱人的。更合理一点的方法是给不同的数值分配权值,离得近的权重大一点,远的就小一点。突然想起来原来的万有引力公式,牛老大也喜欢近的,不知道能不能改叭改叭拿过来用。

优点
即使在复杂数值预测问题中依然理解,对系数调整的经验在处理类似问题时依然很有帮助。
伸缩系数的调整不仅可以改善预测的结果,也说明了对应属性的重要性。
随时可以增大数据集

缺点
计算量大
调整系数很烦人

Clustering 聚类

层次聚类和K-means聚类都不做预测,所以也就不需要训练。PCI里面举了一个给blog分类的例子。

层次聚类很简单,第一步的工作也是先量化,构建向量空间,然后不断寻找最接近的两个向量并合并他们作为一个新的聚类向量,直到最后只剩下一个聚类为止。

K-means聚类(又是k?!)有所不同。它先任意在向量空间中挑出k个点,然后把所有向量按照和这k个点的远近划分成组,每个向量加入距离最近的点所代表的组。然后计算每组的重心,把代表小组的点的位置调整到这个重心上,再重复上面的计算,知道所有的向量分组不再变化为止。

K-means需要你来确定这个K个点的初始位置,这里面没有什么好办法。

Neural Networks 神经网络(是这么说吧)

nn可以用来做分类和数值型预测。nn有很多类型,PCI里面介绍的是一种多层认知网络,有一层输入神经元和若干层(这里是一层)隐藏神经元。每个神经元有自己的输出值,连接神经元的突触有各自的权重。

使用nn计算的方法叫feed forward,是通过对所有连接到这个节点上一层神经元的输出值与相应的突触权重的乘积求和再用tanh(PCI里面)计算得到的。最后一层的所有输出值可以用来帮助挑选结果。这个过程中对神经元输出的改变保留在nn中。

PCI里面用了一个通过记录搜索引擎用户点击结果的日志来训练的nn实例。搜索关键词或者关键词的组合作为样本中的输入数据,而用户最终的点击的搜索结果集中的链接作为样本中的输出数据。隐藏层的节点表示不同输入之间的组合。

nn可以使用随机值作为突触的权重,而且单个输入值和输出没有直接概率联系(因为网络是通过输入值的组合的集合来计算的,这和贝叶斯的概率矩阵不一样。当然如果所有的输入都是单个值的话那就和贝叶斯一样了),所以不能像贝叶斯那样直接把输入扔进去来修正网络中突触的权重。nn的一种训练方法是back propagate(叫反向传播?)。

bp的方法是先用现有网络计算输出,然后和给定的样本输出比较,计算得到误差,用误差来修正隐藏层突触的权重,再计算隐藏层的误差,来修正输入层。

优点:
支持增量训练
适应任何类型输入
缺点:
这是一个黑盒过程,中间的隐藏层很难解释出具体含义
对于训练频率和网络大小没有固定固定规律可循,多是通过实验得到

对于nn的黑盒特性倒是想说两句,nn本来就是仿生的方式解决问题,我们自己的神经系统也就这样。感应电流从神经末梢沿着神经线传入大脑以后谁知道是按照哪条固定线路走的啊,用科学家的话,那是刺激了大脑中的某个区域。但是具体是这个区域中的那个或者那几个细胞在起决定作用就说不清楚了。

其实对于面向某些领域的nn来说,生物的神经系统倒是可以更多的借鉴,可以对输入和输出做划分,毕竟手上传来的感觉对管脚丫子的大脑皮层区域影响微乎其微。

Support-Vector Machines 支持向量机 (感谢好同学的解释)

这是PCI里面最复杂的分类算法。svm可以计算数值数据集应该属于的分类。它在目标平面(空间)里计算出分割线(面)来把数据集划分成属于不同类型的区域,以使表示数据的点到分割线(平面)的距离最大。有时候需要对数据集进行变换使同一类数据相对集中,不同类别相对分的清一点。这叫Kernel trick或者Kernel method。

问题的关键是找到分割线(面)。这就要靠那些可能靠近分割线(面)的数据点了。这些点我们称为支持向量,这也是这个算法名称的由来。但是至于如何找这些点和通过这些点来找分割线(面)PCI就没有交代了,原因是太复杂(毕竟是应用型的书啊),只是用了一个现成的libsvm :-(

svm的训练只要是通过cross validation来迭代改进,这需要有大量样本数据才能得到很好的结果。所以svm也只适合于大数据量的分类。

优点:
很好很强大
速度快
可以处理不同类型数据(要转换成数值)
缺点:
好的核变换算法不好找,而且没有通用的方法来找
cross validation需要有大量数据做基础

就按照最后一章的顺序来说吧。很多名字都不知道中文该怎么说,就直接用英文名称了。

Naive Bayesian Classifier 朴素贝叶斯分类器
nb算法是通过学习样本中已经分类的条目,计算生成条目中的特性相对于类别的概率矩阵,然后根据待分类条目中特性在这个矩阵中的值来反向计算条目的类别概率。

P(Category|Item)=P(Item|Category)*P(Category)/P(Item)

在静态样本中,P(Item)是固定的,所以可以去掉简化计算。但是如果样本集是动态的,就需要考虑进来。

P(Item|Category)=P(Feature1|Category)*P(Feature2|Category)*...

优点:
速度快
增量训练时可以不使用旧样本
容易理解
分类效果往往比想象的好
缺点:
对于内容庞杂的大分类来说效果不太好,特别是出现比较中性的特性组合时更是如此。

Decision Tree Classifier 决策树
dt算法进行分类计算是很简单直观的,它的技巧在于决策树的构造过程。样本是已知的条件结果数据矩阵,需要决定的是用来分类的条件顺序。为了得到这个顺序,就要针对每个条件计算单纯应用这个条件分类后结果的混合度,也就是看用哪个条件来分可以分得更清楚一些。确定了最好的分类条件,就把数据分开成若干子集,对每个子集再计算最佳分类条件,以此类推,直到子集只包含一个结果或者达到某些终止条件。

dt算法有两个有意思的地方。一是如何计算应用某个条件得到的分类结果的混合度。书里面给了一个简单的计数算法和一个熵算法(好亲切啊)。

p(i)=frequency(outcome)=count(outcome)/count(total rows)
Entropy=sum of p(i)*log(p(i) for all outcomes

进一步计算information gain:
weight1 = size of subset1 / size of original set
weight2 = size of subset2 / size of original set
gain = entropy(original) – weight1*entropy(set1) – weight2*entropy(set2)

另外一个有意思的地方是对不同类型的条件数据如何选择分类点。对于是否问题这个比较容易解决,但是对于数值或者字符串或者更复杂的类型就要特殊情况特殊处理了。

优点:
结果简洁直观
可以处理不同的条件数据类型
缺点:
不能通过增量训练来改进,生成决策树必须使用整个已知样本集。
大数据集可能存在的众多条件会产生巨大繁杂的决策树,分类计算会变得缓慢。

转自:http://www.cnblogs.com/ysjxw/category/128788.html

An Algorithm Summary of Programming Collective Intelligence相关推荐

  1. An Algorithm Summary of Programming Collective Intelligence (1)

    就按照最后一章的顺序来说吧.很多名字都不知道中文该怎么说,就直接用英文名称了. Naive Bayesian Classifier 朴素贝叶斯分类器 nb算法是通过学习样本中已经分类的条目,计算生成条 ...

  2. programming collective intelligence 读书笔记(一):配置eclipse+pydev环境,运行delicious模块

    快考toefl了,又产生了考前综合症,只能看看 programming collective intellifence放松放松..哎革命尚未成功,同志还需努力,什么时候不用再去考试.. 闲话不说了,在 ...

  3. 《 Programming Collective Intelligence》案例介绍与分析——Making Recommendations

    Making Recommendations 本文将展示如何使用一群人的偏好向其他人提出建议.此类信息有许多应用,例如在线购物推荐产品,推荐有趣的网站或帮助人们查找音乐和电影.本文将展示如何建立一个系 ...

  4. Redis Essentials 读书笔记 - 第九章: Redis Cluster and Redis Sentinel (Collective Intelligence)

    Chapter 9. Redis Cluster and Redis Sentinel (Collective Intelligence) 上一章介绍了复制,一个master可以对应一个或多个slav ...

  5. Re23:读论文 How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence

    诸神缄默不语-个人CSDN博文目录 论文名称:How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence ...

  6. Algorithm summary

    2018.5.24日更新: 去掉原文中的目录,修正了目前我发现的错别字(其实也没几个,但是本着严谨的态度我还是决定修改过来),增添了部分代码注释(发现自己写的代码现在竟然看不懂,只能强行加注释了-) ...

  7. 《转》推荐系统经典论文文献及业界应用

    转载自http://semocean.com 列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的推荐系统相关的工具:同时给出参加过及未参加过的业界推荐引擎应用交流资料 ...

  8. Apache Mahout 简介 通过可伸缩、商业友好的机器学习来构建智能应用程序

    在信息时代,公司和个人的成功越来越依赖于迅速有效地将大量数据转化为可操作的信息.无论是每天处理数以千计的个人电子邮件消息,还是从海量博客文章中推测用户的意图,都需要使用一些工具来组织和增强数据. 这其 ...

  9. Apache Mahout 简介

    Apache Mahout 简介 通过可伸缩.商业友好的机器学习来构建智能应用程序 当研究院和企业能获取足够的专项研究预算之后,能从数据和用户输入中学习的智能应用程序将变得更加常见.人们对机器学习技巧 ...

最新文章

  1. 【数据库】适用于SQLite的SQL语句(一)
  2. 中国如何赢得新一轮超算竞赛?关键在向数据密集型超算转变
  3. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
  4. 2020边缘计算状态报告:2028年企业IT基础设施边缘支出将达87亿美元
  5. ssm创建一个查询接口
  6. 进程比线程更多资源_为什么我们不应该使用比我们需要更多的线程
  7. 看这玩意复习你还会挂科?《网络原理篇》
  8. CPU的大端模式(big endian)和小端(little endian)模式
  9. Spring Cloud Alibaba Sentinel之持久化篇
  10. Lottie 动画AE+Bodymovin导出的JSON文件解读
  11. Postman下载安装
  12. windows 清理助手 3.1
  13. 电视剧《勇敢的心》观后感
  14. 线性二分类——机器学习
  15. 计算机毕业设计源码分享双鱼林,双鱼林SSM图书信息管理系统毕业课程设计源码 - WEB源码|源代码 - 源码中国...
  16. 中国香水市场深度调查研究报告
  17. mysql 将数据导出成excel文件(.xls格式)
  18. kaldi debug:Failed to read token [started at file position -1], expected IvectorExtractorStats
  19. 《软件工程》课程获奖感言
  20. 面试官:你连SSO都不懂,就别来面试了

热门文章

  1. leetcode_最长回文字符串
  2. leetcode_add_two_numbers
  3. [云炬创业基础笔记]第二章创业者测试1
  4. 第02课:深度学习 Python 必备知识点
  5. VTK修炼之道7_三维场景基本要素:光照
  6. [OS复习]操作系统综述1
  7. Win32下病毒设计入门详细解说
  8. c++反射机制(vcl实现),mfc可依样实现
  9. 程序员面试系列——插入排序
  10. 自定义 Spring Boot Starter