提交 294b3c2a 编写于 作者: 片刻小哥哥's avatar 片刻小哥哥

修改中文符号为英文

上级 1a1ac081
language: node_js # 构建所需的语言环境
node_js:
- "v10.16.0" # 对应的版本
branches:
only:
- master # 构建的分支
cache:
directories:
- node_modules # 依赖缓存的目录
install:
- npm install -g gitbook-cli # 安装编译工具
- gitbook fetch 3.2.3 # 安装 Gitbook 子版本
script:
- sh run_website.sh
after_script:
- cd _book
- git init
- git config user.name ${GH_UN}
- git config user.email ${GH_EMAIL}
- git add -A
- git commit -am "$(date "+%Y-%m-%d %H:%M:%S")"
- git push "https://${GH_TOKEN}@github.com/${GH_USER}/${GH_REPO}.git" master:${GH_BRANCH} -f
env:
global:
- GH_UN=jiangzhonglian
- GH_EMAIL=jiang-s@163.com
- GH_USER=apachecn
- GH_REPO=pytorch-doc-zh
- GH_BRANCH=gh-pages
......@@ -16,7 +16,7 @@
* **我们不是 Apache 的官方组织/机构/团体,只是 Apache 技术栈(以及 AI)的爱好者!**
* **ApacheCN - 学习群【724187166】<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=51040bbd0bf7d0efbfa7256a0331d912a2055a906c324d52b02371d06f3c9878"><img border="0" src="http://data.apachecn.org/img/logo/ApacheCN-group.png" alt="ApacheCN - 学习机器学习群[724187166]" title="ApacheCN - 学习机器学习群[724187166]"></a>**
> **欢迎任何人参与和完善一个人可以走的很快,但是一群人却可以走的更远**
> **欢迎任何人参与和完善: 一个人可以走的很快,但是一群人却可以走的更远**
# 路线图
......@@ -33,7 +33,7 @@
* 机器学习下载地址: <https://github.com/apachecn/data/tree/master/机器学习>
* 深度学习数据地址: <https://github.com/apachecn/data/tree/master/深度学习>
* 推荐系统数据地址: <https://github.com/apachecn/data/tree/master/推荐系统>
* 视频网站优酷 /bilibili / Acfun / 网易云课堂,可直接在线播放。(最下方有相应链接)
* 视频网站: 优酷 /bilibili / Acfun / 网易云课堂,可直接在线播放。(最下方有相应链接)
* -- 推荐 [红色石头](https://github.com/RedstoneWill): [台湾大学林轩田机器学习笔记](https://github.com/apachecn/ntu-hsuantienlin-ml)
* -- 推荐 [机器学习笔记](https://feisky.xyz/machine-learning): https://feisky.xyz/machine-learning
......@@ -175,11 +175,11 @@
当然我知道,第一句就会被吐槽,因为科班出身的人,不屑的吐了一口唾沫,说傻X,还评论 Andrew Ng 的视频。。
我还知道还有一部分人,看 Andrew Ng 的视频就是看不懂,那神秘的数学推导,那迷之微笑的英文版的教学,我何尝又不是这样走过来的?? 我的心可能比你们都痛,因为我在网上收藏过上10部《机器学习》相关视频,外加国内本土风格的教程:7月+小象 等等,我都很难去听懂,直到有一天,被一个百度的高级算法分析师推荐说:《机器学习实战》还不错,通俗易懂,你去试试??
我还知道还有一部分人,看 Andrew Ng 的视频就是看不懂,那神秘的数学推导,那迷之微笑的英文版的教学,我何尝又不是这样走过来的?? 我的心可能比你们都痛,因为我在网上收藏过上10部《机器学习》相关视频,外加国内本土风格的教程: 7月+小象 等等,我都很难去听懂,直到有一天,被一个百度的高级算法分析师推荐说: 《机器学习实战》还不错,通俗易懂,你去试试??
我试了试,还好我的Python基础和调试能力还不错,基本上代码都调试过一遍,很多高大上的 "理论+推导",在我眼中变成了几个 "加减乘除+循环",我想这不就是像我这样的程序员想要的入门教程么?
很多程序员说机器学习 TM 太难学了,是的,真 TM 难学,我想最难的是没有一本像《机器学习实战》那样的作者愿意以程序员 Coding 角度去给大家讲解!!
很多程序员说机器学习 TM 太难学了,是的,真 TM 难学,我想最难的是: 没有一本像《机器学习实战》那样的作者愿意以程序员 Coding 角度去给大家讲解!!
最近几天,GitHub 涨了 300颗 star,加群的200人, 现在还在不断的增加++,我想大家可能都是感同身受吧!
......@@ -265,15 +265,15 @@ WordNet可以被看作是一个同义词词典
```python
自从学习NLP以后才发现国内与国外的典型区别:
1. 对资源的态度是完全相反的:
1) 国内就好像为了名气举办工作装逼的会议就是没有干货全部都是象征性的PPT介绍不是针对在做的各位
2国外就好像是为了推动nlp进步一样分享者各种干货资料和具体的实现。(特别是: python自然语言处理
2. 论文的实现
1) 国内: 就好像为了名气举办工作装逼的会议就是没有干货全部都是象征性的PPT介绍不是针对在做的各位
2国外: 就好像是为了推动nlp进步一样分享者各种干货资料和具体的实现。(特别是: python自然语言处理
2. 论文的实现:
1) 各种高大上的论文实现却还是没看到一个像样的GitHub项目!(可能我的搜索能力差了点一直没找到
2国外就不举例了我看不懂
3. 开源的框架
1国外的开源框架 tensorflow/pytorch 文档+教程+视频官方提供
1国外的开源框架: tensorflow/pytorch 文档+教程+视频官方提供
2) 国内的开源框架: 额额还真举例不出来但是牛逼吹得不比国外差!(MXNet虽然有众多国人参与开发但不能算是国内开源框架基于MXNet的动手学深度学习(http://zh.d2l.ai & https://discuss.gluon.ai/t/topic/753)中文教程,已经由沐神(李沐)以及阿斯顿·张讲授录制公开发布(文档+第一季教程+视频)。)
每一次深入都要去翻墙每一次深入都要Google每一次看着国内的说哈工大讯飞中科大百度阿里多牛逼但是资料还是得国外去找
每一次深入都要去翻墙每一次深入都要Google每一次看着国内的说: 哈工大讯飞中科大百度阿里多牛逼但是资料还是得国外去找
有时候真的挺恨的真的有点瞧不起自己国内的技术环境
当然谢谢国内很多博客大佬特别是一些入门的Demo和基本概念。【深入的水平有限没看懂
......@@ -318,7 +318,7 @@ WordNet可以被看作是一个同义词词典
### 应用领域
#### 中文分词
#### 中文分词:
* 构建DAG图
* 动态规划查找,综合正反向(正向加权反向输出)求得DAG最大概率路径
......@@ -334,19 +334,19 @@ WordNet可以被看作是一个同义词词典
2. [IMDB电影评论情感分类(斯坦福)](http://ai.stanford.edu/~amaas/data/sentiment)。来自网站imdb.com的一系列电影评论及其积极或消极的情绪。
3. [新闻组电影评论情感分类(康奈尔)](http://www.cs.cornell.edu/people/pabo/movie-review-data/)。来自网站imdb.com的一系列电影评论及其积极或消极的情绪。
有关更多信息,请参阅帖子
有关更多信息,请参阅帖子:
[单标签文本分类的数据集](http://ana.cachopo.org/datasets-for-single-label-text-categorization)
> 情感分析
比赛地址: https://www.kaggle.com/c/word2vec-nlp-tutorial
* 方案一(0.86)WordCount + 朴素 Bayes
* 方案二(0.94)LDA + 分类模型(knn/决策树/逻辑回归/svm/xgboost/随机森林)
* 方案一(0.86): WordCount + 朴素 Bayes
* 方案二(0.94): LDA + 分类模型(knn/决策树/逻辑回归/svm/xgboost/随机森林)
* a) 决策树效果不是很好,这种连续特征不太适合的
* b) 通过参数调整 200 个topic,信息量保存效果较优(计算主题)
* 方案三(0.72)word2vec + CNN
* 说实话没有一个好的机器,是调不出来一个好的结果 (: 逃
* 方案三(0.72): word2vec + CNN
* 说实话: 没有一个好的机器,是调不出来一个好的结果 (: 逃
**通过AUC 来评估模型的效果**
......@@ -359,7 +359,7 @@ WordNet可以被看作是一个同义词词典
下面是一些很好的初学者语言建模数据集。
1. [古腾堡项目](https://www.gutenberg.org/),一系列免费书籍,可以用纯文本检索各种语言。
2. 还有更多正式的语料库得到了很好的研究; 例如
2. 还有更多正式的语料库得到了很好的研究; 例如:
[布朗大学现代美国英语标准语料库](https://en.wikipedia.org/wiki/Brown_Corpus)。大量英语单词样本。
[谷歌10亿字语料库](https://github.com/ciprian-chelba/1-billion-word-language-modeling-benchmark)
......@@ -387,7 +387,7 @@ mage字幕是为给定图像生成文本描述的任务。
1. [上下文中的公共对象(COCO)](http://mscoco.org/dataset/#overview)。包含超过12万张带描述的图像的集合
2. [Flickr 8K](http://nlp.cs.illinois.edu/HockenmaierGroup/8k-pictures.html)。从flickr.com获取的8千个描述图像的集合。
3. [Flickr 30K](http://shannon.cs.illinois.edu/DenotationGraph/)。从flickr.com获取的3万个描述图像的集合。
欲了解更多,请看帖子
欲了解更多,请看帖子:
[探索图像字幕数据集,2016年](http://sidgan.me/technical/2016/01/09/Exploring-Datasets)
......@@ -399,7 +399,7 @@ mage字幕是为给定图像生成文本描述的任务。
1. [加拿大第36届议会的协调国会议员](https://www.isi.edu/natural-language/download/hansard/)。成对的英语和法语句子。
2. [欧洲议会诉讼平行语料库1996-2011](http://www.statmt.org/europarl/)。句子对一套欧洲语言。
有大量标准数据集用于年度机器翻译挑战; 看到
有大量标准数据集用于年度机器翻译挑战; 看到:
[统计机器翻译](http://www.statmt.org/)
......@@ -417,9 +417,9 @@ mage字幕是为给定图像生成文本描述的任务。
1. [斯坦福问题回答数据集(SQuAD)](https://rajpurkar.github.io/SQuAD-explorer/)。回答有关维基百科文章的问题。
2. [Deepmind问题回答语料库](https://github.com/deepmind/rc-data)。从每日邮报回答有关新闻文章的问题。
3. [亚马逊问答数据](http://jmcauley.ucsd.edu/data/amazon/qa/)。回答有关亚马逊产品的问题。
有关更多信息,请参阅帖子
有关更多信息,请参阅帖子:
[数据集我如何获得问答网站的语料库,如Quora或Yahoo Answers或Stack Overflow来分析答案质量?](https://www.quora.com/Datasets-How-can-I-get-corpus-of-a-question-answering-website-like-Quora-or-Yahoo-Answers-or-Stack-Overflow-for-analyzing-answer-quality)
[数据集: 我如何获得问答网站的语料库,如Quora或Yahoo Answers或Stack Overflow来分析答案质量?](https://www.quora.com/Datasets-How-can-I-get-corpus-of-a-question-answering-website-like-Quora-or-Yahoo-Answers-or-Stack-Overflow-for-analyzing-answer-quality)
#### 6.语音识别(Speech Recognition)
......@@ -440,7 +440,7 @@ mage字幕是为给定图像生成文本描述的任务。
1. [法律案例报告数据集](https://archive.ics.uci.edu/ml/datasets/Legal+Case+Reports)。收集了4000份法律案件及其摘要。
2. [TIPSTER文本摘要评估会议语料库](http://www-nlpir.nist.gov/related_projects/tipster_summac/cmp_lg.html)。收集了近200份文件及其摘要。
3. [英语新闻文本的AQUAINT语料库](https://catalog.ldc.upenn.edu/LDC2002T31)。不是免费的,而是广泛使用的。新闻文章的语料库。
欲了解更多信息
欲了解更多信息:
[文档理解会议(DUC)任务](http://www-nlpir.nist.gov/projects/duc/data.html)
[在哪里可以找到用于文本摘要的良好数据集?](https://www.quora.com/Where-can-I-find-good-data-sets-for-text-summarization)
......@@ -474,7 +474,7 @@ mage字幕是为给定图像生成文本描述的任务。
如果您希望更深入,本节提供了其他数据集列表。
1. [维基百科研究中使用的文本数据集](https://en.wikipedia.org/wiki/List_of_datasets_for_machine_learning_research#Text_data)
2. [数据集计算语言学家和自然语言处理研究人员使用的主要文本语料库是什么?](https://www.quora.com/Datasets-What-are-the-major-text-corpora-used-by-computational-linguists-and-natural-language-processing-researchers-and-what-are-the-characteristics-biases-of-each-corpus)
2. [数据集: 计算语言学家和自然语言处理研究人员使用的主要文本语料库是什么?](https://www.quora.com/Datasets-What-are-the-major-text-corpora-used-by-computational-linguists-and-natural-language-processing-researchers-and-what-are-the-characteristics-biases-of-each-corpus)
3. [斯坦福统计自然语言处理语料库](https://nlp.stanford.edu/links/statnlp.html#Corpora)
4. [按字母顺序排列的NLP数据集列表](https://github.com/niderhoff/nlp-datasets)
5. [该机构NLTK](http://www.nltk.org/nltk_data/)
......
......@@ -10,7 +10,7 @@
+ [第7章_集成方法](docs/ml/7.集成方法-随机森林和AdaBoost.md)
+ [第8章_回归](docs/ml/8.回归.md)
+ [第9章_树回归](docs/ml/9.树回归.md)
+ [第10章_KMeans聚类](docs/ml/10.k-means聚类.md)
+ [第10章_KMeans聚类](docs/ml/10.KMeans聚类.md)
+ [第11章_Apriori算法](docs/ml/11.使用Apriori算法进行关联分析.md)
+ [第12章_FP-growth算法](docs/ml/12.使用FP-growth算法来高效发现频繁项集.md)
+ [第13章_PCA降维](docs/ml/13.利用PCA来简化数据.md)
......
google.com, pub-3565452474788507, DIRECT, f08c47fec0942fa0
\ No newline at end of file
{
"title" : "Pytorch 中文文档",
"author" : "ApacheCN",
"description" : "Pytorch 中文文档: 教程和文档",
"language" : "zh-hans",
"plugins": [
"github",
"github-buttons",
"-sharing",
"insert-logo",
"sharing-plus",
"back-to-top-button",
"code",
"copy-code-button",
"katex",
"pageview-count",
"edit-link",
"emphasize",
"alerts",
"auto-scroll-table",
"popup",
"hide-element",
"page-toc-button",
"tbfed-pagefooter",
"sitemap",
"advanced-emoji",
"expandable-chapters",
"splitter",
"search-pro"
],
"pluginsConfig": {
"github": {
"url": "https://github.com/apachecn/pytorch-doc-zh"
},
"github-buttons": {
"buttons": [
{
"user": "apachecn",
"repo": "pytorch-doc-zh",
"type": "star",
"count": true,
"size": "small"
}
]
},
"insert-logo": {
"url": "http://data.apachecn.org/img/logo.jpg",
"style": "background: none; max-height: 150px; min-height: 150px"
},
"hide-element": {
"elements": [".gitbook-link"]
},
"edit-link": {
"base": "https://github.com/apachecn/pytorch-doc-zh/blob/master",
"label": "编辑本页"
},
"sharing": {
"qzone": true,
"weibo": true,
"twitter": false,
"facebook": false,
"google": false,
"qq": false,
"line": false,
"whatsapp": false,
"douban": false,
"all": [
"qq", "douban", "facebook", "google", "linkedin", "twitter", "weibo", "whatsapp"
]
},
"page-toc-button": {
"maxTocDepth": 4,
"minTocSize": 4
},
"tbfed-pagefooter": {
"copyright":"Copyright &copy ibooker.org.cn 2019",
"modify_label": "该文件修订时间: ",
"modify_format": "YYYY-MM-DD HH:mm:ss"
},
"sitemap": {
"hostname": "http://pytorch.apachecn.org"
}
},
"my_links" : {
"sidebar" : {
"Home" : "https://www.baidu.com"
}
},
"my_plugins": [
"donate",
"todo",
"-lunr",
"-search",
"expandable-chapters-small",
"chapter-fold",
"expandable-chapters",
"expandable-chapters-small",
"back-to-top-button",
"ga",
"baidu",
"sitemap",
"tbfed-pagefooter",
"advanced-emoji",
"sectionx",
"page-treeview",
"simple-page-toc",
"ancre-navigation",
"theme-apachecn@git+https://github.com/apachecn/theme-apachecn#HEAD",
"pagefooter-apachecn@git+https://github.com/apachecn/gitbook-plugin-pagefooter-apachecn#HEAD"
],
"my_pluginsConfig": {
"github-buttons": {
"buttons": [
{
"user": "apachecn",
"repo": "pytorch-doc-zh",
"type": "star",
"count": true,
"size": "small"
},
{
"user": "apachecn",
"width": "160",
"type": "follow",
"count": true,
"size": "small"
}
]
},
"ignores": ["node_modules"],
"simple-page-toc": {
"maxDepth": 3,
"skipFirstH1": true
},
"page-toc-button": {
"maxTocDepth": 2,
"minTocSize": 2
},
"page-treeview": {
"copyright": "Copyright &#169; aleen42",
"minHeaderCount": "2",
"minHeaderDeep": "2"
},
"donate": {
"wechat": "微信收款的二维码URL",
"alipay": "支付宝收款的二维码URL",
"title": "",
"button": "赏",
"alipayText": "支付宝打赏",
"wechatText": "微信打赏"
},
"page-copyright": {
"description": "modified at",
"signature": "你的签名",
"wisdom": "Designer, Frontend Developer & overall web enthusiast",
"format": "YYYY-MM-dd hh:mm:ss",
"copyright": "Copyright &#169; 你的名字",
"timeColor": "#666",
"copyrightColor": "#666",
"utcOffset": "8",
"style": "normal",
"noPowered": false
},
"ga": {
"token": "UA-102475051-10"
},
"baidu": {
"token": "75439e2cbd22bdd813226000e9dcc12f"
},
"pagefooter-apachecn": {
"copyright":"Copyright &copy ibooker.org.cn 2019",
"modify_label": "该文件修订时间: ",
"modify_format": "YYYY-MM-DD HH:mm:ss"
}
}
}
此差异已折叠。
......@@ -88,7 +88,7 @@ model = Sequential()
# 其输出数组的尺寸为 (*, 32)
model.add(Dense(32, input_shape=(16,)))
# 在第一层之后,你就不再需要指定输入的尺寸了
# 在第一层之后,你就不再需要指定输入的尺寸了:
model.add(Dense(32))
```
......
......@@ -6,13 +6,13 @@
> 硬件要求
支持以下启用GPU的设备
支持以下启用GPU的设备:
* 具有CUDA®Compute Capability 3.5或更高版本的NVIDIA®GPU卡。请参阅[支持CUDA的GPU卡](https://developer.nvidia.com/cuda-gpus)列表 。
> 软件需求
您的系统上必须安装以下NVIDIA®软件
您的系统上必须安装以下NVIDIA®软件:
* NVIDIA®GPU [驱动程序](https://www.nvidia.com/drivers) CUDA 10.0需要410.x或更高版本。
* [CUDA®工具包](https://developer.nvidia.com/cuda-toolkit-archive) - TensorFlow支持CUDA 10.0(TensorFlow> = 1.13.0)
......@@ -48,15 +48,15 @@ $ sudo apt-get install --no-install-recommends nvidia-430 -y
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
将会同时安装下列软件
将会同时安装下列软件:
lib32gcc1 libc-dev-bin libc6 libc6-dbg libc6-dev libc6-i386
建议安装
建议安装:
glibc-doc
推荐安装
推荐安装:
libcuda1-430 nvidia-opencl-icd-430
下列【新】软件包将被安装
下列【新】软件包将被安装:
lib32gcc1 libc6-i386 nvidia-430
下列软件包将被升级
下列软件包将被升级:
libc-dev-bin libc6 libc6-dbg libc6-dev
升级了 4 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 260 个软件包未被升级。
需要下载 99.7 MB/111 MB 的归档。
......@@ -85,19 +85,19 @@ update-initramfs: Generating /boot/initrd.img-4.10.0-28-generic
$ sudo nvidia-smi
```
这里面大家需要注意的是 采用在终端输入 `ubuntu-drivers devices` 会提示推荐你用什么版本,我的设备显示不出来,所以安装的是418.43这个型号的驱动。(目前最新版本)
这里面大家需要注意的是: 采用在终端输入 `ubuntu-drivers devices` 会提示推荐你用什么版本,我的设备显示不出来,所以安装的是418.43这个型号的驱动。(目前最新版本)
注意事项一官网下载地址
推荐网址(https://www.geforce.cn/drivers)只有这个GeForce型号的,别的型号推荐去其对应的网址查询。
注意事项一: 官网下载地址
推荐网址: (https://www.geforce.cn/drivers)只有这个GeForce型号的,别的型号推荐去其对应的网址查询。
注意事项二不要在下面这个网址下载,不是不能,最直接的官网,对应的东西最新,也最详细
注意事项二: 不要在下面这个网址下载,不是不能,最直接的官网,对应的东西最新,也最详细
网址如下(https://www.nvidia.com/Download/index.aspx?lang=cn)
理由
理由:
* (1)上面的网址,选择驱动型号,点进去可以看到许多详细的信息,尤其是它支持什么样的显卡,都有,特别详细。
* (2)这个网址在我写博客(2019.3.6)为止,还没有GTX1660Ti的Ubuntu驱动
注意事项三具体操作见网上别人写好的。
注意事项三: 具体操作见网上别人写好的。
## 2.安装 CUDA 1.0 + cuDNN 7
......@@ -105,16 +105,16 @@ $ sudo nvidia-smi
下面这个网址是tensorflow各环境参数对应版本图(https://tensorflow.google.cn/install/source)可供参考。cuda和cudnn对应关系应该没问题,但是tensorflow版本不能过高,否则会出错。
注意事项一下载地址
cuda下载网址为:(https://developer.nvidia.com/),右上角搜索“CUDA Toolkit Archive”,点击第一个(最新的)的进去,里面有许多版本可供选择,切记!切记!切记!目前网友的说法是:tensorflow只能支持cuda9.0及以下版本。
注意事项一: 下载地址
cuda下载网址为: (https://developer.nvidia.com/),右上角搜索“CUDA Toolkit Archive”,点击第一个(最新的)的进去,里面有许多版本可供选择,切记!切记!切记!目前网友的说法是: tensorflow只能支持cuda9.0及以下版本。
注意事项二选择run下载,而不选择del
注意事项二: 选择run下载,而不选择del
这个具体是什么原因,没搞明白,网友也强烈推荐run,我之前试过del的,失败了,所以大家尽量采用run这种方法。可能有人没明白说明意思,你在选择的时候多留个心眼就注意到了。
> cuDNN
官网网址如下
网址<https://developer.nvidia.com/cudnn>
网址: <https://developer.nvidia.com/cudnn>
需要注册,我是从别人那直接过来的,就没注册,大家需要的自己去,这个安装相对简单。
同样有验证的过程,这个相对来说是简单的,没什么需要太注意的,跟着网上的走就好了。
......
......@@ -32,7 +32,7 @@ print(tf.__version__)
IMDB 数据集已经打包在 Tensorflow 中。该数据集已经经过预处理,评论(单词序列)已经被转换为整数序列,其中每个整数表示字典中的特定单词。
以下代码将下载 IMDB 数据集到您的机器上(如果您已经下载过将从缓存中复制)
以下代码将下载 IMDB 数据集到您的机器上(如果您已经下载过将从缓存中复制):
```python
......@@ -46,14 +46,14 @@ imdb = keras.datasets.imdb
## 探索数据
让我们花一点时间来了解数据格式。该数据集是经过预处理的每个样本都是一个表示影评中词汇的整数数组。每个标签都是一个值为 0 或 1 的整数值,其中 0 代表消极评论,1 代表积极评论。
让我们花一点时间来了解数据格式。该数据集是经过预处理的: 每个样本都是一个表示影评中词汇的整数数组。每个标签都是一个值为 0 或 1 的整数值,其中 0 代表消极评论,1 代表积极评论。
```python
print("Training entries: {}, labels: {}".format(len(train_data), len(train_labels)))
```
评论文本被转换为整数值,其中每个整数代表词典中的一个单词。首条评论是这样的
评论文本被转换为整数值,其中每个整数代表词典中的一个单词。首条评论是这样的:
```python
......@@ -74,7 +74,7 @@ len(train_data[0]), len(train_data[1])
### 将整数转换回单词
了解如何将整数转换回文本对您可能是有帮助的。这里我们将创建一个辅助函数来查询一个包含了整数到字符串映射的字典对象
了解如何将整数转换回文本对您可能是有帮助的。这里我们将创建一个辅助函数来查询一个包含了整数到字符串映射的字典对象:
```python
......@@ -94,7 +94,7 @@ def decode_review(text):
return ' '.join([reverse_word_index.get(i, '?') for i in text])
```
现在我们可以使用 `decode_review` 函数来显示首条评论的文本
现在我们可以使用 `decode_review` 函数来显示首条评论的文本:
```python
......@@ -103,7 +103,7 @@ decode_review(train_data[0])
## 准备数据
影评——即整数数组必须在输入神经网络之前转换为张量。这种转换可以通过以下两种方式来完成
影评——即整数数组必须在输入神经网络之前转换为张量。这种转换可以通过以下两种方式来完成:
* 将数组转换为表示单词出现与否的由 0 和 1 组成的向量,类似于 one-hot 编码。例如,序列[3, 5]将转换为一个 10,000 维的向量,该向量除了索引为 3 和 5 的位置是 1 以外,其他都为 0。然后,将其作为网络的首层——一个可以处理浮点型向量数据的稠密层。不过,这种方法需要大量的内存,需要一个大小为 `num_words * num_reviews` 的矩阵。
......@@ -111,7 +111,7 @@ decode_review(train_data[0])
在本教程中,我们将使用第二种方法。
由于电影评论长度必须相同,我们将使用 [pad_sequences](https://tensorflow.google.cn/api_docs/python/tf/keras/preprocessing/sequence/pad_sequences) 函数来使长度标准化
由于电影评论长度必须相同,我们将使用 [pad_sequences](https://tensorflow.google.cn/api_docs/python/tf/keras/preprocessing/sequence/pad_sequences) 函数来使长度标准化:
```python
......@@ -126,14 +126,14 @@ test_data = keras.preprocessing.sequence.pad_sequences(test_data,
maxlen=256)
```
现在让我们看下样本的长度
现在让我们看下样本的长度:
```python
len(train_data[0]), len(train_data[1])
```
并检查一下首条评论(当前已经填充)
并检查一下首条评论(当前已经填充):
```python
......@@ -142,12 +142,12 @@ print(train_data[0])
## 构建模型
神经网络由堆叠的层来构建,这需要从两个主要方面来进行体系结构决策
神经网络由堆叠的层来构建,这需要从两个主要方面来进行体系结构决策:
* 模型里有多少层?
* 每个层里有多少*隐层单元(hidden units)*
在此样本中,输入数据包含一个单词索引的数组。要预测的标签为 0 或 1。让我们来为该问题构建一个模型
在此样本中,输入数据包含一个单词索引的数组。要预测的标签为 0 或 1。让我们来为该问题构建一个模型:
```python
......@@ -163,9 +163,9 @@ model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()
```
层按顺序堆叠以构建分类器
层按顺序堆叠以构建分类器:
1. 第一层是`嵌入(Embedding)`层。该层采用整数编码的词汇表,并查找每个词索引的嵌入向量(embedding vector)。这些向量是通过模型训练学习到的。向量向输出数组增加了一个维度。得到的维度为`(batch, sequence, embedding)`
1. 第一层是`嵌入(Embedding)`层。该层采用整数编码的词汇表,并查找每个词索引的嵌入向量(embedding vector)。这些向量是通过模型训练学习到的。向量向输出数组增加了一个维度。得到的维度为: `(batch, sequence, embedding)`
2. 接下来,`GlobalAveragePooling1D` 将通过对序列维度求平均值来为每个样本返回一个定长输出向量。这允许模型以尽可能最简单的方式处理变长输入。
3. 该定长输出向量通过一个有 16 个隐层单元的全连接(`Dense`)层传输。
4. 最后一层与单个输出结点密集连接。使用 `Sigmoid` 激活函数,其函数值为介于 0 与 1 之间的浮点数,表示概率或置信度。
......@@ -184,7 +184,7 @@ model.summary()
稍后,当我们研究回归问题(例如,预测房价)时,我们将介绍如何使用另一种叫做均方误差的损失函数。
现在,配置模型来使用优化器和损失函数
现在,配置模型来使用优化器和损失函数:
```python
......@@ -208,7 +208,7 @@ partial_y_train = train_labels[10000:]
## 训练模型
以 512 个样本的 mini-batch 大小迭代 40 个 epoch 来训练模型。这是指对 `x_train``y_train` 张量中所有样本的的 40 次迭代。在训练过程中,监测来自验证集的 10,000 个样本上的损失值(loss)和准确率(accuracy)
以 512 个样本的 mini-batch 大小迭代 40 个 epoch 来训练模型。这是指对 `x_train``y_train` 张量中所有样本的的 40 次迭代。在训练过程中,监测来自验证集的 10,000 个样本上的损失值(loss)和准确率(accuracy):
```python
......@@ -235,7 +235,7 @@ print(results)
## 创建一个准确率(accuracy)和损失值(loss)随时间变化的图表
`model.fit()` 返回一个 `History` 对象,该对象包含一个字典,其中包含训练阶段所发生的一切事件
`model.fit()` 返回一个 `History` 对象,该对象包含一个字典,其中包含训练阶段所发生的一切事件:
```python
......@@ -243,7 +243,7 @@ history_dict = history.history
history_dict.keys()
```
有四个条目在训练和验证期间,每个条目对应一个监控指标。我们可以使用这些条目来绘制训练与验证过程的损失值(loss)和准确率(accuracy),以便进行比较。
有四个条目: 在训练和验证期间,每个条目对应一个监控指标。我们可以使用这些条目来绘制训练与验证过程的损失值(loss)和准确率(accuracy),以便进行比较。
```python
......@@ -287,7 +287,7 @@ plt.show()
注意训练损失值随每一个 epoch *下降*而训练准确率(accuracy)随每一个 epoch *上升*。这在使用梯度下降优化时是可预期的——理应在每次迭代中最小化期望值。
验证过程的损失值(loss)与准确率(accuracy)的情况却并非如此——它们似乎在 20 个 epoch 后达到峰值。这是过拟合的一个实例模型在训练数据上的表现比在以前从未见过的数据上的表现要更好。在此之后,模型过度优化并学习*特定*于训练数据的表示,而不能够*泛化*到测试数据。
验证过程的损失值(loss)与准确率(accuracy)的情况却并非如此——它们似乎在 20 个 epoch 后达到峰值。这是过拟合的一个实例: 模型在训练数据上的表现比在以前从未见过的数据上的表现要更好。在此之后,模型过度优化并学习*特定*于训练数据的表示,而不能够*泛化*到测试数据。
对于这种特殊情况,我们可以通过在 20 个左右的 epoch 后停止训练来避免过拟合。稍后,您将看到如何通过回调自动执行此操作。
......
......@@ -7,7 +7,7 @@ Note: 我们的 TensorFlow 社区翻译了这些文档。因为社区翻译是
*回归 (regression)* 问题中,我们的目的是预测出如价格或概率这样连续值的输出。相对于*分类(classification)* 问题,*分类(classification)* 的目的是从一系列的分类出选择出一个分类 (如,给出一张包含苹果或橘子的图片,识别出图片中是哪种水果)。
本 notebook 使用经典的 [Auto MPG](https://archive.ics.uci.edu/ml/datasets/auto+mpg) 数据集,构建了一个用来预测70年代末到80年代初汽车燃油效率的模型。为了做到这一点,我们将为该模型提供许多那个时期的汽车描述。这个描述包含气缸数,排量,马力以及重量。
本 notebook 使用经典的 [Auto MPG](https://archive.ics.uci.edu/ml/datasets/auto+mpg) 数据集,构建了一个用来预测70年代末到80年代初汽车燃油效率的模型。为了做到这一点,我们将为该模型提供许多那个时期的汽车描述。这个描述包含: 气缸数,排量,马力以及重量。
本示例使用 `tf.keras` API,相关细节请参阅 [本指南](https://tensorflow.google.cn/guide/keras)
......@@ -499,7 +499,7 @@ test_labels = test_dataset.pop('MPG')
使用不同的尺度和范围对特征归一化是好的实践。尽管模型*可能* 在没有特征归一化的情况下收敛,它会使得模型训练更加复杂,并会造成生成的模型依赖输入所使用的单位选择。
注意尽管我们仅仅从训练集中有意生成这些统计数据,但是这些统计信息也会用于归一化的测试数据集。我们需要这样做,将测试数据集放入到与已经训练过的模型相同的分布中。
注意: 尽管我们仅仅从训练集中有意生成这些统计数据,但是这些统计信息也会用于归一化的测试数据集。我们需要这样做,将测试数据集放入到与已经训练过的模型相同的分布中。
```python
......
......@@ -6,7 +6,7 @@
换句话说,我们的模型将 *过拟合* 训练数据。学习如何应对过拟合很重要。尽管通常可以在*训练集*上达到高精度,但我们真正想要的是开发能够很好地推广到*测试集*(或之前未见的数据)的模型。
过拟合的反面是*欠拟合*。当测试数据仍有改进空间时,就会发生欠拟合。发生这种情况的原因有很多如果模型不够强大,模型过于规范化,或者仅仅是没有经过足够长时间的训练。这意味着网络尚未学习训练数据中的相关模式。
过拟合的反面是*欠拟合*。当测试数据仍有改进空间时,就会发生欠拟合。发生这种情况的原因有很多: 如果模型不够强大,模型过于规范化,或者仅仅是没有经过足够长时间的训练。这意味着网络尚未学习训练数据中的相关模式。
但是,如果训练时间过长,则模型将开始过拟合并从训练数据中学习无法推广到测试数据的模式。我们需要保持平衡。如下所述,了解如何训练适当的时期是一项有用的技能。
......@@ -55,7 +55,7 @@ train_data = multi_hot_sequences(train_data, dimension=NUM_WORDS)
test_data = multi_hot_sequences(test_data, dimension=NUM_WORDS)
```
让我们看一下产生的 multi-hot 向量之一。 单词索引按频率排序,因此可以预期在索引零附近有更多的1值,如我们在该图中所看到的
让我们看一下产生的 multi-hot 向量之一。 单词索引按频率排序,因此可以预期在索引零附近有更多的1值,如我们在该图中所看到的:
```python
plt.plot(train_data[0])
......@@ -67,7 +67,7 @@ plt.plot(train_data[0])
防止过拟合的最简单方法是减小模型的大小,即减小模型中可学习的参数的数量(由层数和每层单元数确定)。在深度学习中,模型中可学习参数的数量通常称为模型的“容量”。直观地讲,具有更多参数的模型将具有更多的“记忆能力”,因此将能够轻松学习训练样本与其目标之间的完美的字典式映射,这种映射没有任何泛化能力,但是在进行预测时这将是无用的根据以前看不见的数据。
始终牢记这一点深度学习模型往往擅长拟合训练数据,但真正的挑战是泛化而不是拟合。
始终牢记这一点: 深度学习模型往往擅长拟合训练数据,但真正的挑战是泛化而不是拟合。
另一方面,如果网络的存储资源有限,则将无法轻松地学习映射。为了最大程度地减少损失,它必须学习具有更强预测能力的压缩表示形式。同时,如果您使模型过小,将难以拟合训练数据。 “容量过多”和“容量不足”之间存在平衡。
......@@ -152,7 +152,7 @@ Epoch 20/20
### 创建 smaller model
让我们创建一个隐藏单元更少的模型,以与我们刚刚创建的基线模型进行比较
让我们创建一个隐藏单元更少的模型,以与我们刚刚创建的基线模型进行比较:
```python
......@@ -169,7 +169,7 @@ smaller_model.compile(optimizer='adam',
smaller_model.summary()
```
并使用相同的数据训练模型
并使用相同的数据训练模型:
```python
......@@ -227,7 +227,7 @@ Epoch 20/20
### 创建 bigger model
作为练习,您可以创建一个更大的模型,并查看它开始过拟合的速度。 接下来,让我们将具有更大容量的网络添加到此基准网络中,远远超出问题所能保证的范围
作为练习,您可以创建一个更大的模型,并查看它开始过拟合的速度。 接下来,让我们将具有更大容量的网络添加到此基准网络中,远远超出问题所能保证的范围:
```python
......@@ -244,7 +244,7 @@ bigger_model.compile(optimizer='adam',
bigger_model.summary()
```
再次,使用相同的数据训练模型
再次,使用相同的数据训练模型:
```python
......@@ -303,7 +303,7 @@ Epoch 20/20
<!--TODO(markdaoust): This should be a one-liner with tensorboard -->
实线表示训练损失,而虚线表示验证损失(请记住验证损失越小表示模型越好)。 在这里,较小的网络比基准模型开始过度拟合(在6个时期而不是4个周期之后),并且一旦开始过度拟合,其性能下降的速度就会慢得多。
实线表示训练损失,而虚线表示验证损失(请记住: 验证损失越小表示模型越好)。 在这里,较小的网络比基准模型开始过度拟合(在6个时期而不是4个周期之后),并且一旦开始过度拟合,其性能下降的速度就会慢得多。
```python
def plot_history(histories, key='binary_crossentropy'):
......@@ -335,13 +335,13 @@ plot_history([('baseline', baseline_history),
### 添加权重正则化
您可能熟悉Occam的Razor原理:给某事两种解释,最可能正确的解释是“最简单”的解释,即假设最少的一种。这也适用于通过神经网络学习的模型:给定一些训练数据和网络体系结构,可以使用多组权重值(多个模型)来解释数据,并且较简单的模型比复杂的模型不太可能过拟合。
您可能熟悉Occam的Razor原理: 给某事两种解释,最可能正确的解释是“最简单”的解释,即假设最少的一种。这也适用于通过神经网络学习的模型: 给定一些训练数据和网络体系结构,可以使用多组权重值(多个模型)来解释数据,并且较简单的模型比复杂的模型不太可能过拟合。
在这种情况下,“简单模型”是参数值的分布具有较小熵的模型(或如上节所述,具有总共较少参数的模型)。因此,减轻过拟合的一种通用方法是通过仅将网络的权重强制取小的值来对网络的复杂性施加约束,这使得权重值的分布更加“规则”。这称为“权重调整”,它是通过向网络的损失函数中添加与权重较大相关的成本来完成的。以下有两种形式
在这种情况下,“简单模型”是参数值的分布具有较小熵的模型(或如上节所述,具有总共较少参数的模型)。因此,减轻过拟合的一种通用方法是通过仅将网络的权重强制取小的值来对网络的复杂性施加约束,这使得权重值的分布更加“规则”。这称为“权重调整”,它是通过向网络的损失函数中添加与权重较大相关的成本来完成的。以下有两种形式:
* [L1正则化](https://developers.google.com/machine-learning/glossary/#L1_regularization),其中增加的成本与权重系数的绝对值成正比(即所谓的“ L1规范” ”)。
* [L2正则化](https://developers.google.com/machine-learning/glossary/#L2_regularization),其中增加的成本与权重系数的值的平方成正比(即与平方的平方成正比)权重的“ L2规范”。 L2正则化在神经网络中也称为权重衰减。不要让其他名称使您感到困惑权重衰减在数学上与L2正则化完全相同。
* [L2正则化](https://developers.google.com/machine-learning/glossary/#L2_regularization),其中增加的成本与权重系数的值的平方成正比(即与平方的平方成正比)权重的“ L2规范”。 L2正则化在神经网络中也称为权重衰减。不要让其他名称使您感到困惑: 权重衰减在数学上与L2正则化完全相同。
L1正则化引入稀疏性,以使您的某些权重参数为零。 L2正则化将惩罚权重参数而不使其稀疏,这是L2更为常见的原因之一。
......@@ -414,7 +414,7 @@ Epoch 20/20
`l2(0.001)` 表示该层权重矩阵中的每个系数将为网络的总损耗增加 `0.001 * weight_coefficient_value**2`。 请注意,由于此惩罚仅在训练时增加,因此在训练时此网络的损失将比在测试时高得多。
这是我们的L2正则化惩罚的影响
这是我们的L2正则化惩罚的影响:
```python
plot_history([('baseline', baseline_history),
......@@ -431,7 +431,7 @@ dropout 是 Hinton 和他在多伦多大学的学生开发的最有效,最常
在tf.keras中,您可以通过Dropout层在网络中引入Dropout,该层将立即应用于该层的输出。
让我们在IMDB网络中添加两个Dropout层,看看它们在减少过拟合方面的表现如何
让我们在IMDB网络中添加两个Dropout层,看看它们在减少过拟合方面的表现如何:
```python
......@@ -508,7 +508,7 @@ plot_history([('baseline', baseline_history),
添加 dropout 是对基线模型的明显改进。
回顾一下:以下是防止神经网络过拟合的最常用方法:
回顾一下: 以下是防止神经网络过拟合的最常用方法:
* 获取更多训练数据
* 减少网络容量
......
# Bert 项目实战
```
题外话:
我感觉的确很惭愧
那些在NLP领域一直都说自己很牛逼的公司?
为啥中文通用的预训练模型是Google,而不是我们热熟能详的国内互联网公司?
```
## 基本介绍
BERT的全称为Bidirectional Encoder Representation from Transformers,是一个预训练的语言表征模型。
该模型有以下主要优点:
1. 采用MLM对`双向的Transformers`进行预训练,以生成深层的双向语言表征,可以更好的理解上下文信息
2. 预训练后,只需要添加一个额外的输出层进行fine-tune,就可以在各种各样的下游任务中取得state-of-the-art的表现。在这过程中并不需要对BERT进行任务特定的结构修改。
![](/img/tf_2.0/bert.png)
总结一下:
1. token embeddings 表示的是词向量,第一个单词是CLS,可以用于之后的分类任务;SEP分割句子的
2. segment embeddings 用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
3. position embeddings 表示位置信息(索引ID)
例如:
这里包含keras-bert的三个例子,分别是文本分类、关系抽取和主体抽取,都是在官方发布的预训练权重基础上进行微调来做的。
---
## 提问环节:
> 1.bert中的[CLS]甚意思?
bert论文中提到: “GPT uses a sentence separator ([SEP]) and classifier token ([CLS]) which are only introduced at fine-tuning time; BERT learns [SEP], [CLS] and sentence A/B embeddings during pre-training.”
说明[CLS]不是bert原创,在GPT中就有。在GPT中用于句子的分类,判断[CLS]开头的句子是不是下一句。
> 2.单向语言模型和双向语言模型
* 单向语言模型是指: 从左到右或者从右到左,使其只能获取单方向的上下文信息
* 双向语言模型是指: 不受单向的限制,可以更好的理解上下文信息
> 3.预训练模型
例如我们今天利用A数据训练了一个A模型,第二次我们有新的预料,在A的基础上,做了微调(fine-tuning),得到一个更好的B模型。而模型在这个过程中,是预先训练好,方便下一个预料进行迭代式训练。
---
* https://www.cnblogs.com/dogecheng/p/11617940.html
* https://blog.csdn.net/zkq_1986/article/details/100155596
* https://blog.csdn.net/yangfengling1023/article/details/84025313
* https://zhuanlan.zhihu.com/p/98855346
* https://blog.csdn.net/weixin_42598761/article/details/104592171
* https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
* pip install git+https://www.github.com/keras-team/keras-contrib.git
* pip install keras-bert
此差异已折叠。
......@@ -2,7 +2,7 @@
# 长短期记忆网络(Long Short-Term Memory,LSTM)及其变体双向LSTM和GRU
**LSTM**(Long Short-Term Memory)长短期记忆网络,是一种时间递归神经网络,**适合于处理和预测时间序列中间隔和延迟相对较长的重要事件**。LSTM是解决循环神经网络RNN结构中存在的“梯度消失”问题而提出的,是一种特殊的循环神经网络。最常见的一个例子就是当我们要预测“the clouds are in the (...)"的时候, 这种情况下,相关的信息和预测的词位置之间的间隔很小,RNN会使用先前的信息预测出词是”sky“。但是如果想要预测”I grew up in France ... I speak fluent (...)”,语言模型推测下一个词可能是一种语言的名字,但是具体是什么语言,需要用到间隔很长的前文中France,在这种情况下,RNN因为“梯度消失”的问题,并不能利用间隔很长的信息,然而,LSTM在设计上明确避免了长期依赖的问题,这主要归功于LSTM精心设计的“门”结构(输入门、遗忘门和输出门)消除或者增加信息到细胞状态的能力,使得LSTM能够记住长期的信息。
**LSTM**(Long Short-Term Memory)长短期记忆网络,是一种时间递归神经网络,**适合于处理和预测时间序列中间隔和延迟相对较长的重要事件**。LSTM是解决循环神经网络RNN结构中存在的“梯度消失”问题而提出的,是一种特殊的循环神经网络。最常见的一个例子就是: 当我们要预测“the clouds are in the (...)"的时候, 这种情况下,相关的信息和预测的词位置之间的间隔很小,RNN会使用先前的信息预测出词是”sky“。但是如果想要预测”I grew up in France ... I speak fluent (...)”,语言模型推测下一个词可能是一种语言的名字,但是具体是什么语言,需要用到间隔很长的前文中France,在这种情况下,RNN因为“梯度消失”的问题,并不能利用间隔很长的信息,然而,LSTM在设计上明确避免了长期依赖的问题,这主要归功于LSTM精心设计的“门”结构(输入门、遗忘门和输出门)消除或者增加信息到细胞状态的能力,使得LSTM能够记住长期的信息。
![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180704173253439.jpg)  vs   ![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180704173230785.jpg)  
......@@ -15,12 +15,12 @@
**在LSTM中,第一阶段是遗忘门,遗忘层决定哪些信息需要从细胞状态中被遗忘,下一阶段是输入门,输入门确定哪些新信息能够被存放到细胞状态中,最后一个阶段是输出门,输出门确定输出什么值**。下面我们把LSTM就着各个门的子结构和数学表达式进行分析。
* 遗忘门遗忘门是以上一层的输出![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154943659.jpg)和本层要输入的序列数据![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705155022656.jpg)作为输入,通过一个激活函数sigmoid,得到输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/201807051551130.jpg)。![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705155135748.jpg)的输出取值在[0,1]区间,表示上一层细胞状态被遗忘的概率,1是“完全保留”,0是“完全舍弃”
* 遗忘门: 遗忘门是以上一层的输出![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154943659.jpg)和本层要输入的序列数据![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705155022656.jpg)作为输入,通过一个激活函数sigmoid,得到输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/201807051551130.jpg)。![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705155135748.jpg)的输出取值在[0,1]区间,表示上一层细胞状态被遗忘的概率,1是“完全保留”,0是“完全舍弃”
![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154117297.jpg)
* 输入门:输入门包含两个部分,第一部分使用sigmoid激活函数,输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705160829424.jpg),第二部分使用tanh激活函数,输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705161911316.jpg)**【个人通俗理解:![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162106120.jpg)在RNN网络中就是本层的输出,![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162239540.jpg)是在[0,1]区间取值,表示![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162835994.jpg)中的信息被保留的程度,![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162518689.jpg)表示该层被保留的新信息】**
* 输入门: 输入门包含两个部分,第一部分使用sigmoid激活函数,输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705160829424.jpg),第二部分使用tanh激活函数,输出为![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705161911316.jpg)**【个人通俗理解: ![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162106120.jpg)在RNN网络中就是本层的输出,![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162239540.jpg)是在[0,1]区间取值,表示![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162835994.jpg)中的信息被保留的程度,![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705162518689.jpg)表示该层被保留的新信息】**
![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154140100.jpg)
......@@ -30,7 +30,7 @@
![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154157781.jpg)
* 输出门输出门用来控制该层的细胞状态有多少被过滤。首先使用sigmoid激活函数得到一个[0,1]区间取值的![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705163549770.jpg),接着将细胞状态![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164009353.jpg)通过tanh激活函数处理后与![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164029948.jpg)相乘,即是本层的输出![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164102617.jpg)
* 输出门: 输出门用来控制该层的细胞状态有多少被过滤。首先使用sigmoid激活函数得到一个[0,1]区间取值的![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705163549770.jpg),接着将细胞状态![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164009353.jpg)通过tanh激活函数处理后与![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164029948.jpg)相乘,即是本层的输出![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705164102617.jpg)
![](http://data.apachecn.org/img/AiLearning/dl/LSTM原理/20180705154210768.jpg)
......
......@@ -6,26 +6,26 @@
循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使用,学习出来的东西没有逻辑,所以要想真正让它更有用,路还很远。
这是一般的神经网络应该有的结构 
这是一般的神经网络应该有的结构:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171119130251741.jpg)
既然我们已经有了人工神经网络和卷积神经网络,为什么还要循环神经网络? 
原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是元素之间是相互独立的,**输入与输出也是独立的**,比如猫和狗。 
但现实世界中,很多元素都是相互连接的,比如股票随时间的变化,一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去___这里填空,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,但机会要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是**:像人一样拥有记忆的能力。**因此,他的输出就依赖于当前的输入和记忆。
原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是: 元素之间是相互独立的,**输入与输出也是独立的**,比如猫和狗。 
但现实世界中,很多元素都是相互连接的,比如股票随时间的变化,一个人说了: 我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去___这里填空,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,但机会要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是**: 像人一样拥有记忆的能力。**因此,他的输出就依赖于当前的输入和记忆。
## 2.RNN的网络结构及原理
它的网络结构如下 
它的网络结构如下:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171129184524844.jpg)
其中每个圆圈可以看作是一个单元,而且每个单元做的事情也是一样的,因此可以折叠呈左半图的样子。用一句话解释RNN,就是**一个单元结构重复使用**
RNN是一个序列到序列的模型,假设![-w88](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570321772488.jpg)是一个输入“我是中国“,那么![-w54](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322195709.jpg)就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是![-w31](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322451341.jpg)应该是”人”的概率比较大。
RNN是一个序列到序列的模型,假设![-w88](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570321772488.jpg)是一个输入: “我是中国“,那么![-w54](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322195709.jpg)就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是![-w31](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322451341.jpg)应该是”人”的概率比较大。
因此,我们可以做这样的定义
因此,我们可以做这样的定义:
![-w416](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322822857.jpg)
。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础
。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:
![-w200](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570322981095.jpg)
......@@ -40,16 +40,16 @@ RNN是一个序列到序列的模型,假设![-w88](http://data.apachecn.org/im
其中![-w21](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570323768890.jpg)就表示时刻t的输出。
RNN中的结构细节 
RNN中的结构细节:  
1.可以把St当作隐状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息。 
2.Ot是由当前时间以及之前所有的记忆得到的。就是你考研之后做的考试卷子,是用你的记忆得到的。 
3.很可惜的是,St并不能捕捉之前所有时间点的信息。就像你考研不能记住所有的英语单词一样。 
4.和卷积神经网络一样,这里的网络中每个cell都共享了一组参数(U,V,W),这样就能极大的降低计算量了。 
5.Ot在很多情况下都是不存在的,因为很多任务,比如文本情感分析,都是只关注最后的结果的。就像考研之后选择学校,学校不会管你到底怎么努力,怎么心酸的准备考研,而只关注你最后考了多少分。
## 3.RNN的改进1双向RNN
## 3.RNN的改进1: 双向RNN
在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解 
在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/bi-directional-rnn.png) 
![-w347](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570324711246.jpg)
......@@ -57,7 +57,7 @@ RNN中的结构细节: 
双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。
## 4.RNN的改进2深层双向RNN
## 4.RNN的改进2: 深层双向RNN
深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。
......@@ -66,12 +66,12 @@ RNN中的结构细节: 
我们用公式来表示是这样的: 
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/deep-bi-directional-rnn-hidden-layer.png) 
然后再利用最后一层来进行分类,分类公式如下 
然后再利用最后一层来进行分类,分类公式如下:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/deep-bi-directional-rnn-classification.png)
### 4.1 Pyramidal RNN
其他类似的网络还有Pyramidal RNN 
其他类似的网络还有Pyramidal RNN:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171221152506461.jpg)
我们现在有一个很长的输入序列,可以看到这是一个双向的RNN,上图是谷歌的W.Chan做的一个测试,它原先要做的是语音识别,他要用序列到序列的模型做语音识别,序列到序列就是说,输入一个序列然后就输出一个序列。
......@@ -82,61 +82,61 @@ RNN中的结构细节: 
## 5.RNN的训练-BPTT
如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆
如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆:
![-w202](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570325921406.jpg)
然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率
然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率:
![-w144](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570326059642.jpg)
为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数
为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:
![-w252](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570326336949.jpg)
其中![-w14](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570326853547.jpg)
t时刻的标准答案,是一个只有一个是1,其他都是0的向量; ![-w19](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570326727679.jpg)是我们预测出来的结果,与![-w14](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570327422935.jpg)
的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来
的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来:
![-w300](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570327570018.jpg)
![](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171130091040277.jpg)
如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。
如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别: CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。
因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下
因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下:
![](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171130091956686.jpg)
假设我们对E3的W求偏导它的损失首先来源于预测的输出![-w19](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570327881131.jpg)
,预测的输出又是来源于当前时刻的记忆s3,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆![-w170](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328132196.jpg)
假设我们对E3的W求偏导: 它的损失首先来源于预测的输出![-w19](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570327881131.jpg)
,预测的输出又是来源于当前时刻的记忆s3,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆: ![-w170](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328132196.jpg)
因此,根据链式法则可以有:
![-w172](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328255432.jpg)
但是,你会发现,![-w145](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328436386.jpg)
,也就是s2里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的 
,也就是s2里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的:  
![这里写图片描述](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171130094236429.jpg) 
我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。
## 6.RNN与CNN的结合应用看图说话
## 6.RNN与CNN的结合应用: 看图说话
在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子假设我们有CNN的模型训练了一个网络结构,比如是这个
在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子: 假设我们有CNN的模型训练了一个网络结构,比如是这个
![](http://data.apachecn.org/img/AiLearning/dl/RNN原理/20171129213601819.jpg)
最后我们不是要分类嘛,那在分类前,是不是已经拿到了图像的特征呀,那我们能不能把图像的特征拿出来,放到RNN的输入里,让他学习呢?
之前的RNN是这样的
之前的RNN是这样的:
![-w238](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328705596.jpg)
我们把图像的特征加在里面,可以得到
我们把图像的特征加在里面,可以得到:
![-w266](http://data.apachecn.org/img/AiLearning/dl/RNN原理/15570328817086.jpg)
其中的X就是图像的特征。如果用的是上面的CNN网络,X应该是一个4096X1的向量。
这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。
: 这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。
## 7.RNN项目练手
......
# 反向传递
> 建议一定要看懂推导过程
> 建议: 一定要看懂推导过程
# [一文弄懂神经网络中的反向传播法——BackPropagation](https://www.cnblogs.com/charlotte77/p/5629865.html)
  最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进行补充,但是补充的又是错的,难怪觉得有问题。反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用。如果不想看公式,可以直接把数值带进去,实际的计算一下,体会一下这个过程之后再来推导公式,这样就会觉得很容易了。
  说到神经网络,大家看到这个图应该不陌生
  说到神经网络,大家看到这个图应该不陌生:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630140644406-409859737.png)
  这是典型的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,我们现在手里有一堆数据{x1,x2,x3,...,xn},输出也是一堆数据{y1,y2,y3,...,yn},现在要他们在隐含层做某种变换,让你把数据灌进去后得到你期望的输出。如果你希望你的输出和原始输入一样,那么就是最常见的自编码模型(Auto-Encoder)。可能有人会问,为什么要输入输出都一样呢?有什么用啊?其实应用挺广的,在图像识别,文本分类等等都会用到,我会专门再写一篇Auto-Encoder的文章来说明,包括一些变种之类的。如果你的输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到我们想要的输出数据,也就是我们今天要讲的话题。
  本文直接举一个例子,带入数值演示反向传播法的过程,公式的推导等到下次写Auto-Encoder的时候再写,其实也很简单,感兴趣的同学可以自己推导下试试:)(注:本文假设你已经懂得基本的神经网络构成,如果完全不懂,可以参考Poll写的笔记:[[Mechine Learning & Algorithm] 神经网络基础](http://www.cnblogs.com/maybe2030/p/5597716.html)
  本文直接举一个例子,带入数值演示反向传播法的过程,公式的推导等到下次写Auto-Encoder的时候再写,其实也很简单,感兴趣的同学可以自己推导下试试: )(注: 本文假设你已经懂得基本的神经网络构成,如果完全不懂,可以参考Poll写的笔记: [[Mechine Learning & Algorithm] 神经网络基础](http://www.cnblogs.com/maybe2030/p/5597716.html)
  假设,你有这样一个网络层
  假设,你有这样一个网络层:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630141449671-1058672778.png)
  第一层是输入层,包含两个神经元i1,i2,和截距项b1;第二层是隐含层,包含两个神经元h1,h2和截距项b2,第三层是输出o1,o2,每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。
  现在对他们赋上初值,如下图
  现在对他们赋上初值,如下图:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630142019140-402363317.png)
......@@ -32,27 +32,27 @@
           w5=0.40,w6=0.45,w7=0.50,w8=0.55
  目标给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。
  目标: 给出输入数据i1,i2(0.05和0.10),使输出尽可能与原始输出o1,o2(0.01和0.99)接近。
  **Step 1 前向传播**
  1.输入层---->隐含层
  1.输入层---->隐含层:
  计算神经元h1的输入加权和
  计算神经元h1的输入加权和:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630142915359-294460310.png)
神经元h1的输出o1:(此处用到激活函数为sigmoid函数)
神经元h1的输出o1:(此处用到激活函数为sigmoid函数):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630150115390-1035378028.png)
  同理,可计算出神经元h2的输出o2
  同理,可计算出神经元h2的输出o2:
  ![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630150244265-1128303244.png)
  2.隐含层---->输出层
  2.隐含层---->输出层:
  计算输出层神经元o1和o2的值
  计算输出层神经元o1和o2的值:
  ![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630150517109-389457135.png)
......@@ -64,11 +64,11 @@
1.计算总误差
总误差(square error)
总误差: (square error)
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630151201812-1014280864.png)
但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和
但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630151457593-1250510503.png)
......@@ -76,55 +76,55 @@
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630151516093-1257166735.png)
2.隐含层---->输出层的权值更新
2.隐含层---->输出层的权值更新:
以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出(链式法则)
以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出: (链式法则)
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630151916796-1001638091.png)
下面的图可以更直观的看清楚误差是怎样反向传播的
下面的图可以更直观的看清楚误差是怎样反向传播的:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152018906-1524325812.png)
现在我们来分别计算每个式子的值
现在我们来分别计算每个式子的值:
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152206781-7976168.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152206781-7976168.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152258437-1960839452.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152417109-711077078.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152417109-711077078.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152511937-1667481051.png)
(这一步实际上就是对sigmoid函数求导,比较简单,可以自己推导一下)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152625593-2083321635.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152625593-2083321635.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152658109-214239362.png)
最后三者相乘
最后三者相乘:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630152811640-888140287.png)
这样我们就计算出整体误差E(total)对w5的偏导值。
回过头来再看看上面的公式,我们发现
回过头来再看看上面的公式,我们发现:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153103187-515052589.png)
为了表达方便,用![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153202812-585186566.png)来表示输出层的误差
为了表达方便,用![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153202812-585186566.png)来表示输出层的误差:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153251234-1144531293.png)
因此,整体误差E(total)对w5的偏导公式可以写成
因此,整体误差E(total)对w5的偏导公式可以写成:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153405296-436656179.png)
如果输出层误差计为负的话,也可以写成
如果输出层误差计为负的话,也可以写成:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153514734-1544628024.png)
最后我们来更新w5的值
最后我们来更新w5的值:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153614374-1624035276.png)
......@@ -134,17 +134,17 @@
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630153807624-1231975059.png)
3.隐含层---->隐含层的权值更新
3.隐含层---->隐含层的权值更新:
 方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154317562-311369571.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154712202-1906007645.png)
计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154712202-1906007645.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154758531-934861299.png)
先计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154958296-1922097086.png)
先计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630154958296-1922097086.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155015546-1106216279.png)
......@@ -154,35 +154,35 @@
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155158468-157032005.png)
同理,计算出
同理,计算出:
          ![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155310937-2103938446.png)
两者相加得到总值
两者相加得到总值:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155435218-396769942.png)
再计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155555562-1422254830.png)
再计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155555562-1422254830.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155628046-229505495.png)
再计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155731421-239852713.png)
再计算![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155731421-239852713.png):
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155706437-964861747.png)
最后,三者相乘
最后,三者相乘:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630155827718-189457408.png)
 为了简化公式,用sigma(h1)表示隐含层单元h1的误差
 为了简化公式,用sigma(h1)表示隐含层单元h1的误差:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630160345281-679307550.png)
最后,更新w1的权值
最后,更新w1的权值:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630160523437-1906004593.png)
同理,额可更新w2,w3,w4的权值
同理,额可更新w2,w3,w4的权值:
![](http://data.apachecn.org/img/AiLearning/dl/反向传递/853467-20160630160603484-1471434475.png)
......@@ -197,11 +197,11 @@ import random
import math
#
# 参数解释
# "pd_" 偏导的前缀
# "d_" 导数的前缀
# "w_ho" 隐含层到输出层的权重系数索引
# "w_ih" 输入层到隐含层的权重系数的索引
# 参数解释:
# "pd_" : 偏导的前缀
# "d_" : 导数的前缀
# "w_ho" : 隐含层到输出层的权重系数索引
# "w_ih" : 输入层到隐含层的权重系数的索引
class NeuralNetwork:
LEARNING_RATE = 0.5
......@@ -396,17 +396,17 @@ for i in range(10000):
# print(i, nn.calculate_total_error(training_sets))
```
  最后写到这里就结束了,现在还不会用latex编辑数学公式,本来都直接想写在草稿纸上然后扫描了传上来,但是觉得太影响阅读体验了。以后会用公式编辑器后再重把公式重新编辑一遍。稳重使用的是sigmoid激活函数,实际还有几种不同的激活函数可以选择,具体的可以参考文献[3],最后推荐一个在线演示神经网络变化的网址:http://www.emergentmind.com/neural-network,可以自己填输入输出,然后观看每一次迭代权值的变化,很好玩~如果有错误的或者不懂的欢迎留言:
  最后写到这里就结束了,现在还不会用latex编辑数学公式,本来都直接想写在草稿纸上然后扫描了传上来,但是觉得太影响阅读体验了。以后会用公式编辑器后再重把公式重新编辑一遍。稳重使用的是sigmoid激活函数,实际还有几种不同的激活函数可以选择,具体的可以参考文献[3],最后推荐一个在线演示神经网络变化的网址: http://www.emergentmind.com/neural-network,可以自己填输入输出,然后观看每一次迭代权值的变化,很好玩~如果有错误的或者不懂的欢迎留言:
参考文献
参考文献:
1. Poll的笔记[[Mechine Learning & Algorithm] 神经网络基础](http://www.cnblogs.com/maybe2030/p/5597716.html)(http://www.cnblogs.com/maybe2030/p/5597716.html#3457159 )
1. Poll的笔记: [[Mechine Learning & Algorithm] 神经网络基础](http://www.cnblogs.com/maybe2030/p/5597716.html)(http://www.cnblogs.com/maybe2030/p/5597716.html#3457159 )
2. Rachel_Zhang:http://blog.csdn.net/abcjennifer/article/details/7758797
3. http://www.cedar.buffalo.edu/%7Esrihari/CSE574/Chap5/Chap5.3-BackProp.pdf
4. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
---
* 作者Charlotte77 
* 出处http://www.cnblogs.com/charlotte77/ 
* 作者: Charlotte77 
* 出处: http://www.cnblogs.com/charlotte77/ 
* 本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途! 
......@@ -2,21 +2,21 @@
## 线性回归
令 $z = w^T x + b$,得到
令 $z = w^T x + b$,得到:
$y = z + \epsilon, \, \epsilon \sim N(0, \sigma^2)$
于是
于是:
$y|x \sim N(z, \sigma^2)$
为啥是 $y|x$,因为判别模型的输出只能是 $y|x$。
它的概率密度函数
它的概率密度函数:
$f_{Y|X}(y)=\frac{1}{\sqrt{2 \pi} \sigma} \exp(\frac{-(y -z)^2}{2\sigma^2}) \\ = A \exp(-B (y - z)^2), \, A, B > 0$
计算损失函数
计算损失函数:
$L = -\sum_i \log f_{Y|X}(y^{(i)}) \\ = -\sum_i(\log A - B(y^{(i)} - z^{(i)})^2) \\ = B \sum_i(y^{(i)} - z^{(i)})^2 + C$
......@@ -24,21 +24,21 @@ $L = -\sum_i \log f_{Y|X}(y^{(i)}) \\ = -\sum_i(\log A - B(y^{(i)} - z^{(i)})^2)
## 逻辑回归
令 $z = w^T x + b, a = \sigma(z)$,我们观察到在假设中
令 $z = w^T x + b, a = \sigma(z)$,我们观察到在假设中:
$P(y=1|x) = a \\ P(y=0|x) = 1 - a$
也就是说
也就是说:
$y|x \sim B(1, a)$
> 其实任何二分类器的输出都是伯努利分布。因为变量只能取两个值,加起来得一,所以只有一种分布。
它的概率质量函数(因为是离散分布,只有概率质量函数,不过无所谓)
它的概率质量函数(因为是离散分布,只有概率质量函数,不过无所谓):
$p_{Y|X}(y) = a^y(1-a)^{1-y}$
然后计算损失函数
然后计算损失函数:
$L = -\sum_i \log p_{Y|X}(y^{(i)}) \\ = -\sum_i(y^{(i)} \log a^{(i)} + (1-y^{(i)})\log(1-a^{(i)}))$
......
此差异已折叠。
# 第 10 章 K-Means(K-均值)聚类算法
![K-Means(K-均值)聚类算法_首页](http://data.apachecn.org/img/AiLearning/ml/10.KMeans/K-Means_首页.jpg)
## 聚类
聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。它是一种无监督的学习(Unsupervised Learning)方法,不需要预先标注好的训练集。聚类与分类最大的区别就是分类的目标事先已知,例如猫狗识别,你在分类之前已经预先知道要将它分为猫、狗两个种类;而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来说,你并不清楚这个数据集内部有多少种类的动物,你能做的只是利用聚类方法将它自动按照特征分为多类,然后人为给出这个聚类结果的定义(即簇识别)。例如,你将一个动物集分为了三簇(类),然后通过观察这三类动物的特征,你为每一个簇起一个名字,如大象、狗、猫等,这就是聚类的基本思想。
至于“相似”这一概念,是利用距离这个评价标准来衡量的,我们通过计算对象与对象之间的距离远近来判断它们是否属于同一类别,即是否是同一个簇。至于距离如何计算,科学家们提出了许多种距离的计算方法,其中欧式距离是最为简单和常用的,除此之外还有曼哈顿距离和余弦相似性距离等。
欧式距离,我想大家再熟悉不过了,但为免有一些基础薄弱的同学,在此再说明一下,它的定义为:
对于x点(坐标为(x1,x2,x3,...,xn))和 y点(坐标为(y1,y2,y3,...,yn)),两者的欧式距离为
![d(x,y)={\sqrt {(x_{1}-y_{1})^{2}+(x_{2}-y_{2})^{2}+\cdots +(x_{n}-y_{n})^{2}}}={\sqrt {\sum _{{i=1}}^{n}(x_{i}-y_{i})^{2}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bfa1815838113388d78c9402bba7308d734a4af2)
欧式距离,我想大家再熟悉不过了,但为免有一些基础薄弱的同学,在此再说明一下,它的定义为:
对于x点坐标为(x1,x2,x3,...,xn)和 y点坐标为(y1,y2,y3,...,yn),两者的欧式距离为:
$$
d(x,y)
={\sqrt{
(x_{1}-y_{1})^{2}+(x_{2}-y_{2})^{2} + \cdots +(x_{n}-y_{n})^{2}
}}
={\sqrt{
\sum_{ {i=1} }^{n}(x_{i}-y_{i})^{2}
}}
$$
在二维平面,它就是我们初中时就学过的两点距离公式
## K-Means 算法
......@@ -68,12 +79,12 @@ kmeans,如前所述,用于数据集内种类属性不明晰,希望能够
### K-Means 开发流程
```
收集数据使用任意方法
准备数据需要数值型数据类计算距离, 也可以将标称型数据映射为二值型数据再用于距离计算
分析数据使用任意方法
训练算法不适用于无监督学习,即无监督学习不需要训练步骤
测试算法应用聚类算法、观察结果.可以使用量化的误差指标如误差平方和(后面会介绍)来评价算法的结果.
使用算法可以用于所希望的任何应用.通常情况下, 簇质心可以代表整个簇的数据来做出决策.
收集数据: 使用任意方法
准备数据: 需要数值型数据类计算距离, 也可以将标称型数据映射为二值型数据再用于距离计算
分析数据: 使用任意方法
训练算法: 不适用于无监督学习,即无监督学习不需要训练步骤
测试算法: 应用聚类算法、观察结果.可以使用量化的误差指标如误差平方和(后面会介绍)来评价算法的结果.
使用算法: 可以用于所希望的任何应用.通常情况下, 簇质心可以代表整个簇的数据来做出决策.
```
### K-Means 的评价标准
k-means算法因为手动选取k值和初始化随机质心的缘故,每一次的结果不会完全一样,而且由于手动选取k值,我们需要知道我们选取的k值是否合理,聚类效果好不好,那么如何来评价某一次的聚类效果呢?也许将它们画在图上直接观察是最好的办法,但现实是,我们的数据不会仅仅只有两个特征,一般来说都有十几个特征,而观察十几维的空间对我们来说是一个无法完成的任务。因此,我们需要一个公式来帮助我们判断聚类的性能,这个公式就是**SSE** (Sum of Squared Error, 误差平方和 ),它其实就是每一个点到其簇内质心的距离的平方值的总和,这个数值对应kmeans函数中**clusterAssment**矩阵的第一列之和。 **SSE**值越小表示数据点越接近于它们的质心,聚类效果也越好。 因为对误差取了平方,因此更加重视那些远离中心的点。一种肯定可以降低**SSE**值的方法是增加簇的个数,但这违背了聚类的目标。聚类的目标是在保持簇数目不变的情况下提高簇的质量。
......@@ -166,7 +177,7 @@ def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
为了保持簇总数不变,可以将某两个簇进行合并。从上图中很明显就可以看出,应该将上图下部两个出错的簇质心进行合并。那么问题来了,我们可以很容易对二维数据上的聚类进行可视化, 但是如果遇到40维的数据应该如何去做?
有两种可以量化的办法合并最近的质心,或者合并两个使得**SSE**增幅最小的质心。 第一种思路通过计算所有质心之间的距离, 然后合并距离最近的两个点来实现。第二种方法需要合并两个簇然后计算总**SSE**值。必须在所有可能的两个簇上重复上述处理过程,直到找到合并最佳的两个簇为止。
有两种可以量化的办法: 合并最近的质心,或者合并两个使得**SSE**增幅最小的质心。 第一种思路通过计算所有质心之间的距离, 然后合并距离最近的两个点来实现。第二种方法需要合并两个簇然后计算总**SSE**值。必须在所有可能的两个簇上重复上述处理过程,直到找到合并最佳的两个簇为止。
因为上述后处理过程实在是有些繁琐,所以有更厉害的大佬提出了另一个称之为二分K-均值(bisecting K-Means)的算法.
......@@ -206,7 +217,7 @@ def biKMeans(dataSet, k, distMeas=distEclud):
sseSplit = sum(splitClustAss[:,1]) # 将二分 kMeans 结果中的平方和的距离进行求和
sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1]) # 将未参与二分 kMeans 分配结果中的平方和的距离进行求和
print "sseSplit, and notSplit: ",sseSplit,sseNotSplit
if (sseSplit + sseNotSplit) < lowestSSE: # 总的(未拆分和已拆分)误差和越小,越相似,效果越优化,划分的结果更好(注意这里的理解很重要,不明白的地方可以和我们一起讨论)
if (sseSplit + sseNotSplit) < lowestSSE: # 总的(未拆分和已拆分)误差和越小,越相似,效果越优化,划分的结果更好(注意: 这里的理解很重要,不明白的地方可以和我们一起讨论)
bestCentToSplit = i
bestNewCents = centroidMat
bestClustAss = splitClustAss.copy()
......@@ -230,6 +241,6 @@ def biKMeans(dataSet, k, distMeas=distEclud):
运行参考结果如下:
![二分 K-Means 运行结果1](http://data.apachecn.org/img/AiLearning/ml/10.KMeans/apachecn-bikmeans-run-result-1.jpg)
* **作者[那伊抹微笑](http://cwiki.apachecn.org/display/~xuxin), [清都江水郎](http://cwiki.apachecn.org/display/~xuzhaoqing)**
* **作者: [那伊抹微笑](http://cwiki.apachecn.org/display/~xuxin), [清都江水郎](http://cwiki.apachecn.org/display/~xuzhaoqing)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
\ No newline at end of file
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
\ No newline at end of file
......@@ -47,20 +47,20 @@
Apriori 算法优缺点
```
* 优点易编码实现
* 缺点在大数据集上可能较慢
* 适用数据类型数值型 或者 标称型数据。
* 优点: 易编码实现
* 缺点: 在大数据集上可能较慢
* 适用数据类型: 数值型 或者 标称型数据。
```
Apriori 算法流程步骤
Apriori 算法流程步骤:
```
* 收集数据使用任意方法。
* 准备数据任何数据类型都可以,因为我们只保存集合。
* 分析数据使用任意方法。
* 训练数据使用Apiori算法来找到频繁项集。
* 测试算法不需要测试过程。
* 使用算法用于发现频繁项集以及物品之间的关联规则。
* 收集数据: 使用任意方法。
* 准备数据: 任何数据类型都可以,因为我们只保存集合。
* 分析数据: 使用任意方法。
* 训练数据: 使用Apiori算法来找到频繁项集。
* 测试算法: 不需要测试过程。
* 使用算法: 用于发现频繁项集以及物品之间的关联规则。
```
## Apriori 算法的使用
......@@ -288,7 +288,7 @@ def apriori(dataSet, minSupport=0.5):
# 计算可信度(confidence)
def calcConf(freqSet, H
, supportData, brl, minConf=0.7):
"""calcConf(对两个元素的频繁项,计算可信度,例如 {1,2}/{1} 或者 {1,2}/{2} 看是否满足条件)
"""calcConf(对两个元素的频繁项,计算可信度,例如: {1,2}/{1} 或者 {1,2}/{2} 看是否满足条件)
Args:
freqSet 频繁项集中的元素,例如: frozenset([1, 3])
......@@ -369,7 +369,7 @@ def generateRules(L, supportData, minConf=0.7):
for i in range(1, len(L)):
# 获取频繁项集中每个组合的所有元素
for freqSet in L[i]:
# 假设freqSet= frozenset([1, 3]), H1=[frozenset([1]), frozenset([3])]
# 假设: freqSet= frozenset([1, 3]), H1=[frozenset([1]), frozenset([3])]
# 组合总的元素并遍历子元素,并转化为 frozenset 集合,再存放到 list 列表中
H1 = [frozenset([item]) for item in freqSet]
# 2 个的组合,走 else, 2 个以上的组合,走 if
......@@ -382,15 +382,15 @@ def generateRules(L, supportData, minConf=0.7):
到这里为止,通过调用 generateRules 函数即可得出我们所需的 `关联规则`
* 分级法 频繁项集->关联规则
* 分级法: 频繁项集->关联规则
* 1.首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部分只包含一个元素,然后对这个规则进行测试。
* 2.接下来合并所有剩余规则来创建一个新的规则列表,其中规则右部包含两个元素。
* 如下图
* 如下图:
* ![所有可能的项集组合](http://data.apachecn.org/img/AiLearning/ml/11.Apriori/所有可能的项集组合.png)
* 最后: 每次增加频繁项集的大小,Apriori 算法都会重新扫描整个数据集,是否有优化空间呢? 下一章:FP-growth算法等着你的到来
* 最后: 每次增加频繁项集的大小,Apriori 算法都会重新扫描整个数据集,是否有优化空间呢? 下一章: FP-growth算法等着你的到来
* * *
* **作者[片刻](https://github.com/jiangzhonglian)**
* **作者: [片刻](https://github.com/jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -69,13 +69,13 @@ class treeNode:
FP-growth 算法优缺点:
```
* 优点 1. 因为 FP-growth 算法只需要对数据集遍历两次,所以速度更快。
* 优点: 1. 因为 FP-growth 算法只需要对数据集遍历两次,所以速度更快。
2. FP树将集合按照支持度降序排序,不同路径如果有相同前缀路径共用存储空间,使得数据得到了压缩。
3. 不需要生成候选集。
4. 比Apriori更快。
* 缺点 1. FP-Tree第二次遍历会存储很多中间过程的值,会占用很多内存。
* 缺点: 1. FP-Tree第二次遍历会存储很多中间过程的值,会占用很多内存。
2. 构建FP-Tree是比较昂贵的。
* 适用数据类型标称型数据(离散型数据)。
* 适用数据类型: 标称型数据(离散型数据)。
```
......@@ -97,6 +97,6 @@ if __name__ == "__main__":
* * *
* **作者[mikechengwei](https://github.com/mikechengwei)**
* **作者: [mikechengwei](https://github.com/mikechengwei)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -11,7 +11,7 @@
* 人们实时的将显示器上的百万像素转换成为一个三维图像,该图像就给出运动场上球的位置。
* 在这个过程中,人们已经将百万像素点的数据,降至为三维。这个过程就称为`降维(dimensionality reduction)`
> 数据显示 并非大规模特征下的唯一难题,对数据进行简化还有如下一系列的原因
> 数据显示 并非大规模特征下的唯一难题,对数据进行简化还有如下一系列的原因:
* 1) 使得数据集更容易使用
* 2) 降低很多算法的计算开销
......@@ -26,19 +26,19 @@
> 在以下3种降维技术中, PCA的应用目前最为广泛,因此本章主要关注PCA。
* 1) 主成分分析(Principal Component Analysis, PCA)
* `通俗理解就是找出一个最主要的特征,然后进行分析。`
* `例如: 考察一个人的智力情况,就直接看数学成绩就行(存在:数学、语文、英语成绩)`
* `通俗理解: 就是找出一个最主要的特征,然后进行分析。`
* `例如: 考察一个人的智力情况,就直接看数学成绩就行(存在: 数学、语文、英语成绩)`
* 2) 因子分析(Factor Analysis)
* `通俗理解将多个实测变量转换为少数几个综合指标。它反映一种降维的思想,通过降维将相关性高的变量聚在一起,从而减少需要分析的变量的数量,而减少问题分析的复杂性`
* `例如: 考察一个人的整体情况,就直接组合3样成绩(隐变量),看平均成绩就行(存在:数学、语文、英语成绩)`
* 应用的领域社会科学、金融和其他领域
* `通俗理解: 将多个实测变量转换为少数几个综合指标。它反映一种降维的思想,通过降维将相关性高的变量聚在一起,从而减少需要分析的变量的数量,而减少问题分析的复杂性`
* `例如: 考察一个人的整体情况,就直接组合3样成绩(隐变量),看平均成绩就行(存在: 数学、语文、英语成绩)`
* 应用的领域: 社会科学、金融和其他领域
* 在因子分析中,我们
* 假设观察数据的成分中有一些观察不到的隐变量(latent variable)。
* 假设观察数据是这些隐变量和某些噪音的线性组合。
* 那么隐变量的数据可能比观察数据的数目少,也就说通过找到隐变量就可以实现数据的降维。
* 3) 独立成分分析(Independ Component Analysis, ICA)
* `通俗理解ICA 认为观测信号是若干个独立信号的线性组合,ICA 要做的是一个解混过程。`
* `例如我们去ktv唱歌,想辨别唱的是什么歌曲?ICA 是观察发现是原唱唱的一首歌【2个独立的声音(原唱/主唱)】。`
* `通俗理解: ICA 认为观测信号是若干个独立信号的线性组合,ICA 要做的是一个解混过程。`
* `例如: 我们去ktv唱歌,想辨别唱的是什么歌曲?ICA 是观察发现是原唱唱的一首歌【2个独立的声音(原唱/主唱)】。`
* ICA 是假设数据是从 N 个数据源混合组成的,这一点和因子分析有些类似,这些数据源之间在统计上是相互独立的,而在 PCA 中只假设数据是不 相关(线性关系)的。
* 同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。
......@@ -47,11 +47,11 @@
### PCA 概述
主成分分析(Principal Component Analysis, PCA)`通俗理解:就是找出一个最主要的特征,然后进行分析。`
主成分分析(Principal Component Analysis, PCA): `通俗理解: 就是找出一个最主要的特征,然后进行分析。`
### PCA 场景
`例如: 考察一个人的智力情况,就直接看数学成绩就行(存在:数学、语文、英语成绩)`
`例如: 考察一个人的智力情况,就直接看数学成绩就行(存在: 数学、语文、英语成绩)`
### PCA 原理
......@@ -68,16 +68,16 @@
1. 正交是为了数据有效性损失最小
2. 正交的一个原因是特征值的特征向量是正交的
例如下图
例如下图:
![应用PCA降维](http://data.apachecn.org/img/AiLearning/ml/13.PCA/应用PCA降维.png)
> PCA 优缺点
```
优点降低数据的复杂性,识别最重要的多个特征。
缺点不一定需要,且可能损失有用信息。
适用数据类型数值型数据。
优点: 降低数据的复杂性,识别最重要的多个特征。
缺点: 不一定需要,且可能损失有用信息。
适用数据类型: 数值型数据。
```
### 项目案例: 对半导体数据进行降维处理
......@@ -92,16 +92,16 @@
具体来讲,它拥有590个特征。我们看看能否对这些特征进行降维处理。
对于数据的缺失值的问题,我们有一些处理方法(参考第5章)
目前该章节处理的方案是将缺失值NaN(Not a Number缩写),全部用平均值来替代(如果用0来处理的策略就太差劲了)。
目前该章节处理的方案是: 将缺失值NaN(Not a Number缩写),全部用平均值来替代(如果用0来处理的策略就太差劲了)。
```
#### 开发流程
> 收集数据提供文本文件
> 收集数据: 提供文本文件
文件名secom.data
文件名: secom.data
文本文件数据格式如下
文本文件数据格式如下:
```
3030.93 2564 2187.7333 1411.1265 1.3602 100 97.6133 0.1242 1.5005 0.0162 -0.0034 0.9455 202.4396 0 7.9558 414.871 10.0433 0.968 192.3963 12.519 1.4026 -5419 2916.5 -4043.75 751 0.8955 1.773 3.049 64.2333 2.0222 0.1632 3.5191 83.3971 9.5126 50.617 64.2588 49.383 66.3141 86.9555 117.5132 61.29 4.515 70 352.7173 10.1841 130.3691 723.3092 1.3072 141.2282 1 624.3145 218.3174 0 4.592 4.841 2834 0.9317 0.9484 4.7057 -1.7264 350.9264 10.6231 108.6427 16.1445 21.7264 29.5367 693.7724 0.9226 148.6009 1 608.17 84.0793 NaN NaN 0 0.0126 -0.0206 0.0141 -0.0307 -0.0083 -0.0026 -0.0567 -0.0044 7.2163 0.132 NaN 2.3895 0.969 1747.6049 0.1841 8671.9301 -0.3274 -0.0055 -0.0001 0.0001 0.0003 -0.2786 0 0.3974 -0.0251 0.0002 0.0002 0.135 -0.0042 0.0003 0.0056 0 -0.2468 0.3196 NaN NaN NaN NaN 0.946 0 748.6115 0.9908 58.4306 0.6002 0.9804 6.3788 15.88 2.639 15.94 15.93 0.8656 3.353 0.4098 3.188 -0.0473 0.7243 0.996 2.2967 1000.7263 39.2373 123 111.3 75.2 46.2 350.671 0.3948 0 6.78 0.0034 0.0898 0.085 0.0358 0.0328 12.2566 0 4.271 10.284 0.4734 0.0167 11.8901 0.41 0.0506 NaN NaN 1017 967 1066 368 0.09 0.048 0.095 2 0.9 0.069 0.046 0.725 0.1139 0.3183 0.5888 0.3184 0.9499 0.3979 0.16 0 0 20.95 0.333 12.49 16.713 0.0803 5.72 0 11.19 65.363 0 0 0 0 0 0 0.292 5.38 20.1 0.296 10.62 10.3 5.38 4.04 16.23 0.2951 8.64 0 10.3 97.314 0 0.0772 0.0599 0.07 0.0547 0.0704 0.052 0.0301 0.1135 3.4789 0.001 NaN 0.0707 0.0211 175.2173 0.0315 1940.3994 0 0.0744 0.0546 0 0 0 0 0 0 0 0 0 0.0027 0.004 0 0 0 0 NaN NaN NaN NaN 0.0188 0 219.9453 0.0011 2.8374 0.0189 0.005 0.4269 0 0 0 0 0 0 0 0 0 0 0 0.0472 40.855 4.5152 30.9815 33.9606 22.9057 15.9525 110.2144 0.131 0 2.5883 0.001 0.0319 0.0197 0.012 0.0109 3.9321 0 1.5123 3.5811 0.1337 0.0055 3.8447 0.1077 0.0167 NaN NaN 418.1363 398.3185 496.1582 158.333 0.0373 0.0202 0.0462 0.6083 0.3032 0.02 0.0174 0.2827 0.0434 0.1342 0.2419 0.1343 0.367 0.1431 0.061 0 0 0 6.2698 0.1181 3.8208 5.3737 0.0254 1.6252 0 3.2461 18.0118 0 0 0 0 0 0 0.0752 1.5989 6.5893 0.0913 3.0911 8.4654 1.5989 1.2293 5.3406 0.0867 2.8551 0 2.9971 31.8843 NaN NaN 0 0.0215 0.0274 0.0315 0.0238 0.0206 0.0238 0.0144 0.0491 1.2708 0.0004 NaN 0.0229 0.0065 55.2039 0.0105 560.2658 0 0.017 0.0148 0.0124 0.0114 0 0 0 0 0 0 0 0.001 0.0013 0 0 0 0 NaN NaN NaN NaN 0.0055 0 61.5932 0.0003 0.9967 0.0082 0.0017 0.1437 0 0 0 0 0 0 0 0 0 0 0 0.0151 14.2396 1.4392 5.6188 3.6721 2.9329 2.1118 24.8504 29.0271 0 6.9458 2.738 5.9846 525.0965 0 3.4641 6.0544 0 53.684 2.4788 4.7141 1.7275 6.18 3.275 3.6084 18.7673 33.1562 26.3617 49.0013 10.0503 2.7073 3.1158 3.1136 44.5055 42.2737 1.3071 0.8693 1.1975 0.6288 0.9163 0.6448 1.4324 0.4576 0.1362 0 0 0 5.9396 3.2698 9.5805 2.3106 6.1463 4.0502 0 1.7924 29.9394 0 0 0 0 0 0 6.2052 311.6377 5.7277 2.7864 9.7752 63.7987 24.7625 13.6778 2.3394 31.9893 5.8142 0 1.6936 115.7408 0 613.3069 291.4842 494.6996 178.1759 843.1138 0 53.1098 0 48.2091 0.7578 NaN 2.957 2.1739 10.0261 17.1202 22.3756 0 0 0 0 0 0 0 0 0 0 0 0 64.6707 0 0 0 0 0 NaN NaN NaN NaN 1.9864 0 29.3804 0.1094 4.856 3.1406 0.5064 6.6926 0 0 0 0 0 0 0 0 0 0 0 2.057 4.0825 11.5074 0.1096 0.0078 0.0026 7.116 1.0616 395.57 75.752 0.4234 12.93 0.78 0.1827 5.7349 0.3363 39.8842 3.2687 1.0297 1.0344 0.4385 0.1039 42.3877 NaN NaN NaN NaN NaN NaN NaN NaN 533.85 2.1113 8.95 0.3157 3.0624 0.1026 1.6765 14.9509 NaN NaN NaN NaN 0.5005 0.0118 0.0035 2.363 NaN NaN NaN NaN
......@@ -111,7 +111,7 @@
3032.24 2502.87 2233.3667 1326.52 1.5334 100 100.3967 0.1235 1.5031 -0.0031 -0.0072 0.9569 201.9424 0 10.5661 420.5925 10.3387 0.9735 191.6037 12.4735 1.3888 -5476.25 2635.25 -3987.5 117 1.2887 1.9912 7.2748 62.8333 3.1556 0.2696 3.2728 86.3269 8.7677 50.248 64.1511 49.752 66.1542 86.1468 121.4364 76.39 2.209 70 353.34 10.4091 176.3136 789.7523 1.0341 138.0882 1 667.7418 233.5491 0 4.624 4.894 2865 0.9298 0.9449 4.6414 -12.2945 355.0809 9.7948 144.0191 21.9782 32.2945 44.1498 745.6025 0.9256 146.6636 1 645.7636 65.8417 NaN NaN 0 -0.0534 0.0183 -0.0167 -0.0449 0.0034 -0.0178 -0.0123 -0.0048 7.5017 0.1342 NaN 2.453 0.9902 1828.3846 0.1829 9014.46 0.0448 -0.0077 -0.0001 -0.0001 -0.0001 0.2189 0 -0.6704 -0.0167 0.0004 -0.0003 0.0696 -0.0045 0.0002 0.0078 0 -0.0799 -0.2038 NaN NaN NaN NaN 0.9424 0 796.595 0.9908 58.3858 0.5913 0.9628 6.3551 15.75 3.148 15.73 15.71 0.946 3.027 0.5328 3.299 -0.5677 0.778 1.001 2.3715 993.1274 38.1448 119 143.2 123.1 48.8 296.303 0.3744 0 3.64 0.0041 0.0634 0.0451 0.0623 0.024 14.2354 0 9.005 12.506 0.4434 0.0126 13.9047 0.43 0.0538 NaN NaN 699 283 1747 1443 0.147 0.04 0.113 3.9 0.8 0.101 0.499 0.576 0.0631 0.3053 0.583 0.3053 0.8285 0.1308 0.922 0 0 15.24 0.282 10.85 37.715 0.1189 3.98 0 25.54 72.149 0 0 0 0 0 0 0.25 5.52 15.76 0.519 10.71 19.77 5.52 8.446 33.832 0.3951 9.09 0 19.77 92.307 0 0.0915 0.0506 0.0769 0.1079 0.0797 0.1047 0.0924 0.1015 4.1338 0.003 NaN 0.0802 0.0004 69.151 0.197 1406.4004 0 0.0227 0.0272 0 0 0 0 0 0 0 0 0 0.0067 0.0031 0 0 0 0 NaN NaN NaN NaN 0.024 0 149.2172 0.0006 2.5775 0.0177 0.0214 0.4051 0 0 0 0 0 0 0 0 0 0 0 0.0488 19.862 3.6163 34.125 55.9626 53.0876 17.4864 88.7672 0.1092 0 1.0929 0.0013 0.0257 0.0116 0.0163 0.008 4.4239 0 3.2376 3.6536 0.1293 0.004 4.3474 0.1275 0.0181 NaN NaN 319.1252 128.0296 799.5884 628.3083 0.0755 0.0181 0.0476 1.35 0.2698 0.032 0.1541 0.2155 0.031 0.1354 0.2194 0.1354 0.3072 0.0582 0.3574 0 0 0 4.8956 0.0766 2.913 11.0583 0.0327 1.1229 0 7.3296 23.116 0 0 0 0 0 0 0.0822 1.6216 4.7279 0.1773 3.155 9.7777 1.6216 2.5923 10.5352 0.1301 3.0939 0 6.3767 32.0537 NaN NaN 0 0.0246 0.0221 0.0329 0.0522 0.0256 0.0545 0.0476 0.0463 1.553 0.001 NaN 0.0286 0.0001 21.0312 0.0573 494.7368 0 0.0063 0.0077 0.0052 0.0027 0 0 0 0 0 0 0 0.0025 0.0012 0 0 0 0 NaN NaN NaN NaN 0.0089 0 57.2692 0.0002 0.8495 0.0065 0.0077 0.1356 0 0 0 0 0 0 0 0 0 0 0 0.0165 7.1493 1.1704 5.3823 4.7226 4.9184 2.185 22.3369 24.4142 0 3.6256 3.3208 4.2178 0 866.0295 2.5046 7.0492 0 85.2255 2.9734 4.2892 1.2943 7.257 3.4473 3.8754 12.7642 10.739 43.8119 0 11.4064 2.0088 1.5533 6.2069 25.3521 37.4691 15.247 0.6672 0.7198 0.6076 0.9088 0.6136 1.2524 0.1518 0.7592 0 0 0 4.3131 2.7092 6.1538 4.7756 11.4945 2.8822 0 3.8248 30.8924 0 0 0 0 0 0 5.3863 44.898 4.4384 5.2987 7.4365 89.9529 17.0927 19.1303 4.5375 42.6838 6.1979 0 3.0615 140.1953 0 171.4486 276.881 461.8619 240.1781 0 587.3773 748.1781 0 55.1057 2.2358 NaN 3.2712 0.0372 3.7821 107.6905 15.6016 0 293.1396 0 0 0 0 0 0 0 0 0 0 148.0663 0 0 0 0 0 NaN NaN NaN NaN 2.5512 0 18.7319 0.0616 4.4146 2.9954 2.2181 6.3745 0 0 0 0 0 0 0 0 0 0 0 2.0579 1.9999 9.4805 0.1096 0.0078 0.0026 7.116 1.4636 399.914 79.156 1.0388 19.63 1.98 0.4287 9.7608 0.8311 70.9706 4.9086 2.5014 0.9778 0.2156 0.0461 22.05 NaN NaN NaN NaN NaN NaN NaN NaN 532.0155 2.0275 8.83 0.2224 3.1776 0.0706 1.6597 10.9698 NaN NaN NaN NaN 0.48 0.4766 0.1045 99.3032 0.0202 0.0149 0.0044 73.8432
```
> 准备数据将value为NaN的替换为均值
> 准备数据: 将value为NaN的替换为均值
```python
def replaceNanWithMean():
......@@ -126,7 +126,7 @@ def replaceNanWithMean():
return datMat
```
> 分析数据统计分析 N 的阈值
> 分析数据: 统计分析 N 的阈值
![PCA分析数据过程](http://data.apachecn.org/img/AiLearning/ml/13.PCA/PCA分析数据过程.jpg)
......@@ -134,7 +134,7 @@ def replaceNanWithMean():
在等式 Av=入v 中,v 是特征向量, 入是特征值。<br/>
表示 如果特征向量 v 被某个矩阵 A 左乘,那么它就等于某个标量 入 乘以 v.<br/>
幸运的是 Numpy 中有寻找特征向量和特征值的模块 linalg,它有 eig() 方法,该方法用于求解特征向量和特征值。
幸运的是: Numpy 中有寻找特征向量和特征值的模块 linalg,它有 eig() 方法,该方法用于求解特征向量和特征值。
```python
def pca(dataMat, topNfeat=9999999):
......@@ -158,9 +158,9 @@ def pca(dataMat, topNfeat=9999999):
# cov协方差=[(x1-x均值)*(y1-y均值)+(x2-x均值)*(y2-y均值)+...+(xn-x均值)*(yn-y均值)+]/(n-1)
'''
方差(一维)度量两个随机变量关系的统计量
协方差 (二维)度量各个维度偏离其均值的程度
协方差矩阵(多维)度量各个维度偏离其均值的程度
方差: (一维)度量两个随机变量关系的统计量
协方差: (二维)度量各个维度偏离其均值的程度
协方差矩阵: (多维)度量各个维度偏离其均值的程度
当 cov(X, Y)>0时,表明X与Y正相关;(X越大,Y也越大;X越小Y,也越小。这种情况,我们称为“正相关”。)
当 cov(X, Y)<0时,表明X与Y负相关;
......@@ -212,7 +212,7 @@ def pca(dataMat, topNfeat=9999999):
```
降维技术使得数据变的更易使用,并且它们往往能够去除数据中的噪音,使得其他机器学习任务更加精确。
降维往往作为预处理步骤,在数据应用到其他算法之前清洗数据。
比较流行的降维技术 独立成分分析、因子分析 和 主成分分析, 其中又以主成分分析应用最广泛。
比较流行的降维技术: 独立成分分析、因子分析 和 主成分分析, 其中又以主成分分析应用最广泛。
本章中的PCA将所有的数据集都调入了内存,如果无法做到,就需要其他的方法来寻找其特征值。
如果使用在线PCA分析的方法,你可以参考一篇优秀的论文 "Incremental Eigenanalysis for Classification"。
......@@ -221,6 +221,6 @@ def pca(dataMat, topNfeat=9999999):
* * *
* **作者[片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [1988](http://cwiki.apachecn.org/display/~lihuisong)**
* **作者: [片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [1988](http://cwiki.apachecn.org/display/~lihuisong)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -14,7 +14,7 @@
> 信息检索-隐性语义检索(Latent Semantic Indexing, LSI)或 隐形语义分析(Latent Semantic Analysis, LSA)
隐性语义索引矩阵 = 文档 + 词语
隐性语义索引: 矩阵 = 文档 + 词语
* 是最早的 SVD 应用之一,我们称利用 SVD 的方法为隐性语义索引(LSI)或隐性语义分析(LSA)。
![LSA举例](http://data.apachecn.org/img/AiLearning/ml/14.SVD/使用SVD简化数据-LSI举例.png)
......@@ -30,7 +30,7 @@
> 图像压缩
例如`32*32=1024 => 32*2+2*1+32*2=130`(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
例如: `32*32=1024 => 32*2+2*1+32*2=130`(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
![SVD公式](http://data.apachecn.org/img/AiLearning/ml/14.SVD/使用SVD简化数据-SVD公式.jpg)
......@@ -42,12 +42,12 @@
* 矩阵分解是将数据矩阵分解为多个独立部分的过程。
* 矩阵分解可以将原始矩阵表示成新的易于处理的形式,这种新形式是两个或多个矩阵的乘积。(类似代数中的因数分解)
* 举例如何将12分解成两个数的乘积?(1,12)、(2,6)、(3,4)都是合理的答案。
* 举例: 如何将12分解成两个数的乘积?(1,12)、(2,6)、(3,4)都是合理的答案。
> SVD 是矩阵分解的一种类型,也是矩阵分解最常见的技术
* SVD 将原始的数据集矩阵 Data 分解成三个矩阵 U、∑、V
* 举例如果原始矩阵 \\(Data_{m*n}\\) 是m行n列,
* 举例: 如果原始矩阵 \\(Data_{m*n}\\) 是m行n列,
* \\(U_{m * k}\\) 表示m行k列
* \\(∑_{k * k}\\) 表示k行k列
* \\(V_{k * n}\\) 表示k行n列。
......@@ -56,20 +56,20 @@
![SVD公式](http://data.apachecn.org/img/AiLearning/ml/14.SVD/使用SVD简化数据-SVD公式.jpg)
具体的案例:(大家可以试着推导一下:https://wenku.baidu.com/view/b7641217866fb84ae45c8d17.html )
具体的案例: (大家可以试着推导一下: https://wenku.baidu.com/view/b7641217866fb84ae45c8d17.html )
![SVD公式](http://data.apachecn.org/img/AiLearning/ml/14.SVD/SVD公式的测试案例.jpg)
* 上述分解中会构建出一个矩阵∑,该矩阵只有对角元素,其他元素均为0(近似于0)。另一个惯例就是,∑的对角元素是从大到小排列的。这些对角元素称为奇异值。
* 奇异值与特征值(PCA 数据中重要特征)是有关系的。这里的奇异值就是矩阵 \\(Data * Data^T\\) 特征值的平方根。
* 普遍的事实在某个奇异值的数目(r 个=>奇异值的平方和累加到总值的90%以上)之后,其他的奇异值都置为0(近似于0)。这意味着数据集中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。
* 普遍的事实: 在某个奇异值的数目(r 个=>奇异值的平方和累加到总值的90%以上)之后,其他的奇异值都置为0(近似于0)。这意味着数据集中仅有 r 个重要特征,而其余特征则都是噪声或冗余特征。
### SVD 算法特点
```
优点简化数据,去除噪声,优化算法的结果
缺点数据的转换可能难以理解
使用的数据类型数值型数据
优点: 简化数据,去除噪声,优化算法的结果
缺点: 数据的转换可能难以理解
使用的数据类型: 数值型数据
```
## 推荐系统
......@@ -89,17 +89,17 @@
> 基于协同过滤(collaborative filtering) 的推荐引擎
* 利用Python 实现 SVD(Numpy 有一个称为 linalg 的线性代数工具箱)
* 协同过滤是通过将用户和其他用户的数据进行对比来实现推荐的。
* 协同过滤: 是通过将用户和其他用户的数据进行对比来实现推荐的。
* 当知道了两个用户或两个物品之间的相似度,我们就可以利用已有的数据来预测未知用户的喜好。
> 基于物品的相似度和基于用户的相似度物品比较少则选择物品相似度,用户比较少则选择用户相似度。【矩阵还是小一点好计算】
> 基于物品的相似度和基于用户的相似度: 物品比较少则选择物品相似度,用户比较少则选择用户相似度。【矩阵还是小一点好计算】
* 基于物品的相似度计算物品之间的距离。【耗时会随物品数量的增加而增加】
* 基于物品的相似度: 计算物品之间的距离。【耗时会随物品数量的增加而增加】
* 由于物品A和物品C 相似度(相关度)很高,所以给买A的人推荐C。
![SVD公式](http://data.apachecn.org/img/AiLearning/ml/14.SVD/使用SVD简化数据-基于物品相似度.png)
* 基于用户的相似度计算用户之间的距离。【耗时会随用户数量的增加而增加】
* 基于用户的相似度: 计算用户之间的距离。【耗时会随用户数量的增加而增加】
* 由于用户A和用户C 相似度(相关度)很高,所以A和C是兴趣相投的人,对于C买的物品就会推荐给A。
![SVD公式](http://data.apachecn.org/img/AiLearning/ml/14.SVD/使用SVD简化数据-基于用户相似度.png)
......@@ -107,15 +107,15 @@
> 相似度计算
* inA, inB 对应的是 列向量
1. 欧氏距离指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。二维或三维中的欧氏距离就是两点之间的实际距离。
1. 欧氏距离: 指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。二维或三维中的欧氏距离就是两点之间的实际距离。
* 相似度= 1/(1+欧式距离)
* `相似度= 1.0/(1.0 + la.norm(inA - inB))`
* 物品对越相似,它们的相似度值就越大。
2. 皮尔逊相关系数度量的是两个向量之间的相似度。
2. 皮尔逊相关系数: 度量的是两个向量之间的相似度。
* 相似度= 0.5 + 0.5*corrcoef() 【皮尔逊相关系数的取值范围从 -1 到 +1,通过函数0.5 + 0.5\*corrcoef()这个函数计算,把值归一化到0到1之间】
* `相似度= 0.5 + 0.5 * corrcoef(inA, inB, rowvar = 0)[0][1]`
* 相对欧氏距离的优势它对用户评级的量级并不敏感。
3. 余弦相似度计算的是两个向量夹角的余弦值。
* 相对欧氏距离的优势: 它对用户评级的量级并不敏感。
3. 余弦相似度: 计算的是两个向量夹角的余弦值。
* 余弦值 = (A·B)/(||A||·||B||) 【余弦值的取值范围也在-1到+1之间】
* 相似度= 0.5 + 0.5*余弦值
* `相似度= 0.5 + 0.5*( float(inA.T*inB) / la.norm(inA)*la.norm(inB))`
......@@ -124,15 +124,15 @@
> 推荐系统的评价
* 采用交叉测试的方法。【拆分数据为训练集和测试集】
* 推荐引擎评价的指标 最小均方根误差(Root mean squared error, RMSE),也称标准误差(Standard error),就是计算均方误差的平均值然后取其平方根。
* 推荐引擎评价的指标: 最小均方根误差(Root mean squared error, RMSE),也称标准误差(Standard error),就是计算均方误差的平均值然后取其平方根。
* 如果RMSE=1, 表示相差1个星级;如果RMSE=2.5, 表示相差2.5个星级。
### 推荐系统 原理
* 推荐系统的工作过程给定一个用户,系统会为此用户返回N个最好的推荐菜。
* 实现流程大致如下
* 推荐系统的工作过程: 给定一个用户,系统会为此用户返回N个最好的推荐菜。
* 实现流程大致如下:
1. 寻找用户没有评级的菜肴,即在用户-物品矩阵中的0值。
2. 在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数。这就是说我们认为用户可能会对物品的打分(这就是相似度计算的初衷)。
2. 在用户没有评级的所有物品中,对每个物品预计一个可能的评级分数。这就是说: 我们认为用户可能会对物品的打分(这就是相似度计算的初衷)。
3. 对这些物品的评分从高到低进行排序,返回前N个物品。
......@@ -152,9 +152,9 @@
def loadExData3():
# 利用SVD提高推荐效果,菜肴矩阵
"""
代表人
代表菜肴名词
代表人对菜肴的评分,0表示未评分
: 代表人
: 代表菜肴名词
: 代表人对菜肴的评分,0表示未评分
"""
return[[2, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
......@@ -227,7 +227,7 @@ def standEst(dataMat, user, simMeas, item):
return ratSimTotal/simTotal
```
* 2.基于SVD(参考地址http://www.codeweblog.com/svd-%E7%AC%94%E8%AE%B0/)
* 2.基于SVD(参考地址: http://www.codeweblog.com/svd-%E7%AC%94%E8%AE%B0/)
![基于SVD.png](http://data.apachecn.org/img/AiLearning/ml/14.SVD/基于SVD.png)
......@@ -315,14 +315,14 @@ def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
1. 通过各种标签来标记菜肴
2. 将这些属性作为相似度计算所需要的数据
3. 这就是基于内容的推荐。
3. 这就是: 基于内容的推荐。
> 构建推荐引擎面临的挑战
问题
* 1)在大规模的数据集上,SVD分解会降低程序的速度
* 2)存在其他很多规模扩展性的挑战性问题,比如矩阵的表示方法和计算相似度得分消耗资源。
* 3)如何在缺乏数据时给出好的推荐-称为冷启动【简单说用户不会喜欢一个无效的物品,而用户不喜欢的物品又无效】
* 3)如何在缺乏数据时给出好的推荐-称为冷启动【简单说: 用户不会喜欢一个无效的物品,而用户不喜欢的物品又无效】
建议
* 1)在大型系统中,SVD分解(可以在程序调入时运行一次)每天运行一次或者其频率更低,并且还要离线运行。
......@@ -372,13 +372,13 @@ def analyse_data(Sigma, loopNum=20):
通常保留矩阵 80% ~ 90% 的能量,就可以得到重要的特征并取出噪声。
'''
print '主成分:%s, 方差占比:%s%%' % (format(i+1, '2.0f'), format(SigmaI/SigmaSum*100, '4.2f'))
print '主成分: %s, 方差占比: %s%%' % (format(i+1, '2.0f'), format(SigmaI/SigmaSum*100, '4.2f'))
```
> 使用算法: 对比使用 SVD 前后的数据差异对比,对于存储大家可以试着写写
例如`32*32=1024 => 32*2+2*1+32*2=130`(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
例如: `32*32=1024 => 32*2+2*1+32*2=130`(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
```python
# 打印矩阵
......@@ -428,6 +428,6 @@ def imgCompress(numSV=3, thresh=0.8):
* * *
* **作者[片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [1988](http://cwiki.apachecn.org/display/~lihuisong)**
* **作者: [片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [1988](http://cwiki.apachecn.org/display/~lihuisong)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -13,7 +13,7 @@
假如你为一家网络购物商店工作,很多用户访问该网站,其中有些人会购买商品,有些人则随意浏览后就离开。
对于你来说,可能很想识别那些有购物意愿的用户。
那么问题就来了,数据集可能会非常大,在单机上训练要运行好几天。
接下来我们讲讲 MapRedece 如何来解决这样的问题
接下来: 我们讲讲 MapRedece 如何来解决这样的问题
```
......@@ -79,17 +79,17 @@ cat data/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapRe
#### Mahout in Action
1. 简单贝叶斯它属于为数不多的可以很自然的使用MapReduce的算法。通过统计在某个类别下某特征的概率。
2. k-近邻算法高维数据下(如文本、图像和视频)流行的近邻查找方法是局部敏感哈希算法。
3. 支持向量机(SVM)使用随机梯度下降算法求解,如Pegasos算法。
4. 奇异值分解Lanczos算法是一个有效的求解近似特征值的算法。
5. k-均值聚类canopy算法初始化k个簇,然后再运行K-均值求解结果。
1. 简单贝叶斯: 它属于为数不多的可以很自然的使用MapReduce的算法。通过统计在某个类别下某特征的概率。
2. k-近邻算法: 高维数据下(如文本、图像和视频)流行的近邻查找方法是局部敏感哈希算法。
3. 支持向量机(SVM): 使用随机梯度下降算法求解,如Pegasos算法。
4. 奇异值分解: Lanczos算法是一个有效的求解近似特征值的算法。
5. k-均值聚类: canopy算法初始化k个簇,然后再运行K-均值求解结果。
### 使用 mrjob 库将 MapReduce 自动化
> 理论简介
* MapReduce 作业流自动化的框架Cascading 和 Oozie.
* MapReduce 作业流自动化的框架: Cascading 和 Oozie.
* mrjob 是一个不错的学习工具,与2010年底实现了开源,来之于 Yelp(一个餐厅点评网站).
```Shell
......@@ -106,7 +106,7 @@ python src/python/15.BigData_MapReduce/mrMean.py < data/15.BigData_MapReduce/inp
python src/python/15.BigData_MapReduce/mrMean.py < data/15.BigData_MapReduce/inputFile.txt
```
### 项目案例分布式 SVM 的 Pegasos 算法
### 项目案例: 分布式 SVM 的 Pegasos 算法
Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
......@@ -118,14 +118,14 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
* 如果不是则将其加入到待更新集合。
3. 批处理完毕后,权重向量按照这些错分的样本进行更新。
上述算法伪代码如下
上述算法伪代码如下:
```
将 回归系数w 初始化为0
对每次批处理
随机选择 k 个样本点(向量)
对每个向量
如果该向量被错分
如果该向量被错分:
更新权重向量 w
累加对 w 的更新
```
......@@ -133,17 +133,17 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
#### 开发流程
```
收集数据数据按文本格式存放。
准备数据输入数据已经是可用的格式,所以不需任何准备工作。如果你需要解析一个大规模的数据集,建议使用 map 作业来完成,从而达到并行处理的目的。
分析数据无。
训练算法与普通的 SVM 一样,在分类器训练上仍需花费大量的时间。
测试算法在二维空间上可视化之后,观察超平面,判断算法是否有效。
使用算法本例不会展示一个完整的应用,但会展示如何在大数据集上训练SVM。该算法其中一个应用场景就是本文分类,通常在文本分类里可能有大量的文档和成千上万的特征。
收集数据: 数据按文本格式存放。
准备数据: 输入数据已经是可用的格式,所以不需任何准备工作。如果你需要解析一个大规模的数据集,建议使用 map 作业来完成,从而达到并行处理的目的。
分析数据: 无。
训练算法: 与普通的 SVM 一样,在分类器训练上仍需花费大量的时间。
测试算法: 在二维空间上可视化之后,观察超平面,判断算法是否有效。
使用算法: 本例不会展示一个完整的应用,但会展示如何在大数据集上训练SVM。该算法其中一个应用场景就是本文分类,通常在文本分类里可能有大量的文档和成千上万的特征。
```
> 收集数据
文本文件数据格式如下
文本文件数据格式如下:
```python
0.365032 2.465645 -1
......@@ -213,11 +213,11 @@ def batchPegasos(dataSet, labels, lam, T, k):
[完整代码地址](https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/15.BigData_MapReduce/pegasos.py): <https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/15.BigData_MapReduce/pegasos.py>
运行方式`python /opt/git/MachineLearning/src/python/15.BigData_MapReduce/mrSVM.py < data/15.BigData_MapReduce/inputFile.txt`
运行方式: `python /opt/git/MachineLearning/src/python/15.BigData_MapReduce/mrSVM.py < data/15.BigData_MapReduce/inputFile.txt`
[MR版本的代码地址](https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/15.BigData_MapReduce/mrSVM.py): <https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/15.BigData_MapReduce/mrSVM.py>
* * *
* **作者[片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* **作者: [片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -2,9 +2,9 @@
## 背景与挖掘目标
随着互联网的快速发展,用户很难快速从海量信息中寻找到自己感兴趣的信息。因此诞生了搜索引擎+推荐系统
随着互联网的快速发展,用户很难快速从海量信息中寻找到自己感兴趣的信息。因此诞生了: 搜索引擎+推荐系统
本章节-推荐系统
本章节-推荐系统:
1. 帮助用户发现其感兴趣和可能感兴趣的信息。
2. 让网站价值信息脱颖而出,得到广大用户的认可。
......@@ -23,9 +23,9 @@
正常的情况下,需要对用户的兴趣爱好以及需求进行分类。
因为在用户访问记录中,没有记录用户访问页面时间的长短,因此不容易判断用户兴趣爱好。
因此,本文根据用户浏览的网页信息进行分析处理,主要采用以下方法处理以用户浏览网页的类型进行分类,然后对每个类型中的内容进行推荐。
因此,本文根据用户浏览的网页信息进行分析处理,主要采用以下方法处理: 以用户浏览网页的类型进行分类,然后对每个类型中的内容进行推荐。
分析过程如下
分析过程如下:
* 从系统中获取用户访问网站的原始记录。
* 对数据进行多维分析,包括用户访问内容,流失用户分析以及用户分类等分析。
......@@ -65,21 +65,21 @@
* 矩阵分解通过把原始的评分矩阵R分解为两个矩阵相乘,并且只考虑有评分的值,训练时不考虑missing项的值。R矩阵分解成为U与V两个矩阵后,评分矩阵R中missing的值就可以通过U矩阵中的某列和V矩阵的某行相乘得到
* 矩阵分解的目标函数: U矩阵与V矩阵的可以通过梯度下降(gradient descent)算法求得,通过交替更新u与v多次迭代收敛之后可求出U与V。
* 矩阵分解背后的核心思想,找到两个矩阵,它们相乘之后得到的那个矩阵的值,与评分矩阵R中有值的位置中的值尽可能接近。这样一来,分解出来的两个矩阵相乘就尽可能还原了评分矩阵R,因为有值的地方,值都相差得尽可能地小,那么missing的值通过这样的方式计算得到,比较符合趋势。
* 协同过滤中主要存在如下两个问题稀疏性与冷启动问题。已有的方案通常会通过引入多个不同的数据源或者辅助信息(Side information)来解决这些问题,用户的Side information可以是用户的基本个人信息、用户画像信息等,而Item的Side information可以是物品的content信息等。
* 协同过滤中主要存在如下两个问题: 稀疏性与冷启动问题。已有的方案通常会通过引入多个不同的数据源或者辅助信息(Side information)来解决这些问题,用户的Side information可以是用户的基本个人信息、用户画像信息等,而Item的Side information可以是物品的content信息等。
## 效果评估
1. 召回率和准确率 【人为统计分析】
2. F值(P-R曲线) 【偏重非均衡问题】
3. ROC和AUC 【偏重不同结果的对比】
2. F值(P-R曲线) 【偏重: 非均衡问题】
3. ROC和AUC 【偏重: 不同结果的对比】
* * *
* **作者[片刻](https://github.com/jiangzhonglian)**
* **作者: [片刻](https://github.com/jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
> 摘录的原文地址
> 摘录的原文地址:
* [推荐系统中常用算法 以及优点缺点对比](http://www.36dsj.com/archives/9519)
* [推荐算法的基于知识推荐](https://zhidao.baidu.com/question/2013524494179442228.html)
......
此差异已折叠。
......@@ -10,13 +10,13 @@
`决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。`
`决策树学习通常包括 3 个步骤特征选择、决策树的生成和决策树的修剪。`
`决策树学习通常包括 3 个步骤: 特征选择、决策树的生成和决策树的修剪。`
## 决策树 场景
一个叫做 "二十个问题" 的游戏,游戏的规则很简单参与游戏的一方在脑海中想某个事物,其他参与者向他提问,只允许提 20 个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围,最后得到游戏的答案。
一个叫做 "二十个问题" 的游戏,游戏的规则很简单: 参与游戏的一方在脑海中想某个事物,其他参与者向他提问,只允许提 20 个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围,最后得到游戏的答案。
一个邮件分类系统,大致工作流程如下
一个邮件分类系统,大致工作流程如下:
![决策树-流程图](http://data.apachecn.org/img/AiLearning/ml/3.DecisionTree/决策树-流程图.jpg "决策树示例流程图")
......@@ -26,11 +26,11 @@
如果不包含则将邮件归类到 "无需阅读的垃圾邮件" 。
```
决策树的定义
决策树的定义:
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性(features),叶结点表示一个类(labels)。
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型: 内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性(features),叶结点表示一个类(labels)。
用决策树对需要测试的实例进行分类从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分配到叶结点的类中。
用决策树对需要测试的实例进行分类: 从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分配到叶结点的类中。
## 决策树 原理
......@@ -38,19 +38,19 @@
#### 信息熵 & 信息增益
熵(entropy)
熵(entropy):
熵指的是体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。
信息论(information theory)中的熵(香农熵)
是一种信息的度量方式,表示信息的混乱程度,也就是说:信息越有序,信息熵越低。例如:火柴有序放在火柴盒里,熵值很低,相反,熵值很高。
信息论(information theory)中的熵(香农熵):
是一种信息的度量方式,表示信息的混乱程度,也就是说: 信息越有序,信息熵越低。例如: 火柴有序放在火柴盒里,熵值很低,相反,熵值很高。
信息增益(information gain)
信息增益(information gain):
在划分数据集前后信息发生的变化称为信息增益。
### 决策树 工作原理
如何构造一个决策树?<br/>
我们使用 createBranch() 方法,如下所示
我们使用 createBranch() 方法,如下所示:
```
def createBranch():
......@@ -71,20 +71,20 @@ def createBranch():
### 决策树 开发流程
```
收集数据可以使用任何方法。
准备数据树构造算法 (这里使用的是ID3算法,只适用于标称型数据,这就是为什么数值型数据必须离散化。 还有其他的树构造算法,比如CART)
分析数据可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
训练算法构造树的数据结构。
测试算法使用训练好的树计算错误率。
使用算法此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义。
收集数据: 可以使用任何方法。
准备数据: 树构造算法 (这里使用的是ID3算法,只适用于标称型数据,这就是为什么数值型数据必须离散化。 还有其他的树构造算法,比如CART)
分析数据: 可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
训练算法: 构造树的数据结构。
测试算法: 使用训练好的树计算错误率。
使用算法: 此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义。
```
### 决策树 算法特点
```
优点计算复杂度不高,输出结果易于理解,数据有缺失也能跑,可以处理不相关特征。
缺点容易过拟合。
适用数据类型数值型和标称型。
优点: 计算复杂度不高,输出结果易于理解,数据有缺失也能跑,可以处理不相关特征。
缺点: 容易过拟合。
适用数据类型: 数值型和标称型。
```
## 决策树 项目案例
......@@ -93,9 +93,9 @@ def createBranch():
#### 项目概述
根据以下 2 个特征,将动物分成两类鱼类和非鱼类。
根据以下 2 个特征,将动物分成两类: 鱼类和非鱼类。
特征
特征:
1. 不浮出水面是否可以生存
2. 是否有脚蹼
......@@ -104,15 +104,15 @@ def createBranch():
[完整代码地址](/src/py2.x/ml/3.DecisionTree/DecisionTree.py): <https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/3.DecisionTree/DecisionTree.py>
```
收集数据可以使用任何方法
准备数据树构造算法(这里使用的是ID3算法,因此数值型数据必须离散化。)
分析数据可以使用任何方法,构造树完成之后,我们可以将树画出来。
训练算法构造树结构
测试算法使用习得的决策树执行分类
使用算法此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义
收集数据: 可以使用任何方法
准备数据: 树构造算法(这里使用的是ID3算法,因此数值型数据必须离散化。)
分析数据: 可以使用任何方法,构造树完成之后,我们可以将树画出来。
训练算法: 构造树结构
测试算法: 使用习得的决策树执行分类
使用算法: 此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义
```
> 收集数据可以使用任何方法
> 收集数据: 可以使用任何方法
![海洋生物数据](http://data.apachecn.org/img/AiLearning/ml/3.DecisionTree/DT_海洋生物数据.png)
......@@ -128,11 +128,11 @@ def createDataSet():
labels = ['no surfacing', 'flippers']
return dataSet, labels
```
> 准备数据树构造算法
> 准备数据: 树构造算法
此处,由于我们输入的数据本身就是离散化数据,所以这一步就省略了。
> 分析数据可以使用任何方法,构造树完成之后,我们可以将树画出来。
> 分析数据: 可以使用任何方法,构造树完成之后,我们可以将树画出来。
![熵的计算公式](http://data.apachecn.org/img/AiLearning/ml/3.DecisionTree/熵的计算公式.jpg)
......@@ -187,7 +187,7 @@ def splitDataSet(dataSet, index, value):
# [:index]表示前index行,即若 index 为2,就是取 featVec 的前 index 行
reducedFeatVec = featVec[:index]
'''
请百度查询一下 extend和append的区别
请百度查询一下: extend和append的区别
music_media.append(object) 向列表中添加一个对象object
           music_media.extend(sequence) 把一个序列seq的内容添加到列表中 (跟 += 在list运用类似, music_media += sequence)
           1、使用append的时候,是将object看作一个对象,整体打包添加到music_media对象中。
......@@ -195,17 +195,17 @@ def splitDataSet(dataSet, index, value):
music_media = []
music_media.extend([1,2,3])
print music_media
           #结果
           #结果:
           #[1, 2, 3]
music_media.append([4,5,6])
print music_media
#结果
#结果:
           #[1, 2, 3, [4, 5, 6]]
music_media.extend([7,8,9])
print music_media
#结果
#结果:
           #[1, 2, 3, [4, 5, 6], 7, 8, 9]
'''
reducedFeatVec.extend(featVec[index+1:])
......@@ -261,25 +261,25 @@ def chooseBestFeatureToSplit(dataSet):
```
```
上面的 newEntropy 为什么是根据子集计算的呢?
因为我们在根据一个特征计算香农熵的时候,该特征的分类值是相同,这个特征这个分类的香农熵为 0;
: 上面的 newEntropy 为什么是根据子集计算的呢?
: 因为我们在根据一个特征计算香农熵的时候,该特征的分类值是相同,这个特征这个分类的香农熵为 0;
这就是为什么计算新的香农熵的时候使用的是子集。
```
> 训练算法构造树的数据结构
> 训练算法: 构造树的数据结构
创建树的函数代码如下
创建树的函数代码如下:
```python
def createTree(dataSet, labels):
classList = [example[-1] for example in dataSet]
# 如果数据集的最后一列的第一个值出现的次数=整个集合的数量,也就说只有一个类别,就只直接返回结果就行
# 第一个停止条件所有的类标签完全相同,则直接返回该类标签。
# 第一个停止条件: 所有的类标签完全相同,则直接返回该类标签。
# count() 函数是统计括号中的值在list中出现的次数
if classList.count(classList[0]) == len(classList):
return classList[0]
# 如果数据集只有1列,那么最初出现label次数最多的一类,作为结果
# 第二个停止条件使用完了所有特征,仍然不能将数据集划分成仅包含唯一类别的分组。
# 第二个停止条件: 使用完了所有特征,仍然不能将数据集划分成仅包含唯一类别的分组。
if len(dataSet[0]) == 1:
return majorityCnt(classList)
......@@ -289,7 +289,7 @@ def createTree(dataSet, labels):
bestFeatLabel = labels[bestFeat]
# 初始化myTree
myTree = {bestFeatLabel: {}}
# 注labels列表是可变对象,在PYTHON函数中作为参数时传址引用,能够被全局修改
# 注: labels列表是可变对象,在PYTHON函数中作为参数时传址引用,能够被全局修改
# 所以这行代码导致函数外的同名变量被删除了元素,造成例句无法执行,提示'no surfacing' is not in list
del(labels[bestFeat])
# 取出最优列,然后它的branch做分类
......@@ -304,7 +304,7 @@ def createTree(dataSet, labels):
return myTree
```
> 测试算法使用决策树执行分类
> 测试算法: 使用决策树执行分类
```python
def classify(inputTree, featLabels, testVec):
......@@ -335,7 +335,7 @@ def classify(inputTree, featLabels, testVec):
return classLabel
```
> 使用算法此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义。
> 使用算法: 此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义。
### 项目案例2: 使用决策树预测隐形眼镜类型
......@@ -355,9 +355,9 @@ def classify(inputTree, featLabels, testVec):
5. 测试算法: 编写测试函数验证决策树可以正确分类给定的数据实例。
6. 使用算法: 存储树的数据结构,以便下次使用时无需重新构造树。
> 收集数据提供的文本文件
> 收集数据: 提供的文本文件
文本文件数据格式如下
文本文件数据格式如下:
```
young myope no reduced no lenses
......@@ -365,20 +365,20 @@ pre myope no reduced no lenses
presbyopic myope no reduced no lenses
```
> 解析数据解析 tab 键分隔的数据行
> 解析数据: 解析 tab 键分隔的数据行
```python
lecses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']
```
> 分析数据快速检查数据,确保正确地解析数据内容,使用 createPlot() 函数绘制最终的树形图。
> 分析数据: 快速检查数据,确保正确地解析数据内容,使用 createPlot() 函数绘制最终的树形图。
```python
>>> treePlotter.createPlot(lensesTree)
```
> 训练算法使用 createTree() 函数
> 训练算法: 使用 createTree() 函数
```python
>>> lensesTree = trees.createTree(lenses, lensesLabels)
......@@ -412,6 +412,6 @@ def grabTree(filename):
* * *
* **作者[片刻](https://github.com/jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* **作者: [片刻](https://github.com/jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
# 第4章 基于概率论的分类方法朴素贝叶斯
# 第4章 基于概率论的分类方法: 朴素贝叶斯
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
![朴素贝叶斯_首页](http://data.apachecn.org/img/AiLearning/ml/4.NaiveBayesian/NavieBayesian_headPage_xy.png "朴素贝叶斯首页")
......@@ -12,11 +12,11 @@
### 贝叶斯理论
我们现在有一个数据集,它由两类数据组成,数据分布如下图所示
我们现在有一个数据集,它由两类数据组成,数据分布如下图所示:
![朴素贝叶斯示例数据分布](http://data.apachecn.org/img/AiLearning/ml/4.NaiveBayesian/朴素贝叶斯示例数据分布.png "参数已知的概率分布")
我们现在用 p1(x,y) 表示数据点 (x,y) 属于类别 1(图中用圆点表示的类别)的概率,用 p2(x,y) 表示数据点 (x,y) 属于类别 2(图中三角形表示的类别)的概率,那么对于一个新数据点 (x,y),可以用下面的规则来判断它的类别
我们现在用 p1(x,y) 表示数据点 (x,y) 属于类别 1(图中用圆点表示的类别)的概率,用 p2(x,y) 表示数据点 (x,y) 属于类别 2(图中三角形表示的类别)的概率,那么对于一个新数据点 (x,y),可以用下面的规则来判断它的类别:
* 如果 p1(x,y) > p2(x,y) ,那么类别为1
* 如果 p2(x,y) > p1(x,y) ,那么类别为2
......@@ -36,13 +36,13 @@
计算 P(white) 或者 P(black) ,如果事先我们知道石头所在桶的信息是会改变结果的。这就是所谓的条件概率(conditional probablity)。假定计算的是从 B 桶取到白色石头的概率,这个概率可以记作 P(white|bucketB) ,我们称之为“在已知石头出自 B 桶的条件下,取出白色石头的概率”。很容易得到,P(white|bucketA) 值为 2/4 ,P(white|bucketB) 的值为 1/3 。
条件概率的计算公式如下
条件概率的计算公式如下:
P(white|bucketB) = P(white and bucketB) / P(bucketB)
首先,我们用 B 桶中白色石头的个数除以两个桶中总的石头数,得到 P(white and bucketB) = 1/7 .其次,由于 B 桶中有 3 块石头,而总石头数为 7 ,于是 P(bucketB) 就等于 3/7 。于是又 P(white|bucketB) = P(white and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 。
另外一种有效计算条件概率的方法称为贝叶斯准则。贝叶斯准则告诉我们如何交换条件概率中的条件与结果,即如果已知 P(x|c),要求 P(c|x),那么可以使用下面的计算方法
另外一种有效计算条件概率的方法称为贝叶斯准则。贝叶斯准则告诉我们如何交换条件概率中的条件与结果,即如果已知 P(x|c),要求 P(c|x),那么可以使用下面的计算方法:
![计算p(c|x)的方法](http://data.apachecn.org/img/AiLearning/ml/4.NaiveBayesian/NB_4.png)
......@@ -199,7 +199,7 @@ def setOfWords2Vec(vocabList, inputSet):
'stupid', 'so', 'take', 'mr', 'steak', 'my']
```
检查函数有效性。例如myVocabList 中索引为 2 的元素是什么单词?应该是是 help 。该单词在第一篇文档中出现了,现在检查一下看看它是否出现在第四篇文档中。
检查函数有效性。例如: myVocabList 中索引为 2 的元素是什么单词?应该是是 help 。该单词在第一篇文档中出现了,现在检查一下看看它是否出现在第四篇文档中。
```python
>>> bayes.setOfWords2Vec(myVocabList, listOPosts[0])
......@@ -219,7 +219,7 @@ def setOfWords2Vec(vocabList, inputSet):
问: 上述代码实现中,为什么没有计算P(w)?
根据上述公式可知,我们右边的式子等同于左边的式子,由于对于每个ci,P(w)是固定的。并且我们只需要比较左边式子值的大小来决策分类,那么我们就可以简化为通过比较右边分子值得大小来做决策分类。
: 根据上述公式可知,我们右边的式子等同于左边的式子,由于对于每个ci,P(w)是固定的。并且我们只需要比较左边式子值的大小来决策分类,那么我们就可以简化为通过比较右边分子值得大小来做决策分类。
首先可以通过类别 i (侮辱性留言或者非侮辱性留言)中的文档数除以总的文档数来计算概率 p(ci) 。接下来计算 p(<b>w</b> | ci) ,这里就要用到朴素贝叶斯假设。如果将 w 展开为一个个独立特征,那么就可以将上述概率写作 p(w0, w1, w2...wn | ci) 。这里假设所有词都互相独立,该假设也称作条件独立性假设(例如 A 和 B 两个人抛骰子,概率是互不影响的,也就是相互独立的,A 抛 2点的同时 B 抛 3 点的概率就是 1/6 * 1/6),它意味着可以使用 p(w0 | ci)p(w1 | ci)p(w2 | ci)...p(wn | ci) 来计算上述概率,这样就极大地简化了计算的过程。
......@@ -326,10 +326,10 @@ def trainNB0(trainMatrix, trainCategory):
```python
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
"""
使用算法
使用算法:
# 将乘法转换为加法
乘法P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C)/P(F1F2...Fn)
加法P(F1|C)*P(F2|C)....P(Fn|C)P(C) -> log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C))
乘法: P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C)/P(F1F2...Fn)
加法: P(F1|C)*P(F2|C)....P(Fn|C)P(C) -> log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C))
:param vec2Classify: 待测数据[0,1,1,1,1...],即要分类的向量
:param p0Vec: 类别0,即正常文档的[log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表
:param p1Vec: 类别1,即侮辱性文档的[log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表
......@@ -340,7 +340,7 @@ def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
# 大家可能会发现,上面的计算公式,没有除以贝叶斯准则的公式的分母,也就是 P(w) (P(w) 指的是此文档在所有的文档中出现的概率)就进行概率大小的比较了,
# 因为 P(w) 针对的是包含侮辱和非侮辱的全部文档,所以 P(w) 是相同的。
# 使用 NumPy 数组来计算两个向量相乘的结果,这里的相乘是指对应元素相乘,即先将两个向量中的第一个元素相乘,然后将第2个元素相乘,以此类推。
# 我的理解是这里的 vec2Classify * p1Vec 的意思就是将每个词与其对应的概率相关联起来
# 我的理解是: 这里的 vec2Classify * p1Vec 的意思就是将每个词与其对应的概率相关联起来
p1 = sum(vec2Classify * p1Vec) + log(pClass1) # P(w|c1) * P(c1) ,即贝叶斯准则的分子
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) # P(w|c0) * P(c0) ,即贝叶斯准则的分子·
if p1 > p0:
......@@ -562,7 +562,7 @@ def spamTest():
> 收集数据: 从 RSS 源收集内容,这里需要对 RSS 源构建一个接口
也就是导入 RSS 源,我们使用 python 下载文本,在http://code.google.com/p/feedparser/ 下浏览相关文档,安装 feedparse,首先解压下载的包,并将当前目录切换到解压文件所在的文件夹,然后在 python 提示符下输入
也就是导入 RSS 源,我们使用 python 下载文本,在http://code.google.com/p/feedparser/ 下浏览相关文档,安装 feedparse,首先解压下载的包,并将当前目录切换到解压文件所在的文件夹,然后在 python 提示符下输入:
```python
>>> python setup.py install
......@@ -729,7 +729,7 @@ the error rate is: 0.55
接下来,我们要分析一下数据,显示地域相关的用词
可以先对向量pSF与pNY进行排序,然后按照顺序打印出来,将下面的代码添加到文件中
可以先对向量pSF与pNY进行排序,然后按照顺序打印出来,将下面的代码添加到文件中:
```python
#最具表征性的词汇显示函数
......@@ -752,7 +752,7 @@ def getTopWords(ny,sf):
函数 getTopWords() 使用两个 RSS 源作为输入,然后训练并测试朴素贝叶斯分类器,返回使用的概率值。然后创建两个列表用于元组的存储,与之前返回排名最高的 X 个单词不同,这里可以返回大于某个阈值的所有词,这些元组会按照它们的条件概率进行排序。
保存 bayes.py 文件,在python提示符下输入
保存 bayes.py 文件,在python提示符下输入:
```python
>>> reload(bayes)
......@@ -788,7 +788,7 @@ strings
***
* **作者[羊三](http://cwiki.apachecn.org/display/~xuxin) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* **作者: [羊三](http://cwiki.apachecn.org/display/~xuxin) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -64,19 +64,19 @@ Sigmoid 函数的输入记为 z ,由下面公式得到:
该公式将一直被迭代执行,直至达到某个停止条件为止,比如迭代次数达到某个指定值或者算法达到某个可以允许的误差范围。
介绍一下几个相关的概念
介绍一下几个相关的概念:
```
例如y = w0 + w1x1 + w2x2 + ... + wnxn
梯度参考上图的例子,二维图像,x方向代表第一个系数,也就是 w1,y方向代表第二个系数也就是 w2,这样的向量就是梯度。
α上面的梯度算法的迭代公式中的阿尔法,这个代表的是移动步长(step length)。移动步长会影响最终结果的拟合程度,最好的方法就是随着迭代次数更改移动步长。
例如: y = w0 + w1x1 + w2x2 + ... + wnxn
梯度: 参考上图的例子,二维图像,x方向代表第一个系数,也就是 w1,y方向代表第二个系数也就是 w2,这样的向量就是梯度。
α: 上面的梯度算法的迭代公式中的阿尔法,这个代表的是移动步长(step length)。移动步长会影响最终结果的拟合程度,最好的方法就是随着迭代次数更改移动步长。
步长通俗的理解,100米,如果我一步走10米,我需要走10步;如果一步走20米,我只需要走5步。这里的一步走多少米就是步长的意思。
▽f(w)代表沿着梯度变化的方向。
▽f(w): 代表沿着梯度变化的方向。
```
有人会好奇为什么有些书籍上说的是梯度下降法(Gradient Decent)?
: 有人会好奇为什么有些书籍上说的是梯度下降法(Gradient Decent)?
其实这个两个方法在此情况下本质上是相同的。关键在于代价函数(cost function)或者叫目标函数(objective function)。如果目标函数是损失函数,那就是最小化损失函数来求函数的最小值,就用梯度下降。 如果目标函数是似然函数(Likelihood function),就是要最大化似然函数来求函数的最大值,那就用梯度上升。在逻辑回归中, 损失函数和似然函数无非就是互为正负关系。
: 其实这个两个方法在此情况下本质上是相同的。关键在于代价函数(cost function)或者叫目标函数(objective function)。如果目标函数是损失函数,那就是最小化损失函数来求函数的最小值,就用梯度下降。 如果目标函数是似然函数(Likelihood function),就是要最大化似然函数来求函数的最大值,那就用梯度上升。在逻辑回归中, 损失函数和似然函数无非就是互为正负关系。
只需要在迭代公式中的加法变成减法。因此,对应的公式可以写成
......@@ -210,7 +210,7 @@ Logistic 回归梯度上升优化算法
```python
# 正常的处理方案
# 两个参数第一个参数==> dataMatIn 是一个2维NumPy数组,每列分别代表每个不同的特征,每行则代表每个训练样本。
# 两个参数: 第一个参数==> dataMatIn 是一个2维NumPy数组,每列分别代表每个不同的特征,每行则代表每个训练样本。
# 第二个参数==> classLabels 是类别标签,它是一个 1*100 的行向量。为了便于矩阵计算,需要将该行向量转换为列向量,做法是将原向量转置,再将它赋值给labelMat。
def gradAscent(dataMatIn, classLabels):
# 转化为矩阵[[1,1,2],[1,1,2]....]
......@@ -231,8 +231,8 @@ def gradAscent(dataMatIn, classLabels):
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
# m*3 的矩阵 * 3*1 的矩阵 = m*1的矩阵
# 那么乘上矩阵的意义,就代表通过公式得到的理论值
# 参考地址 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145
# 那么乘上矩阵的意义,就代表: 通过公式得到的理论值
# 参考地址: 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145
# print 'dataMatrix====', dataMatrix
# print 'weights====', weights
# n*3 * 3*1 = n*1
......@@ -284,7 +284,7 @@ def plotBestFit(dataArr, labelMat, weights):
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
w0*x0+w1*x1+w2*x2=f(x)
x0最开始就设置为1叻, x2就是我们画图的y值,而f(x)被我们磨合误差给算到w0,w1,w2身上去了
所以 w0+w1*x+w2*y=0 => y = (-w0-w1*x)/w2
所以: w0+w1*x+w2*y=0 => y = (-w0-w1*x)/w2
"""
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
......@@ -433,7 +433,7 @@ def stocGradAscent1(dataMatrix, classLabels, numIter=150):
假设有100个样本和20个特征,这些数据都是机器收集回来的。若机器上的某个传感器损坏导致一个特征无效时该怎么办?此时是否要扔掉整个数据?这种情况下,另外19个特征怎么办?
它们是否还可以用?答案是肯定的。因为有时候数据相当昂贵,扔掉和重新获取都是不可取的,所以必须采用一些方法来解决这个问题。
下面给出了一些可选的做法
下面给出了一些可选的做法:
* 使用可用特征的均值来填补缺失值;
* 使用特殊值来填补缺失值,如 -1;
* 忽略有缺失值的样本;
......@@ -465,7 +465,7 @@ def stocGradAscent1(dataMatrix, classLabels, numIter=150):
```python
# 正常的处理方案
# 两个参数第一个参数==> dataMatIn 是一个2维NumPy数组,每列分别代表每个不同的特征,每行则代表每个训练样本。
# 两个参数: 第一个参数==> dataMatIn 是一个2维NumPy数组,每列分别代表每个不同的特征,每行则代表每个训练样本。
# 第二个参数==> classLabels 是类别标签,它是一个 1*100 的行向量。为了便于矩阵计算,需要将该行向量转换为列向量,做法是将原向量转置,再将它赋值给labelMat。
def gradAscent(dataMatIn, classLabels):
# 转化为矩阵[[1,1,2],[1,1,2]....]
......@@ -486,8 +486,8 @@ def gradAscent(dataMatIn, classLabels):
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
# m*3 的矩阵 * 3*1 的单位矩阵 = m*1的矩阵
# 那么乘上单位矩阵的意义,就代表通过公式得到的理论值
# 参考地址 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145
# 那么乘上单位矩阵的意义,就代表: 通过公式得到的理论值
# 参考地址: 矩阵乘法的本质是什么? https://www.zhihu.com/question/21351965/answer/31050145
# print 'dataMatrix====', dataMatrix
# print 'weights====', weights
# n*3 * 3*1 = n*1
......@@ -634,11 +634,11 @@ Logistic回归和最大熵模型 都属于对数线性模型 (log linear model
## 多标签分类
逻辑回归也可以用作于多标签分类。 思路如下
逻辑回归也可以用作于多标签分类。 思路如下:
假设我们标签A中有a0,a1,a2....an个标签,对于每个标签 ai (ai 是标签A之一),我们训练一个逻辑回归分类器。
即,训练该标签的逻辑回归分类器的时候,将ai看作一类标签,非ai的所有标签看作一类标签。那么相当于整个数据集里面只有两类标签ai 和其他。
即,训练该标签的逻辑回归分类器的时候,将ai看作一类标签,非ai的所有标签看作一类标签。那么相当于整个数据集里面只有两类标签: ai 和其他。
剩下步骤就跟我们训练正常的逻辑回归分类器一样了。
......@@ -646,6 +646,6 @@ Logistic回归和最大熵模型 都属于对数线性模型 (log linear model
* * *
* **作者[羊三](http://cwiki.apachecn.org/display/~xuxin) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* **作者: [羊三](http://cwiki.apachecn.org/display/~xuxin) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -38,11 +38,11 @@ Classification Machine,是分类器,这个没什么好说的。也可以理
### “支持向量” 又是什么?
<b>通俗理解</b>
<b>通俗理解</b>:
support vector (支持向量)的意思就是 <b>数据集中的某些点</b>,位置比较特殊。比如 x+y-2=0 这条直线,直线上面区域 x+y-2>0 的全是 A 类,下面的 x+y-2<0 的全是 B 我们找这条直线的时候一般就看聚集在一起的两类数据他们各自的 <b>最边缘</b> 位置的点,也就是最靠近划分直线的那几个点,而其他点对这条直线的最终位置的确定起不了作用,所以我姑且叫这些点叫 “支持点”(意思就是有用的点),但是在数学上,没这种说法,数学里的点,又可以叫向量,比如 二维点 (x,y) 就是二维向量,三维度的就是三维向量 (x,y,z)。所以 “<b>支持点</b>” 改叫 “<b>支持向量</b>” ,听起来比较专业,而且又装逼,何乐而不为呢?是吧...
<b>不通俗的理解</b>
在 maximum margin (最大间隔)上的这些点就叫 “支持向量”,我想补充的是为啥这些点就叫 “支持向量” ,因为最后的 classification machine (分类器)的表达式里只含有这些 “支持向量” 的信息,而与其他数据点无关
<b>不通俗的理解</b>:
在 maximum margin (最大间隔)上的这些点就叫 “支持向量”,我想补充的是为啥这些点就叫 “支持向量” ,因为最后的 classification machine (分类器)的表达式里只含有这些 “支持向量” 的信息,而与其他数据点无关:
![支持向量机公式](http://data.apachecn.org/img/AiLearning/ml/6.SVM/supportVector公式.jpg "supportVector公式")
......@@ -79,13 +79,13 @@ support vector (支持向量)的意思就是 <b>数据集中的某些点</b>
## How does it work? (SVM 原理)
### 1、引用知乎上 [@简之](https://www.zhihu.com/people/wangjianzhi/answers) 大佬的回答
### 1、引用知乎上 [@简之](https://www.zhihu.com/people/wangjianzhi/answers) 大佬的回答:
首先我们讲个故事:
在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏。
魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”
魔鬼在桌子上似乎有规律放了两种颜色的球,说: “你用一根棍分开它们?要求: 尽量在放更多球之后,仍然适用。”
![story_1](http://data.apachecn.org/img/AiLearning/ml/6.SVM/story_1.png "story_1")
......@@ -119,12 +119,12 @@ SVM 就是试图把棍放在最佳位置,好让在棍的两边有尽可能大
再之后,无聊的大人们,把这些球叫做 <b>「data」</b>,把棍子叫做 <b>「classifier」</b>, 最大间隙 trick 叫做<b>「optimization」</b>, 拍桌子叫做<b>「kernelling」</b>, 那张纸叫做<b>「hyperplane」</b>
有梯子的童鞋,可以看一下这个地方,看视频来更直观的感受
有梯子的童鞋,可以看一下这个地方,看视频来更直观的感受:
https://www.youtube.com/watch?v=3liCbRZPrZA
### 2、引用知乎 [@开膛手水货](https://www.zhihu.com/people/kai-tang-shou-xin/answers) 大佬的回答,我认为是超级通俗的一个版本
### 2、引用知乎 [@开膛手水货](https://www.zhihu.com/people/kai-tang-shou-xin/answers) 大佬的回答,我认为是超级通俗的一个版本:
支持向量机是用来解决分类问题的。
......@@ -150,15 +150,15 @@ d<D,米粒
以此类推,还有三维的,四维的,N维的 属性的分类,这样构造的也许就不是直线,而是平面,超平面。
一个三维的函数分类 x+y+z-2=0,这就是个分类的平面了。
一个三维的函数分类 : x+y+z-2=0,这就是个分类的平面了。
有时候,分类的那条线不一定是直线,还有可能是曲线,我们通过某些函数来转换,就可以转化成刚才的哪种多维的分类问题,这个就是核函数的思想。
例如分类的函数是个圆形 x^2+y^2-4=0 。这个时候令 x^2=a ; y^2=b ,还不就变成了a+b-4=0 这种直线问题了。
例如: 分类的函数是个圆形 x^2+y^2-4=0 。这个时候令 x^2=a ; y^2=b ,还不就变成了a+b-4=0 这种直线问题了。
这就是支持向量机的思想。
### 3、引用 [@胡KF](https://www.zhihu.com/people/hu-kf/answers) 大佬的回答(这个需要一些数学知识)
### 3、引用 [@胡KF](https://www.zhihu.com/people/hu-kf/answers) 大佬的回答(这个需要一些数学知识):
如图的例子,(训练集)红色点是我们已知的分类1,(训练集)蓝色点是已知的分类2,我们想寻找一个分隔超平面(图中绿线)(因为示例是二维数据点,所以只是一条线,如果数据是三维的就是平面,如果是三维以上就是超平面)把这两类完全分开,这样的话再来一个样本点需要我们预测的话,我们就可以根据这个分界超平面预测出分类结果。
......@@ -172,7 +172,7 @@ d<D,米粒
不同于传统的最小二乘策略的思想,我们采用一种新的思路,这个分界面有什么样的特征呢?
第一,它 “夹” 在两类样本点之间;第二,它离两类样本点中所有 “离它最近的点” ,都离它尽可能的远。如图所示
第一,它 “夹” 在两类样本点之间;第二,它离两类样本点中所有 “离它最近的点” ,都离它尽可能的远。如图所示:
![hu_2](http://data.apachecn.org/img/AiLearning/ml/6.SVM/hu_2.jpg "hu_2")
......@@ -182,7 +182,7 @@ d<D,米粒
介绍完 SVM 的基本思想,我们来探讨一下如何用数学的方法进行 SVM 分类。
首先我们需要把刚刚说的最大间隔分类器的思想用数学公式表达出来。先定义几何间隔的概念,几何间隔就是在多维空间中一个多维点到一个超平面的距离,根据向量的知识可以算出来
首先我们需要把刚刚说的最大间隔分类器的思想用数学公式表达出来。先定义几何间隔的概念,几何间隔就是在多维空间中一个多维点到一个超平面的距离,根据向量的知识可以算出来:
![hu_3](http://data.apachecn.org/img/AiLearning/ml/6.SVM/hu_3.png "hu_3")
......@@ -196,9 +196,9 @@ d<D,米粒
总之,在计算的过程中,我们不需要了解支持向量以外的其他样本点,只需要利用相对于所有样本点来说为数不多的支持向量,就可以求出分类超平面,计算复杂度大为降低。
### 4、引用知乎 [@靠靠靠谱](https://www.zhihu.com/people/kao-kao-kao-pu/answers) 大佬的理解(这个需要的数学知识更加厉害一点)
### 4、引用知乎 [@靠靠靠谱](https://www.zhihu.com/people/kao-kao-kao-pu/answers) 大佬的理解(这个需要的数学知识更加厉害一点):
先看思维导图
先看思维导图:
* 左边是求解基本的SVM问题
* 右边是相关扩展
......@@ -225,7 +225,7 @@ Support Vector Machine, 一个普通的 SVM 就是一条直线罢了,用来完
![k_7](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_7.png "k_7")
(可以把 margin 看作是 boundary 的函数,并且想要找到使得是使得 margin 最大化的boundary,而 margin(*) 这个函数是输入一个 boundary ,计算(正确分类的)所有苹果和香蕉中,到 boundary 的最小距离。)
(可以把 margin 看作是 boundary 的函数,并且想要找到使得是使得 margin 最大化的boundary,而 margin(*) 这个函数是: 输入一个 boundary ,计算(正确分类的)所有苹果和香蕉中,到 boundary 的最小距离。)
又有最大又有最小看起来好矛盾。实际上『最大』是对这个整体使用不同 boundary 层面的最大,『最小』是在比较『点』的层面上的最小。外层在比较 boundary 找最大的 margin ,内层在比较点点找最小的距离。
......@@ -243,11 +243,11 @@ Support Vector Machine, 一个普通的 SVM 就是一条直线罢了,用来完
![k_11](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_11.png "k_11")
稍微借用刚刚数学表达里面的内容看个有趣的东西
稍微借用刚刚数学表达里面的内容看个有趣的东西:
还记得我们怎么预测一个新的水果是苹果还是香蕉吗?我们代入到分界的直线里,然后通过符号来判断。
刚刚w已经被表达出来了也就是说这个直线现在变成了 ![k_12](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_12.png "k_12")
刚刚w已经被表达出来了也就是说这个直线现在变成了: ![k_12](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_12.png "k_12")
看似仿佛用到了所有的训练水果,但是其中 ![k_13](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_13.png "k_13") 的水果都没有起到作用,剩下的就是小部分靠边边的 Support vectors 呀。
......@@ -277,13 +277,13 @@ Kernel trick.
![k_5](http://data.apachecn.org/img/AiLearning/ml/6.SVM/k_5.jpg "k_5")
可以每个类别做一次 SVM是苹果还是不是苹果?是香蕉还是不是香蕉?是梨子还是不是梨子?从中选出可能性最大的。这是 one-versus-the-rest approach。
可以每个类别做一次 SVM: 是苹果还是不是苹果?是香蕉还是不是香蕉?是梨子还是不是梨子?从中选出可能性最大的。这是 one-versus-the-rest approach。
也可以两两做一次 SVM是苹果还是香蕉?是香蕉还是梨子?是梨子还是苹果?最后三个分类器投票决定。这是 one-versus-one approace。
也可以两两做一次 SVM: 是苹果还是香蕉?是香蕉还是梨子?是梨子还是苹果?最后三个分类器投票决定。这是 one-versus-one approace。
但这其实都多多少少有问题,比如苹果特别多,香蕉特别少,我就无脑判断为苹果也不会错太多;多个分类器要放到一个台面上,万一他们的 scale 没有在一个台面上也未可知。
课后题
课后题:
1、vector 不愿意 support 怎么办?
2、苹果好吃还是香蕉好吃?
......
此差异已折叠。
# 第8章 预测数值型数据回归
# 第8章 预测数值型数据: 回归
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
![预测数值型数据回归首页](http://data.apachecn.org/img/AiLearning/ml/8.Regression/预测数值型数据回归首页.png "回归Regression首页")
......@@ -19,7 +19,7 @@ HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio
说到回归,一般都是指 `线性回归(linear regression)`。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。
补充
补充:
线性回归假设特征和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。
## 回归 原理
......@@ -75,9 +75,9 @@ HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio
#### 1.4、线性回归 算法特点
```
优点结果易于理解,计算上不复杂。
缺点对非线性的数据拟合不好。
适用于数据类型数值型和标称型数据。
优点: 结果易于理解,计算上不复杂。
缺点: 对非线性的数据拟合不好。
适用于数据类型: 数值型和标称型数据。
```
#### 1.5、线性回归 项目案例
......@@ -106,9 +106,9 @@ x0 x1 y
def loadDataSet(fileName):
""" 加载数据
解析以tab键分隔的文件中的浮点数
Returns
dataMat feature 对应的数据集
labelMat feature 对应的分类标签,即类别标签
Returns:
dataMat : feature 对应的数据集
labelMat : feature 对应的分类标签,即类别标签
"""
# 获取样本特征的总数,不算最后的目标变量
......@@ -134,13 +134,13 @@ def loadDataSet(fileName):
def standRegres(xArr,yArr):
'''
Description
Description:
线性回归
Args:
xArr 输入的样本数据,包含每个样本数据的 feature
yArr 对应于输入数据的类别标签,也就是每个样本对应的目标变量
xArr : 输入的样本数据,包含每个样本数据的 feature
yArr : 对应于输入数据的类别标签,也就是每个样本对应的目标变量
Returns:
ws回归系数
ws: 回归系数
'''
# mat()函数将xArr,yArr转换为矩阵 mat().T 代表的是对矩阵进行转置操作
......@@ -239,20 +239,20 @@ LWLR 使用 “核”(与支持向量机中的核类似)来对附近的点
# 局部加权线性回归
def lwlr(testPoint,xArr,yArr,k=1.0):
'''
Description
Description:
局部加权线性回归,在待预测点附近的每个点赋予一定的权重,在子集上基于最小均方差来进行普通的回归。
Args
testPoint样本点
xArr样本的特征数据,即 feature
yArr每个样本对应的类别标签,即目标变量
Args:
testPoint: 样本点
xArr: 样本的特征数据,即 feature
yArr: 每个样本对应的类别标签,即目标变量
k:关于赋予权重矩阵的核的一个参数,与权重的衰减速率有关
Returns:
testPoint * ws数据点与具有权重的系数相乘得到的预测点
testPoint * ws: 数据点与具有权重的系数相乘得到的预测点
Notes:
这其中会用到计算权重的公式,w = e^((x^((i))-x) / -2k^2)
理解x为某个预测点,x^((i))为样本点,样本点距离预测点越近,贡献的误差越大(权值越大),越远则贡献的误差越小(权值越小)。
理解: x为某个预测点,x^((i))为样本点,样本点距离预测点越近,贡献的误差越大(权值越大),越远则贡献的误差越小(权值越小)。
关于预测点的选取,在我的代码中取的是样本点。其中k是带宽参数,控制w(钟形函数)的宽窄程度,类似于高斯函数的标准差。
算法思路假设预测点取样本点中的第i个样本点(共m个样本点),遍历1到m个样本点(含第i个),算出每一个样本点与预测点的距离,
算法思路: 假设预测点取样本点中的第i个样本点(共m个样本点),遍历1到m个样本点(含第i个),算出每一个样本点与预测点的距离,
也就可以计算出每个样本贡献误差的权值,可以看出w是一个有m个元素的向量(写成对角阵形式)。
'''
# mat() 函数是将array转换为矩阵的函数, mat().T 是转换为矩阵之后,再进行转置操作
......@@ -279,15 +279,15 @@ def lwlr(testPoint,xArr,yArr,k=1.0):
def lwlrTest(testArr,xArr,yArr,k=1.0):
'''
Description
Description:
测试局部加权线性回归,对数据集中每个点调用 lwlr() 函数
Args
testArr测试所用的所有样本点
xArr样本的特征数据,即 feature
yArr每个样本对应的类别标签,即目标变量
k控制核函数的衰减速率
Returns
yHat预测点的估计值
Args:
testArr: 测试所用的所有样本点
xArr: 样本的特征数据,即 feature
yArr: 每个样本对应的类别标签,即目标变量
k: 控制核函数的衰减速率
Returns:
yHat: 预测点的估计值
'''
# 得到样本点的总数
m = shape(testArr)[0]
......@@ -303,13 +303,13 @@ def lwlrTestPlot(xArr,yArr,k=1.0):
'''
Description:
首先将 X 排序,其余的都与lwlrTest相同,这样更容易绘图
Args
xArr样本的特征数据,即 feature
yArr每个样本对应的类别标签,即目标变量,实际值
k控制核函数的衰减速率的有关参数,这里设定的是常量值 1
Return
yHat样本点的估计值
xCopyxArr的复制
Args:
xArr: 样本的特征数据,即 feature
yArr: 每个样本对应的类别标签,即目标变量,实际值
k: 控制核函数的衰减速率的有关参数,这里设定的是常量值 1
Return:
yHat: 样本点的估计值
xCopy: xArr的复制
'''
# 生成一个与目标变量数目相同的 0 向量
yHat = zeros(shape(yArr))
......@@ -397,9 +397,9 @@ def rssError(yArr,yHatArr):
'''
Desc:
       返回真实值与预测值误差大小
Args
       yArr样本的真实值
       yHatArr样本的预测值
Args:
       yArr: 样本的真实值
       yHatArr: 样本的预测值
Returns:
       一个数字,代表误差
   '''
......@@ -461,7 +461,7 @@ def abaloneTest():
#### 4.1、岭回归
简单来说,岭回归就是在矩阵 ![矩阵_1](http://data.apachecn.org/img/AiLearning/ml/8.Regression/LinearR_9.png) 上加一个 λI 从而使得矩阵非奇异,进而能对 ![矩阵_2](http://data.apachecn.org/img/AiLearning/ml/8.Regression/LinearR_10.png ) 求逆。其中矩阵I是一个 n * n (等于列数) 的单位矩阵,
对角线上元素全为1,其他元素全为0。而λ是一个用户定义的数值,后面会做介绍。在这种情况下,回归系数的计算公式将变成
对角线上元素全为1,其他元素全为0。而λ是一个用户定义的数值,后面会做介绍。在这种情况下,回归系数的计算公式将变成:
![岭回归的回归系数计算](http://data.apachecn.org/img/AiLearning/ml/8.Regression/LinearR_11.png )
......@@ -480,16 +480,16 @@ def abaloneTest():
```python
def ridgeRegres(xMat,yMat,lam=0.2):
'''
Desc
Desc:
这个函数实现了给定 lambda 下的岭回归求解。
如果数据的特征比样本点还多,就不能再使用上面介绍的的线性回归和局部线性回归了,因为计算 (xTx)^(-1)会出现错误。
如果特征比样本点还多(n > m),也就是说,输入数据的矩阵x不是满秩矩阵。非满秩矩阵在求逆时会出现问题。
为了解决这个问题,我们下边讲一下岭回归,这是我们要讲的第一种缩减方法。
Args
xMat样本的特征数据,即 feature
yMat每个样本对应的类别标签,即目标变量,实际值
lam引入的一个λ值,使得矩阵非奇异
Returns
为了解决这个问题,我们下边讲一下: 岭回归,这是我们要讲的第一种缩减方法。
Args:
xMat: 样本的特征数据,即 feature
yMat: 每个样本对应的类别标签,即目标变量,实际值
lam: 引入的一个λ值,使得矩阵非奇异
Returns:
经过岭回归公式计算得到的回归系数
'''
......@@ -506,13 +506,13 @@ def ridgeRegres(xMat,yMat,lam=0.2):
def ridgeTest(xArr,yArr):
'''
Desc
Desc:
函数 ridgeTest() 用于在一组 λ 上测试结果
Args
xArr样本数据的特征,即 feature
yArr样本数据的类别标签,即真实数据
Returns
wMat将所有的回归系数输出到一个矩阵并返回
Args:
xArr: 样本数据的特征,即 feature
yArr: 样本数据的类别标签,即真实数据
Returns:
wMat: 将所有的回归系数输出到一个矩阵并返回
'''
xMat = mat(xArr)
......@@ -674,12 +674,12 @@ Dangler 喜欢为乐高套装估价,我们用回归技术来帮助他建立一
##### 开发流程
```
(1) 收集数据用 Google Shopping 的API收集数据。
(2) 准备数据从返回的JSON数据中抽取价格。
(3) 分析数据可视化并观察数据。
(4) 训练算法构建不同的模型,采用逐步线性回归和直接的线性回归模型。
(5) 测试算法使用交叉验证来测试不同的模型,分析哪个效果最好。
(6) 使用算法这次练习的目标就是生成数据模型。
(1) 收集数据: 用 Google Shopping 的API收集数据。
(2) 准备数据: 从返回的JSON数据中抽取价格。
(3) 分析数据: 可视化并观察数据。
(4) 训练算法: 构建不同的模型,采用逐步线性回归和直接的线性回归模型。
(5) 测试算法: 使用交叉验证来测试不同的模型,分析哪个效果最好。
(6) 使用算法: 这次练习的目标就是生成数据模型。
```
> 收集数据: 使用 Google 购物的 API
......@@ -753,7 +753,7 @@ def setDataCollect(retX, retY):
scrapePage(retX, retY, 'data/8.Regression/setHtml/lego10196.html', 2009, 3263, 249.99)
```
> 测试算法使用交叉验证来测试不同的模型,分析哪个效果最好
> 测试算法: 使用交叉验证来测试不同的模型,分析哪个效果最好
```python
# 交叉验证测试岭回归
......@@ -823,7 +823,7 @@ def regression5():
crossValidation(lgX, lgY, 10)
```
> 使用算法这次练习的目标就是生成数据模型
> 使用算法: 这次练习的目标就是生成数据模型
## 7、选读内容
......@@ -843,6 +843,6 @@ def regression5():
* * *
* **作者[小瑶](http://cwiki.apachecn.org/display/~chenyao) [片刻](https://github.com/jiangzhonglian)**
* **作者: [小瑶](http://cwiki.apachecn.org/display/~chenyao) [片刻](https://github.com/jiangzhonglian)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -74,20 +74,20 @@ CART 和 C4.5 之间主要差异在于分类结果上,CART 可以回归分析
### 1.4、树回归 开发流程
```
(1) 收集数据采用任意方法收集数据。
(2) 准备数据需要数值型数据,标称型数据应该映射成二值型数据。
(3) 分析数据绘出数据的二维可视化显示结果,以字典方式生成树。
(4) 训练算法大部分时间都花费在叶节点树模型的构建上。
(5) 测试算法使用测试数据上的R^2值来分析模型的效果。
(6) 使用算法使用训练处的树做预测,预测结果还可以用来做很多事情。
(1) 收集数据: 采用任意方法收集数据。
(2) 准备数据: 需要数值型数据,标称型数据应该映射成二值型数据。
(3) 分析数据: 绘出数据的二维可视化显示结果,以字典方式生成树。
(4) 训练算法: 大部分时间都花费在叶节点树模型的构建上。
(5) 测试算法: 使用测试数据上的R^2值来分析模型的效果。
(6) 使用算法: 使用训练处的树做预测,预测结果还可以用来做很多事情。
```
### 1.5、树回归 算法特点
```
优点可以对复杂和非线性的数据建模。
缺点结果不易理解。
适用数据类型数值型和标称型数据。
优点: 可以对复杂和非线性的数据建模。
缺点: 结果不易理解。
适用数据类型: 数值型和标称型数据。
```
### 1.6、回归树 项目案例
......@@ -99,15 +99,15 @@ CART 和 C4.5 之间主要差异在于分类结果上,CART 可以回归分析
#### 1.6.2、开发流程
```
收集数据采用任意方法收集数据
准备数据需要数值型数据,标称型数据应该映射成二值型数据
分析数据绘出数据的二维可视化显示结果,以字典方式生成树
训练算法大部分时间都花费在叶节点树模型的构建上
测试算法使用测试数据上的R^2值来分析模型的效果
使用算法使用训练出的树做预测,预测结果还可以用来做很多事情
收集数据: 采用任意方法收集数据
准备数据: 需要数值型数据,标称型数据应该映射成二值型数据
分析数据: 绘出数据的二维可视化显示结果,以字典方式生成树
训练算法: 大部分时间都花费在叶节点树模型的构建上
测试算法: 使用测试数据上的R^2值来分析模型的效果
使用算法: 使用训练出的树做预测,预测结果还可以用来做很多事情
```
> 收集数据采用任意方法收集数据
> 收集数据: 采用任意方法收集数据
data1.txt 文件中存储的数据格式如下:
......@@ -119,9 +119,9 @@ data1.txt 文件中存储的数据格式如下:
0.343554 -0.371700
0.098016 -0.332760
```
> 准备数据需要数值型数据,标称型数据应该映射成二值型数据
> 准备数据: 需要数值型数据,标称型数据应该映射成二值型数据
> 分析数据绘出数据的二维可视化显示结果,以字典方式生成树
> 分析数据: 绘出数据的二维可视化显示结果,以字典方式生成树
基于 CART 算法构建回归树的简单数据集
![基于 CART 算法构建回归树的简单数据集](http://data.apachecn.org/img/AiLearning/ml/9.TreeRegression/RegTree_1.png)
......@@ -135,7 +135,7 @@ data1.txt 文件中存储的数据格式如下:
```python
def binSplitDataSet(dataSet, feature, value):
"""binSplitDataSet(将数据集,按照feature列的value进行 二元切分)
Description在给定特征和特征值的情况下,该函数通过数组过滤方式将上述数据集合切分得到两个子集并返回。
Description: 在给定特征和特征值的情况下,该函数通过数组过滤方式将上述数据集合切分得到两个子集并返回。
Args:
dataMat 数据集
feature 待切分的特征列
......@@ -224,7 +224,7 @@ def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)):
# 假设 dataSet 是 NumPy Mat 类型的,那么我们可以进行 array 过滤
def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)):
"""createTree(获取回归树)
Description:递归函数:如果构建的是回归树,该模型是一个常数,如果是模型树,其模型师一个线性方程。
Description: 递归函数: 如果构建的是回归树,该模型是一个常数,如果是模型树,其模型师一个线性方程。
Args:
dataSet 加载的原始数据集
leafType 建立叶子点的函数
......@@ -233,7 +233,7 @@ def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)):
Returns:
retTree 决策树最后的结果
"""
# 选择最好的切分方式 feature索引值,最优切分值
# 选择最好的切分方式: feature索引值,最优切分值
# choose the best split
feat, val = chooseBestSplit(dataSet, leafType, errType, ops)
# if the splitting hit a stop condition return val
......@@ -252,9 +252,9 @@ def createTree(dataSet, leafType=regLeaf, errType=regErr, ops=(1, 4)):
```
[完整代码地址](https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/9.RegTrees/regTrees.py): <https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/9.RegTrees/regTrees.py>
> 测试算法使用测试数据上的R^2值来分析模型的效果
> 测试算法: 使用测试数据上的R^2值来分析模型的效果
> 使用算法使用训练出的树做预测,预测结果还可以用来做很多事情
> 使用算法: 使用训练出的树做预测,预测结果还可以用来做很多事情
## 2、树剪枝
......@@ -349,7 +349,7 @@ def prune(tree, testData):
# 1. 如果正确
# * 那么计算一下总方差 和 该结果集的本身不分枝的总方差比较
# * 如果 合并的总方差 < 不合并的总方差,那么就进行合并
# 注意返回的结果 如果可以合并,原来的dict就变为了 数值
# 注意返回的结果: 如果可以合并,原来的dict就变为了 数值
if not isTree(tree['left']) and not isTree(tree['right']):
lSet, rSet = binSplitDataSet(testData, tree['spInd'], tree['spVal'])
# power(x, y)表示x的y次方
......@@ -387,7 +387,7 @@ def prune(tree, testData):
模型树的叶节点生成函数
```python
# 得到模型的ws系数f(x) = x0 + x1*featrue1+ x3*featrue2 ...
# 得到模型的ws系数: f(x) = x0 + x1*featrue1+ x3*featrue2 ...
# create linear model and return coeficients
def modelLeaf(dataSet):
"""
......@@ -467,17 +467,17 @@ def linearSolve(dataSet):
#### 4.1.2、开发流程
```
收集数据采用任意方法收集数据
准备数据需要数值型数据,标称型数据应该映射成二值型数据
分析数据绘出数据的二维可视化显示结果,以字典方式生成树
训练算法模型树的构建
测试算法使用测试数据上的R^2值来分析模型的效果
使用算法使用训练出的树做预测,预测结果还可以用来做很多事情
收集数据: 采用任意方法收集数据
准备数据: 需要数值型数据,标称型数据应该映射成二值型数据
分析数据: 绘出数据的二维可视化显示结果,以字典方式生成树
训练算法: 模型树的构建
测试算法: 使用测试数据上的R^2值来分析模型的效果
使用算法: 使用训练出的树做预测,预测结果还可以用来做很多事情
```
> 收集数据: 采用任意方法收集数据
> 准备数据需要数值型数据,标称型数据应该映射成二值型数据
> 准备数据: 需要数值型数据,标称型数据应该映射成二值型数据
数据存储格式:
```
......@@ -488,11 +488,11 @@ def linearSolve(dataSet):
15.000000 139.737693
```
> 分析数据绘出数据的二维可视化显示结果,以字典方式生成树
> 分析数据: 绘出数据的二维可视化显示结果,以字典方式生成树
![骑自行车速度和智商之间的关系](http://data.apachecn.org/img/AiLearning/ml/9.TreeRegression/RegTree_5.png)
> 训练算法模型树的构建
> 训练算法: 模型树的构建
用树回归进行预测的代码
```python
......@@ -583,13 +583,13 @@ def createForeCast(tree, testData, modelEval=regTreeEval):
```
[完整代码地址](https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/9.RegTrees/regTrees.py): <https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/9.RegTrees/regTrees.py>
> 测试算法使用测试数据上的R^2值来分析模型的效果
> 测试算法: 使用测试数据上的R^2值来分析模型的效果
R^2 判定系数就是拟合优度判定系数,它体现了回归模型中自变量的变异在因变量的变异中所占的比例。如 R^2=0.99999 表示在因变量 y 的变异中有 99.999% 是由于变量 x 引起。当 R^2=1 时表示,所有观测点都落在拟合的直线或曲线上;当 R^2=0 时,表示自变量与因变量不存在直线或曲线关系。
所以我们看出, R^2 的值越接近 1.0 越好。
> 使用算法使用训练出的树做预测,预测结果还可以用来做很多事情
> 使用算法: 使用训练出的树做预测,预测结果还可以用来做很多事情
## 5、附加 Python 中 GUI 的使用
......@@ -628,6 +628,6 @@ Tkinter 是 Python 的一个 GUI 工具包。虽然并不是唯一的包,但
* * *
* **作者[片刻](https://github.com/jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* **作者: [片刻](https://github.com/jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)**
* [GitHub地址](https://github.com/apachecn/AiLearning): <https://github.com/apachecn/AiLearning>
* **版权声明欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
* **版权声明: 欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apachecn.org/)**
......@@ -11,7 +11,7 @@
* 第一个不靠吹嘘学校or公司,完全靠实力开源的一个项目
* 知乎上网友评论是腾讯,而最近GitHub上看到的是百度邮箱
* “结巴”中文分词做最好的 Python 中文分词组件(这个的确没吹牛!)
* “结巴”中文分词: 做最好的 Python 中文分词组件(这个的确没吹牛!)
* GitHub上面 README.md 为中文版本(别看这个小事,很多中国公司开源项目都是英文)
## 部署使用
......@@ -86,7 +86,7 @@ seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所
print(", ".join(seg_list))
# 输出结果
#【搜索引擎模式】 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
#【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
```
> 4.paddle 模式
......@@ -177,9 +177,9 @@ if __name__ == "__main__":
* 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词
* 虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
* 用法 `jieba.load_userdict(file_name)` # file_name 为文件类对象或自定义词典的路径
* 用法: `jieba.load_userdict(file_name)` # file_name 为文件类对象或自定义词典的路径
* 词典格式和 dict.txt 一样,一个词占一行
* 每一行分三部分词语、词频(可省略)、词性(可省略),`用空格隔开``顺序不可颠倒`
* 每一行分三部分: 词语、词频(可省略)、词性(可省略),`用空格隔开``顺序不可颠倒`
* file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码
* 词频省略时使用自动计算的能保证分出该词的词频
......@@ -201,8 +201,8 @@ jieba.load_userdict(file_name)
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
# 加载自定义词库前 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
# 加载自定义词库后 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
# 加载自定义词库前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
# 加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
```
## 调整词典的词
......@@ -210,9 +210,9 @@ print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
* 使用 `add_word(word, freq=None, tag=None)``del_word(word)` 可在程序中动态修改词典。
* 使用 `suggest_freq(segment, tune=True)` 可调节单个词语的词频,使其能(或不能)被分出来。
**注意自动计算的词频在使用 HMM 新词发现功能时可能无效**
**注意: 自动计算的词频在使用 HMM 新词发现功能时可能无效**
代码示例
代码示例:
```python
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
......@@ -355,11 +355,11 @@ for word, flag in words:
## 并行分词
原理将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升
原理: 将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升
基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
用法
用法:
* `jieba.enable_parallel(4)` # 开启并行分词模式,参数为并行进程数
* `jieba.disable_parallel()` # 关闭并行分词模式
......@@ -385,11 +385,11 @@ log_f.write(words.encode('utf-8'))
print('speed %s bytes/second' % (len(content)/tm_cost))
```
实验结果在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
实验结果: 在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
注意并行分词仅支持默认分词器 `jieba.dt``jieba.posseg.dt`
注意: 并行分词仅支持默认分词器 `jieba.dt``jieba.posseg.dt`
## Tokenize返回词语在原文的起止位置
## Tokenize: 返回词语在原文的起止位置
注意,输入参数只接受 unicode
......
......@@ -23,9 +23,9 @@
> 观点挖掘
* 观点聚类:主要目标是对大量的评论数据进行聚类,将相同的观点抽取出来,并形成一个情感搭配词典(算法是:搭配抽取、词法分析、聚类归一,从而获得一个情感搭配。我们就可以进行观点抽取)
* 观点抽取就是对输入的文本进行计算,将其中的情感标签抽取出来,这里的标签,都是来自于情感搭配词典的,也就是观点聚类获得的词典。
* 观点抽取一种简单的做法是直接通过标签匹配的方式得到,比如服务不错这个情感搭配,恰好在文本中出现,我们就可以把它抽取出来。
* 观点聚类: 主要目标是对大量的评论数据进行聚类,将相同的观点抽取出来,并形成一个情感搭配词典(算法是: 搭配抽取、词法分析、聚类归一,从而获得一个情感搭配。我们就可以进行观点抽取)
* 观点抽取: 就是对输入的文本进行计算,将其中的情感标签抽取出来,这里的标签,都是来自于情感搭配词典的,也就是观点聚类获得的词典。
* 观点抽取一种简单的做法是直接通过标签匹配的方式得到,比如: 服务不错这个情感搭配,恰好在文本中出现,我们就可以把它抽取出来。
* 但是这种简单的抽取方法,其实上只能从字面上抽取情感搭配,而无法解决字面不一致的,但是意思一样的情感搭配抽取,因此我们还引入了语义相似度的方法。这种方法主要是通过神经网络进行计算的。它能解决这种字面不一致,语义一样的抽取问题。
![](http://data.apachecn.org/img/AiLearning/nlp/3.3.篇章分析-情感分类/观点挖掘.jpg)
......@@ -36,10 +36,10 @@
![](http://data.apachecn.org/img/AiLearning/nlp/3.3.篇章分析-情感分类/观点摘要.jpg)
## 百度应用评论观点
## 百度应用: 评论观点
![](http://data.apachecn.org/img/AiLearning/nlp/3.3.篇章分析-情感分类/百度应用评论观点.jpg)
## 百度应用推荐理由
## 百度应用: 推荐理由
![](http://data.apachecn.org/img/AiLearning/nlp/3.3.篇章分析-情感分类/百度应用推荐理由.jpg)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册