master
aolingwen 6 years ago
parent c59f3353d6
commit 1ced6fd337

@ -4,7 +4,7 @@
# 1.2.1 统计学
统计学研究数据的收集、分析、解释和表示。数据挖掘鱼统计学具有天然联系。统计模型是一组数学函数,它们用随机变量及其概率分布刻画目标类对象的行为。统计模型广泛用于对数据建模。例如,在像数据特征化和分类这样的数据挖掘任务中,可以建立目标类的统计模型。换言之,这种统计模型可以是数据挖掘任务的结果。反过来,数据挖掘任务也可以建立在统计模型之上。例如,我们可以使用统计模型对噪声和缺失的数据值建模。于是,在大数据集中挖掘模式时,数据挖掘过程可以使用该模型来帮助识别数据中的噪声和缺失值。
统计学研究数据的收集、分析、解释和表示。其实,数据挖掘与统计学具有天然联系。统计模型是一组数学函数,它们用随机变量及其概率分布刻画目标类对象的行为。统计模型广泛用于对数据建模。例如,在像数据特征化和分类这样的数据挖掘任务中,可以建立目标类的统计模型。换言之,这种统计模型可以是数据挖掘任务的结果。反过来,数据挖掘任务也可以建立在统计模型之上。例如,我们可以使用统计模型对噪声和缺失的数据值建模。于是,在大数据集中挖掘模式时,数据挖掘过程可以使用该模型来帮助识别数据中的噪声和缺失值。
统计学研究开发一些使用数据和统计模型进行预测和预报的工具。统计学方法可以用来汇总或描述数据集。对于从数据中挖掘各种模式,以及理解产生和影响这些模式的潜在机制,统计学是有用的。推理统计学用某种方式对数据建模,解释观测中的随机性和确定性,并用来提取关于所考察的过程或总体的结论。
@ -14,7 +14,7 @@
# 1.2.2 机器学习
机器学习是一个快速成长地学科。这里我们介绍一些于数据挖掘高度相关地,经典地机器学习问题。
某些方面上来说,数据挖掘与机器学习在之间存在着许多相同之处。在这里我们介绍一些与数据挖掘高度相关的,经典的机器学习问题。
- 监督学习:即在机器学习模型的训练过程中所使用的训练集是有标签,即标准答案的。也可以理解成告诉哪些数据的答案是 A哪些数据的答案是 B然后让机器学习程序来自己学习其中的规律。
@ -28,7 +28,7 @@
信息检索是搜索文档或文档中信息的科学。文档可以是文本或多媒体,并且可能驻留在 Web 上。传统的信息检索与数据库系统之间的差别有两点:信息检索假定所搜索的数据是无结构的;信息检索查询主要用关键词,没有复杂的结构。
信息检索的典型方法用概率模型。例如,文本文档可以看作词的包,即出现在文档中的词的多重集合。文档的语言模型是生成文档中词的包的概率密度函数。两个文档之间的相似度可以用对应的语言模型之间的相似性度量。
信息检索的典型方法是使用概率模型。例如,文本文档可以看作词的包,即出现在文档中的词的多重集合。文档的语言模型是生成文档中词的包的概率密度函数。两个文档之间的相似度可以用对应的语言模型之间的相似性度量。
此外,一个文本文档集的主题可以用词汇表上的概率分布建模,即主题模型。一个文本文档可以涉及多个主题,可以看作多个主题混合的模型。通过集成信息检索模型和数据挖掘技术,我们可以找出文档集中的主要问题,对集合中的每个文档,找出所涉及的主要主题。

@ -5,9 +5,7 @@
# 1.3.1 电子政务
建立电子化政府,推动电子政务的发展,是电子信息技术应用到政府管理的必然趋势。实践经验表明,政府部门的决策越来越依赖于对数据的科学分析。发展电子政务,建立决策支持系统,利用电子政务综合数据库中存储的大量数据,通过建立正确的决策体系和决策支持模型,可以为各级政府的决策提供科学的依据,从而提高各项政策制定的科学性和合理性,以达到提高政府办公效率、促进经济发展的目的。为此,在政府决策支持方面,需要不断
吸纳新的信息处理技术,而数据挖掘正是实现政府决策支持的核心技术。以数据挖掘为依托的政府决策支持系统,将发挥重要的作用。
建立电子化政府,推动电子政务的发展,是电子信息技术应用到政府管理的必然趋势。实践经验表明,政府部门的决策越来越依赖于对数据的科学分析。发展电子政务,建立决策支持系统,利用电子政务综合数据库中存储的大量数据,通过建立正确的决策体系和决策支持模型,可以为各级政府的决策提供科学的依据,从而提高各项政策制定的科学性和合理性,以达到提高政府办公效率、促进经济发展的目的。为此,在政府决策支持方面,需要不断吸纳新的信息处理技术,而数据挖掘正是实现政府决策支持的核心技术。以数据挖掘为依托的政府决策支持系统,将发挥重要的作用。
电子政务位于世界各国积极倡导的“信息高速公路”五个领域(电子政务、电子商务、远程教育、远程医疗、电子娱乐)之首,说明政府信息化是社会信息化的基础。电子政务包括政府的信息服务、电子贸易、电子化政府、政府部门重构、群众参与政府五个方面的内容。将网络数据挖掘技术引入电子政务中,可以大大提高政府信息化水平,促进整个社会的信息化。具体体现在以下几个方面:
@ -21,7 +19,7 @@
# 1.3.2 零售业
通过条形码、编码系统、销售管理系统、客户资料管理及其它业务数据中可以收集到关于商品销售、客户信息、货存单位及店铺信息等的信息资料。数据从各种应用系统中采集经条件分类放到数据仓库里允许高级管理人员、分析人员、采购人员、市场人员和广告客户访问利用DM工具对这些数据进行分析为他们提供高效的科学决策工具。如对商品进行购物篮分析分析那些商品顾客最有希望一起购买。如被业界和商界传诵的经典----Wal-Mart的 “啤酒和尿布”就是数据挖掘透过数据找出人与物间规律的典型。在零售业应用领域利用DW、DM会在很多方面有卓越表现
通过条形码、编码系统、销售管理系统、客户资料管理及其它业务数据中可以收集到关于商品销售、客户信息、货存单位及店铺信息等的信息资料。数据从各种应用系统中采集经条件分类放到数据仓库里允许高级管理人员、分析人员、采购人员、市场人员和广告客户访问利用DM工具对这些数据进行分析为他们提供高效的科学决策工具。如对商品进行购物篮分析分析哪些商品是顾客最有希望一起购买的。如被业界和商界传诵的经典----Wal-Mart的 “啤酒和尿布”就是数据挖掘透过数据找出人与物间规律的典型。在零售业应用领域利用DW、DM会在很多方面有卓越表现
- 了解销售全局:通过分类信息——按商品种类、销售数量、商店地点、价格和日期等了解每天的运营和财政情况,对销售的每一点增长、库存的变化以及通过促销而提高的销售额都可了如指掌。零售商店在销售商品时,随时检查商品结构是否合理十分重要,如每类商品的经营比例是否大体相当。调整商品结构时需考虑季节变化导致的需求变化、同行竞争对手的商品结构调整等因素。
@ -29,7 +27,7 @@
- 降低库存成本通过数据挖掘系统将销售数据和库存数据集中起来通过数据分析以决定对各个商品各色货物进行增减确保正确的库存。数据仓库系统还可以将库存信息和商品销售预测信息通过电子数据交换EDI直接送到供应商那里这样省去商业中介而且由供应商负责定期补充库存零售商可减少自身负担。
- 市场和趋势分析:利用数据挖掘工具和统计模型对数据仓库的数据仔细研究,以分析顾客的购买习惯、广告成功率和其它战略性信息。利用数据仓库通过检索数据库中近年来的销售数据,作分析和数据挖掘,可预测出季节性、月销售量,对商品品种和库存的趋势进行分析。还可确定降价商品,并对数量和运作作出决策
- 市场和趋势分析:利用数据挖掘工具和统计模型对数据仓库的数据仔细研究,以分析顾客的购买习惯、广告成功率和其它战略性信息。利用数据仓库通过检索数据库中近年来的销售数据,作分析和数据挖掘,可预测出季节性、月销售量。
有效的商品促销:可以通过对一种厂家商品在各连锁店的市场共享分析,客户统计以及历史状况的分析,来确定销售和广告业务的有效性。通过对顾客购买偏好的分析,确定商品促销的目标客户,以此来设计各种商品促销的方案,并通过商品购买关联分析的结果,采用交叉销售和向上销售的方法,挖掘客户的购买力,实现准确的商品促销。

@ -1,4 +1,4 @@
# 10.5:动手实现基于矩阵分解的协同过滤
# 10.4 动手实现基于矩阵分解的协同过滤
```python
@ -35,11 +35,14 @@ def recommend(userID,lr,alpha,d,n_iter,data):
if record[userID-1][i] == 1 :
predict[userID-1][i] = 0
recommend = np.argsort(predict[userID-1])
#分数最高的5部电影
a = recommend[-1]
b = recommend[-2]
c = recommend[-3]
d = recommend[-4]
e = recommend[-5]
print('为用户%d推荐的电影为\n1:%s\n2:%s\n3:%s\n4:%s\n5:%s。'\
%(userID,movies_df['title'][a],movies_df['title'][b],movies_df['title'][c],movies_df['title'][d],movies_df['title'][e]))

@ -1,4 +1,4 @@
# 10.3:基于矩阵分解的协同过滤算法原理
# 10.3 基于矩阵分解的协同过滤算法原理
将用户喜好矩阵与内容矩阵进行矩阵乘法就能得到用户对物品的预测结果,而我们的目的是预测结果与真实情况越接近越好。所以,我们将预测值与评分表中已评分部分的值构造平方差损失函数:
@ -27,6 +27,23 @@ loss = np.mean(np.multiply((y-np.dot(x,w))**2,record))
我们的目的就是最小化平方差损失函数,通常机器学习都是使用梯度下降的方法来最小化损失函数得到正确的参数。
梯度下降可以看成是我们被蒙住了双眼,然后要从山顶走到山下的过程。既然是被蒙住双眼,那么只能用脚去小步试探,看看哪个方向是朝着山下最抖的方向,找到了这个方向后就往该方向走一小步。然后不断地试探,走,试探,走,最终就可能会成功地走到山下。
如果我们将损失函数的值的大小看成是山的高度,那么我们就可以使用这种类似爬山的梯度下降算法来求解。其中,试探这个动作就是计算参数对于损失函数的偏导(即梯度),走这个动作就是根据梯度来更新参数,至于走的时候步子迈多大就是学习率。
因此梯度下降算法的伪代码如下:
设置学习率 α
设置损失值变化的最小阈值 β
while 到达迭代次数:
计算当前参数 θ 的损失值 J
计算参数对损失函数的偏导 G
计算新参数 Newθ公式为 Newθ = θ - αG
计算参数为 Newθ 时的损失值 NewJ
if abs(NewJ - j) < β:
break
对每个参数求得偏导如下:
@ -63,10 +80,12 @@ w_grads = np.dot(x.T,np.multiply(record,np.dot(x,w)-y))
然后再进行梯度下降:
```python
#梯度下降,更新参数
#梯度下降
for i in range(n_iter):
# 计算x和w的梯度
x_grads = np.dot(np.multiply(record,np.dot(x,w)-y),w.T)
w_grads = np.dot(x.T,np.multiply(record,np.dot(x,w)-y))
# 更新参数
x = alpha*x - lr*x_grads
w = alpha*w - lr*w_grads
```

@ -1,4 +1,4 @@
# 10.2:基于矩阵分解的协同过滤算法思想
# 10.2 基于矩阵分解的协同过滤算法思想
在推荐系统中,我们经常看到如下图的表格,表格中的数字代表用户对某个物品的评分,`0`代表未评分。我们希望能够预测目标用户对物品的评分,进而根据评分高低,将分高的物品推荐给用户。
@ -60,3 +60,11 @@
基于矩阵分解的协同过滤算法思想为:**一个用户评分矩阵可以分解为一个用户喜好矩阵与内容矩阵,我们只要能找出正确的用户喜好矩阵参数与内容矩阵参数(即表内的值),就能对用户评分进行预测,再根据预测结果对用户进行推荐。**
所以不难看出,基于矩阵分解的协同过滤算法的流程如下:
- 1.随机初始矩阵值
- 2.构造损失函数,求得矩阵参数梯度
- 3.进行梯度下降,更新矩阵参数值
- 4.喜好矩阵与内容矩阵相乘得到预测评分
- 5.根据预测评分进行推荐

@ -1,4 +1,4 @@
# 10.6:实战案例
# 10.5 实战案例
## 电影评分数据
@ -45,11 +45,17 @@
```python
import numpy as np
#获取用户数与电影数
import pandas as pd
# 读取电影数据
ratings_df = pd.read_csv('data.csv')
# 获取用户数
userNo = max(ratings_df['userId'])+1
# 获取电影数
movieNo = max(ratings_df['movieRow'])+1
#创建电影评分表
# 创建电影评分表
rating = np.zeros((userNo,movieNo))
for index,row in ratings_df.iterrows():
rating[int(row['userId']),int(row['movieRow'])]=row['rating']
@ -58,6 +64,7 @@ for index,row in ratings_df.iterrows():
构造出表格后,我们就能使用上一关实现的方法来对用户进行电影推荐了:
```python
# 使用上一节中实现的推荐算法进行推荐
recommend(1,1e-4,0.999,20,100,rating)
>>>
为用户1推荐的电影为
@ -67,6 +74,7 @@ recommend(1,1e-4,0.999,20,100,rating)
4:Betrayal, The (Nerakhoon) (2008)
5:Midnight Express (1978)。
# 使用上一节中实现的推荐算法进行推荐
recommend(666,1e-4,0.999,20,100,rating)
>>>
为用户666推荐的电影为
@ -76,6 +84,7 @@ recommend(666,1e-4,0.999,20,100,rating)
4:Onion Field, The (1979)
5:Wind Rises, The (Kaze tachinu) (2013)。
# 使用上一节中实现的推荐算法进行推荐
recommend(555,1e-4,0.999,20,100,rating)
>>>
为用户555推荐的电影为
@ -85,6 +94,7 @@ recommend(555,1e-4,0.999,20,100,rating)
4:Listen to Me Marlon (2015)
5:World of Tomorrow (2015)。
# 使用上一节中实现的推荐算法进行推荐
recommend(88,1e-4,0.999,20,100,rating)
>>>
为用户88推荐的电影为

@ -1,4 +1,32 @@
# 10.1:推荐系统概述
# 10.1 推荐系统概述
## 什么是推荐系统
你可能会有这样的经历当你在电商网站闲逛时电商网站会根据你的历史行为轨迹分析出你的喜好像你推荐一些你可能喜欢的商品。当你刷抖音快手等小视频APP时这些APP会根据你观看视频的时长、视频类型等数据进行判别判别出你接下来可能更想要看到的视频。其实这些基本上都是推荐系统的应用。
总结下来,使用的场景不外乎两个:帮你做内容推荐,或者说是筛选;另外就是做消费刺激,找到你想要买的东西。再抽象一点,其实考量的就是信息的相关行或者关联程度的问题。
## 基本概念
在开始前,我们先来明确一个问题,即什么是个性化推荐。简单来说,就是根据每个使用者的偏好,呈现出不同的内容。有一个误区要说明,所谓的热门推荐有时候网站上热卖或者流量最多的东西,并不一定是基于你的喜好分析的结果。
在明白问题界限之后,我们继续。接下来想想,既然是个性化的推荐,那么系统必然要维护一套用户模型,这个模型用来记录用户的偏好,从而预测这个用户可能感兴趣的内容。
那么用户模型的建立需要什么信息呢一般来说可以从两种方式获取用户偏好信息。常见的一种方式就是由系统显示的询问用户比如说在Apple music第一次使用时它会让你选择自己喜欢的音乐类型和音乐人等信息第二种方式就是隐式的记录用户使用时产生的数据。还是以Apple Music为例假如你选择了摇滚和粤语的音乐类型但是大部分时间你听的是周杰伦、Oasis的歌曲那么系统会调整给你推荐的音乐可能就不会听到陈奕迅的歌曲了。
除了用户本身的信息,那还有没其他可以利用的信息来进行推荐呢。答案是肯定的,其他用户产生的大量的信息或者物品本身的描述甚至与物品相关的因果知识,这些都是可以被使用的。
## 常见的推荐系统
不同的信息对应不同的推荐系统
- 协同过滤系统前提就是如果另一个用户跟你曾经的购买经历很相似那么当ta买了一本书而你还没有买的时候那么你很有可能也会喜欢这本书反过来也是一样的。这就相当于你跟这个用户隐式进行相互协作所以成为协同过滤Collaborative Filtering。当然肯定不会只有你跟另一个用户两个人这是会从大量用户集合中进行过滤分析的。
- 基于内容的推荐系统无论是为了让你买东西还是给你找可能想阅读的文章如果我们从这些被推荐项着手试着分析它们的特征比如说体裁、类型、风格、颜色等与你之前购买或者阅读的偏好信息进行匹配这就是基于内容的推荐系统Content-Based Recommendation
- 基于知识的推荐系统。通过上面的介绍我们可以知道大量多次的购买是CBS跟CF的前提但是如果面对的是大量的单词购买者呢比如说汽车这个时候怎么办我们可以考量使用更为精细和结构化的信息比如说专业的特征等来构建明确的约束条件同时我们也看到约束条件往往会跟用户有一个交互式的引导这样才能比较好的摸索出用户的喜好。
本章中主要介绍协同过滤算法,并讲解如何实现电影推荐功能。

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

@ -1,2 +1,2 @@
# 第二章 数据探索
# 第二章 认识数据

@ -1,2 +1,22 @@
# 2.1:数据与属性
# 2.1 数据与属性
一般而言,一个数据集一般由多条数据组成,而一条数据也一般由多个属性构成。如果将一个数据集看成是一个表格,那么表格中的每一行表示一条数据,而表格中的每一列表示数据的一个属性。如下图所示的泰坦尼克数据集中有 5 条数数据,数据有 12 个属性。当然,我们通常将属性称为特征。
![](1.jpg)
根据特征的特点可以将其划分成**categorical特征、ordinal特征、numeric特征**。
## categorical特征
categorical特征顾名思义即类别特征。注意这里的类别指的是没有顺序的类别。如泰坦尼克数据集中的`Survived`、`Sex`、`Cabin`、`Embarked`都是categorical特征。因为这些特征的值都代表某种类别。如`Sex`中的`male`和`female`分别代表男性和女性,而且男性与女性之间没有顺序关系。
## ordinal特征
ordinal特征和categorical特征一样都代表类别特征只不过ordinal特征表示的是具有顺序属性的类别特征。如泰坦尼克数据集中的`Pclass`、`SibSp`、`Parch`属于ordinal特征。例如`Pclass`表示乘客的船舱的等级,`3、2、1`分别表示三等舱、二等舱和一等舱。很明显,一等舱的高级程度是高于其他两种舱的,所以是`Pclass`是ordinal特征。
## numeric特征
numeric特征表示的数值型特征这就很好理解了。只要该特征的值是数值型的则该特征为numeric特征。如`Age`、`Fare`都是numeric特征。

@ -1,2 +1,41 @@
# 2.3:数据可视化
# 2.3 数据可视化
人类都是视觉动物,虽然常见的统计量能够反映出一些数据的特点,但是并不直观,如果能够将数据中的特征的分布或者特征与特征之间的关系可视化出来,那么对于理解数据来说,算是比较舒服的一件事情了。所以接下来就介绍一些常见的可视化图形,都表示了什么样的信息。
## 散点图
散点图也叫`X-Y`图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。
通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。那些离点集群较远的点我们称为离群点或者异常点。
![](2.jpg)
下面来看一个例子,假设现在有这样一份数据。其中包括性别,年龄,身高和体重。
![](3.jpg)
如果我们使用身高和体重这两个特征来画出散点图,则会有如下可视化结果:
![](4.jpg)
从可视化结果可以看出,不管是男生还是女生仿佛都遵循这一个规律,就是身高越高体重就越重。而且细心一点,可以看出身高 170 体重为 90 的人应该是属于肥胖了。
## 直方图
直方图可以看成是描述数据分布的分布图,横轴代表特征的数值,纵轴代表该特征值在数据集中出现的频率或者次数。
例如这是罗斯福国家公园树木数据集中树木所处地的海拔高度的直方图。
![](5.jpg)
从图中可以看出,大部分树木都在海拔 3000 米左右的地方生长。而且整个海拔的分布近似于正态分布。这也是符合常理的,因为只有极少部分品种的树木需要在非常低或者非常高的海拔的条件下才能生长。
## 饼图
当想要看看某个categorical特征的值的占比时可以尝试使用饼图来进行可视化。例如以下饼图为某县手机运营商的市场份额分布图。
![](6.jpg)
从图中可以看出,该县的手机运营商的市场基本上已经被中国移动给霸占了。说明当地的中国移动可能更会做宣传,或者服务质量更好。

@ -1,2 +1,43 @@
# 2.2:数据的基本统计指标
# 2.2 数据的基本统计指标
在进行数据挖掘之前,通常需要先了解数据集中数据的分布。所谓的分布,就是查看数据集中特征的一些统计指标。常见的统计指标有均值,中值,标准差,方差等。
假设现在有这样的一份长沙房价数据,并接下来使用这份数据来讲解什么是均值、中值、标准差和方差。
| 编号 | 地区| 建筑面积 |总价|
|:-:|:-:|:-:|:-:|
| 1 | 开福区 | 120 | 900000 |
| 2 | 岳麓区 | 111 | 700000 |
| 3 | 天心区 | 93 | 600000 |
| 4 | 雨花区 | 140 | 1200000 |
| 5 | 开服区 | 121 | 910000 |
| 6 | 岳麓区 | 87 | 500000 |
## 均值
均值即数据表格中的某一列所有的值相加再除以数据条数。反映的是某个特征的特征值的平均水平。如表格中总价的均值为:`(900000+700000+600000+1200000+910000+500000)/6=801666.7`。也就是说长沙的平均房价为 80 万左右。
## 中值
中值即对数据表格中某一列所有的值进行排序后,排在中间位置的值。反映的是某个特征的特征值的中等水平。如表格中建筑面积经过排序后为`87, 93, 111, 120, 121, 140`,那么建筑面积的中值就是 111 。也就是说整个数据集给出的信息是,长沙中等水平的房子的面积为 111 平。
## 方差
方差表示的是表格中某一列所有的值的分散程度,方差越大说明越分散。方差的计算公式如下(其中μ表示均值)
$$
\frac{1}{N}\sum_{i=1}^N(x_i-\mu)^2
$$
如表格中总价的方差为:`((900000-801666.7)^2+(700000-80166.7)^2+(600000-80166.7)^2+(1200000-80166.7)^2+(910000-80166.7)^2+(500000-80166.7)^2)/6=574242757455.5568`。从方差的值来看,数据中体现了长沙的房价的分散程度比较大,并没有集中在均价的水平。
## 标准差
标准差即方差的算术平方根。如表格中总价的标准差为:`757788.0689583049`。同样,标准差越大说明数据越分散。

@ -1,4 +1,5 @@
# 3.1:为什么要数据预处理
# 3.1 为什么要数据预处理
数据挖掘其实就是从数据中学习到规律,再将学习到的规律对未知的数据进行分析。数据的质量直接影响到模型学习的好坏,而我们最开始获取的数据其中绝大多数是“有毛病”的,不利于后期进行分析。所以我们在分析前需要进行数据的预处理。
`sklearn.preprocessing`包提供了几个常用的函数和转换类型,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。

@ -1,4 +1,4 @@
# 3.7:估算缺失值
# 3.7 估算缺失值
## 为什么要估算缺失值

@ -1,4 +1,4 @@
# 3.4:归一化
# 3.4 归一化
## 为什么使用归一化

@ -1,4 +1,4 @@
# 3.2:标准化
# 3.2 标准化
## 为什么要进行标准化
@ -8,7 +8,7 @@
## Z-score标准化
这种方法基于原始数据的均值`mean`和标准差`standard deviation`进行数据的标准化。将特征`A`的原始值`x`使用`z-score`标准化到`x`。`z-score`标准化方法适用于特征`A`的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在`0`附近,方差值为`1`。数学公式如下:
这种方法基于原始数据的均值`mean`和标准差`standard deviation`进行数据的标准化。对特征`A`的原始值`x`使用`z-score`标准化,将其值标准化为到`x`。`z-score`标准化方法适用于特征`A`的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在`0`附近,方差值为`1`。数学公式如下:
$$
x^,=\frac{x-x_{mean}}{x_{std}}
@ -71,7 +71,8 @@ $$
x^, = \frac{x}{x_{max}}
$$
可以使用`MaxAbsScale`实现,以下是使用上例中数据运用这个缩放器的例子:
以下是使用上例中数据,并对其进行`MaxAbs`标准化的例子:
```python
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],

@ -1,4 +1,4 @@
# 3.6:生成多项式特征
# 3.6 生成多项式特征
## 为什么需要多项式特征

@ -1,4 +1,4 @@
# 3.5:离散值编码
# 3.5 离散值编码
## LabelEncoder
@ -21,14 +21,39 @@ array([1, 0])
这种整数特征表示并不能在`sklearn`的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。如将`male,female`,转换为`1,0`。`1`比`0`要大,机器就会把这个关系考虑进去,而`male,female`之间是没有这样的关系的。所以我们需要使用另外一种编码方式,`OneHot`编码。
在`sklearn`中通过`OneHotEncoder`来实现,使用方法如下:
`OneHot`编码其实非常简单,就是在将原来的特征展开成一个二进制列,假设`sex`这个特征有两种取值,分别为:`male`和`female`。数据如下:
| id | sex |
|:-:|:-:|
| 1 | male |
| 2 | male |
| 3 | female |
| 4 | male |
| 5 | female |
那么经过`OneHot`编码之后,数据会变成如下形式(原来数据中`sex`为`male`的在编码后`sex_male`的值为`1``sex`为`female`的在编码后`sex_female`的值为`1`)
| id | sex_male | sex_female|
|:-:|:-:|:-:|
| 1 | 1 | 0 |
| 2 | 1 | 0 |
| 3 | 0 | 1 |
| 4 | 1 | 0 |
| 5 | 0 | 1 |
你会发现,经过`OneHot`编码后,`sex`特征变成了无序的二进制特征。当然,在`sklearn`中已经为我们提供了`OneHot`编码的接口。可以通过`OneHotEncoder`来实现,使用方法如下:
```python
import numpy as np
from sklearn.preprocessing import OneHotEncoder
label = np.array([1,0])
label = np.array(label).reshape(len(label),1)#先将X组织成samplefeature的格式
# 实例化OneHotEncoder对象
onehot_label = OneHotEncoder()
# 对数据进行编码
label = onehot_label.fit_transform(label).toarray()
>>>label
@ -37,3 +62,4 @@ array([[0., 1.],
```

@ -1,4 +1,4 @@
# 3.3:非线性变换
# 3.3 非线性变换
## 为什么要非线性转换

@ -1 +1,50 @@
# 4.2:k-近邻算法原理 我们已经知道,如何判别一个样本属于哪个类型,主要是看离它最近的几个样本中哪个类型的数量最多,则该样本属于数量最多的类型。这里,存在两个问题: - 何为最近 - 如果有两个类型的样本数一样且最多,那么最终该样本应该属于哪个类型 ### 距离度量 关于何为最近,大家应该自然而然就会想到可以用两个样本之间的距离大小来衡量,我们常用的有两种距离: - 欧氏距离:欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。 ![欧氏距离](knn4.jpg) 二维平面上欧式距离计算公式: $$ d_{12} = \sqrt{(x^{(1)}_1-x^{(2)}_1)^2+(x^{(1)}_2-x^{(2)}_2)^2} $$ `n`维平面上欧氏距离计算公式: $$ d_{12}=\sqrt{\sum\limits_{i=1}^n(x^{(1)}_i-x^{(2)}_i)^2} $$ - 曼哈顿距离:顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。 ![曼哈顿距离](knn5.jpg) 二维平面上曼哈顿距离计算公式: $$ d_{12}=|x^{(1)}_1-x^{(2)}_1|+|x^{(1)}_2-x^{(2)}_2| $$ `n`维平面上曼哈顿计算公式: $$ d_{12}=\sum\limits_{i=1}^n|x^{(1)}_i-x^{(2)}_i| $$ ### 加权投票 `knn`算法最后决定样本属于哪个类别,其实好比就是在投票,哪个类别票数多,则该样本属于哪个类别。而如果出现票数相同的情况,我们可以给每一票加上一个权重,用来表示每一票的重要性,这样就可以解决票数相同的问题了。很明显,距离越近的样本所投的一票应该越重要,此时我们可以将距离的倒数作为权重赋予每一票。 ![](knn7.jpg) 如上图,虽然蓝色正方形与红色三角形数量一样,但是根据加权投票的规则,绿色的圆应该属于蓝色正方形这个类别。
# 4.2 k-近邻算法原理
我们已经知道,如何判别一个样本属于哪个类型,主要是看离它最近的几个样本中哪个类型的数量最多,则该样本属于数量最多的类型。这里,存在两个问题:
- 何为最近
- 如果有两个类型的样本数一样且最多,那么最终该样本应该属于哪个类型
### 距离度量
关于何为最近,大家应该自然而然就会想到可以用两个样本之间的距离大小来衡量,我们常用的有两种距离:
- 欧氏距离:欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
![欧氏距离](knn4.jpg)
二维平面上欧式距离计算公式:
$$
d_{12} = \sqrt{(x^{(1)}_1-x^{(2)}_1)^2+(x^{(1)}_2-x^{(2)}_2)^2}
$$
`n`维平面上欧氏距离计算公式:
$$
d_{12}=\sqrt{\sum\limits_{i=1}^n(x^{(1)}_i-x^{(2)}_i)^2}
$$
- 曼哈顿距离:顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。
![曼哈顿距离](knn5.jpg)
二维平面上曼哈顿距离计算公式:
$$
d_{12}=|x^{(1)}_1-x^{(2)}_1|+|x^{(1)}_2-x^{(2)}_2|
$$
`n`维平面上曼哈顿计算公式:
$$
d_{12}=\sum\limits_{i=1}^n|x^{(1)}_i-x^{(2)}_i|
$$
### 加权投票
`knn`算法最后决定样本属于哪个类别,其实好比就是在投票,哪个类别票数多,则该样本属于哪个类别。而如果出现票数相同的情况,我们可以给每一票加上一个权重,用来表示每一票的重要性,这样就可以解决票数相同的问题了。很明显,距离越近的样本所投的一票应该越重要,此时我们可以将距离的倒数作为权重赋予每一票。
![](knn7.jpg)
如上图,虽然蓝色正方形与红色三角形数量一样,但是根据加权投票的规则,绿色的圆应该属于蓝色正方形这个类别。

@ -1,4 +1,4 @@
# 4.1:k-近邻算法思想
# 4.1 k-近邻算法思想
k-近邻`k-nearest neighbor ,knn`是一种分类与回归的方法。我们这里只讨论用来分类的`knn`。所谓`k`最近邻,就是`k`个最近的邻居的意思,说的是每个样本都可以用它最近的`k`个邻居来代表。
@ -8,4 +8,4 @@ k-近邻`k-nearest neighbor ,knn`是一种分类与回归的方法。我
如上图,当`k=3`时离绿色的圆最近的三个样本中,有两个红色的三角形,一个蓝色的正方形,则此时绿色的圆应该分为红色的三角形这一类。而当`k=5`时,离绿色的圆最近的五个样本中,有两个红色的三角形,三个蓝色的正方形,则此时绿色的圆应该分为蓝色的正方形这一类。
用一句话来总结`knn`算法的思想就是**近朱者赤近墨者黑**。
用一句话来总结`knn`算法的思想就是**近朱者赤近墨者黑**。而且`knn`是一种简单而有效的机器学习算法。

@ -1,4 +1,4 @@
# 4.3:k-近邻算法流程
# 4.3 k-近邻算法流程
`knn`算法不需要训练模型,只是根据离样本最近的几个样本类型来判别该样本类型,所以流程非常简单:

@ -1,4 +1,4 @@
# 4.4:动手实现k-近邻
# 4.4 动手实现k-近邻
`knn`算法实现`python`代码如下:

@ -1,4 +1,4 @@
# 4.5:实战案例
# 4.5 实战案例
### 手写数字数据

@ -1,4 +1,4 @@
# 5.4:动手实现线性回归
# 5.4 动手实现线性回归
线性回归`python`实现代码如下:

@ -1,4 +1,4 @@
# 5.5:实战案例
# 5.5 实战案例
### 波士顿房价数据
@ -59,7 +59,7 @@ array([27.14328365, 23.03653632, 27.00098113, 34.67246356, 22.9249281 ,
19.69396665, 14.18869608])
```
### 衡量线性回归的性能指标
### 衡量回归的性能指标
对于分类问题,我们可以使用正确率来衡量模型的性能好坏,很明显,回归问题并不能使用正确率来衡量,那么,回归问题可以使用哪些指标用来评估呢?
@ -97,7 +97,7 @@ $$
##### R-Squared
上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数可能是`3``4``5`之类的。那么预测身高就可能是`0.1``0.6`之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。 看看分类算法的衡量标准就是正确率,而正确率又在`01`之间,最高百分之百。最低`0`。那么线性回归有没有这样的衡量标准呢?`R-Squared`就是这么一个指标,公式如下:
上面的几种衡量标准针对不同的模型会有不同的值。比如说预测房价 那么误差单位就是万元。数可能是`3``4``5`之类的。那么预测身高就可能是`0.1``0.6`之类的。没有什么可读性,到底多少才算好呢?不知道,那要根据模型的应用场景来。 看看分类算法的衡量标准就是正确率,而正确率又在`01`之间,最高百分之百。最低`0`。那么回归有没有这样的衡量标准呢?`R-Squared`就是这么一个指标,公式如下:
$$
R^2=1-\frac{\sum\limits_{i=1}^m(p^{(i)}-y^{(i)})^2}{\sum\limits_{i=1}^m(y_{mean}^{(i)}-y^{(i)})^2}
@ -113,7 +113,7 @@ $$
- 2.当我们的模型性能跟基模型性能相同时,取`0`。
- 3.如果为负数,则说明我们训练出来的模型还不如基准模型,此时,很有可能我们的数据不存在任何线性关系。
其中,基准模型值的随机瞎猜的模型
其中,基准模型以标签的均值作为所有样本的预测结果,具有极大的误差
这里使用`python`实现了`MSE``R-Squared`方法,代码如下:

@ -1,4 +1,4 @@
# 5.2:线性回归算法原理
# 5.2 线性回归算法原理
### 线性回归训练流程
@ -65,3 +65,7 @@ $$

@ -1,4 +1,4 @@
# 5.1:线性回归算法思想
# 5.1 线性回归算法思想
### 简单线性回归

@ -1,4 +1,4 @@
# 5.3:线性回归算法流程
# 5.3 线性回归算法流程
我们最终的目的是通过训练出来的线性回归模型对测试集数据进行预测,算法实现流程如下:

@ -1,4 +1,4 @@
# 6.2:决策树算法原理
# 6.2 决策树算法原理
我们已经知道,构造一棵决策树其实就是根据数据的特征(内部节点)对数据一步一步的进行划分,从而达到分类的目的。但是,每一步根据哪个特征来进行划分呢?这个就是构造决策树的关键。其实构造决策树时会遵循一个指标,有的是按照信息增益来构建,如**ID3算法**;有的是信息增益率来构建,如**C4.5算法**;有的是按照基尼系数来构建的,如**CART算法**。但不管是使用哪种构建算法,决策树的构建过程通常都是一个递归选择最优特征,并根据特征对训练集进行分割,使得对各个子数据集有一个最好的分类的过程。这里我们以**ID3算法**为例,详细介绍构建决策树相关知识。

@ -1,4 +1,4 @@
# 6.1:决策树算法思想
# 6.1 决策树算法思想
决策树是一种可以用于分类与回归的机器学习算法,但主要用于分类。用于分类的决策树是一种描述对实例进行分类的树形结构。决策树由**结点**和**边**组成,其中结点分为**内部结点**和**叶子结点****内部结点表示一个特征或者属性,叶子结点表示标签。**

@ -1,4 +1,4 @@
# 6.3:决策树算法流程
# 6.3 决策树算法流程
我们最终的目的是根据创建的决策树模型对测试集数据进行预测,算法实现流程如下:

@ -1,4 +1,4 @@
# 6.4:动手实现决策树
# 6.4 动手实现决策树
```python
#encoding=utf8

@ -1,4 +1,4 @@
# 6.5:实战案例
# 6.5 实战案例
### 鸢尾花数据
@ -7,7 +7,7 @@
数据集中部分**数据**如下所示:
| 花萼长度 | 花萼宽度 | 花瓣长度 | 花瓣宽度 |
| --- | --- | --- | --- |
| :-: | :-: | :-: | :-: |
| 5.1 | 3.5 | 1.4 | 0.2 |
| 4.9 | 3.2 | 1.4 | 0.2 |
| 4.7 | 3.1 | 1.3 | 0.2 |
@ -17,7 +17,7 @@
数据集中部分**标签**如下图所示:
| 标签 |
| - |
| :-: |
| 0 |
| 1 |
| 2 |

@ -1,4 +1,4 @@
# 7.2:k-均值算法原理
# 7.2 k-均值算法原理
假设我们有`k`个簇:$$(c_1,c_2,...,c_k)$$
@ -24,4 +24,20 @@ $$|c_i|$$表示集合内样本个数。
- 图`c`:计算每个样本到两个质心的距离,并将其归为与其距离最近的质心那个簇。
- 图`d`:更新质心,我们可以看到,红色与蓝色的点位置有了变化。
- 图`e`:重新计算样本到质心距离,并重新划分样本属于哪个簇。
- 图`f`:直到质心位置变换小于阈值,停止迭代。
- 图`f`:直到质心位置变换小于阈值或者达到迭代次数的最大值时停止迭代。
所以该算法的伪代码如下:
```python
随机初始化k个质心
设置最大迭代次数
设置质心变化的最小阈值
while 当前迭代次数 < 最大迭代次数:
计算每个样本分别到k个质心的距离
对每个样本打上标记,标记为离哪个质心最近
按照质心计算公式计算出k个新质心
if 新质心与老质心的距离 < 质心变化的最小阈值:
break
此时样本上的标记就代表了样本属于k个簇中的哪个簇而k个质心表示k个簇的中心点
```

@ -1,4 +1,4 @@
# 7.1:k-均值算法思想
# 7.1 k-均值算法思想
`k-means`是属于机器学习里面的**非监督学习**,通常是大家接触到的第一个聚类算法,其思想非常简单,是一种典型的基于距离的聚类算法。`k-means`K-均值)聚类,之所以称为 K-均值 是因为它可以发现`K`个簇,且每个簇的中心采用簇中所含值的均值计算而成。簇内的样本连接紧密,而簇之间的距离尽量大。简单来讲,其思想就是**物以类聚**。

@ -1,4 +1,4 @@
# 7.3:k-均值算法流程
# 7.3 k-均值算法流程
`k-means`算法流程如下:

@ -1,4 +1,4 @@
# 7.4:动手实现k-均值
# 7.4 动手实现k-均值
```python
#encoding=utf8

@ -1,4 +1,4 @@
# 7.5:实战案例
# 7.5 实战案例
### 鸢尾花数据

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

@ -1,2 +1,48 @@
# 8.2:Apriori算法原理
# 8.2 Apriori算法原理
## Apriori原理
假设我们在经营一家商品种类并不多的小卖铺,我们对那些经常在一起被购买的商品非常感兴趣。我们只有 4 种商品:薯片,可乐,纸巾和电池。那么所有可能被一起购买的商品组合都有哪些?这些商品组合可能只有一种商品,比如薯片, 也可能包括两种、三种或者所有四种商品。我们并不关心某人买了两包薯片以及四对电池的情况,我们只关心他购买了一种或多种商品。所以这四种商品的组合图如下(其中用 0 表示薯片1 表示可乐2 表示纸巾, 3 表示电视)
![](2.jpg)
上一节说过,我们的目标是找到经常在一起购买的物品集合,并且我们通常会使用集合的支持度来度量其出现的频率。一个集合的支持度是指有多少比例的交易记录包含该集合。如何对一个给定的集合,比如`{03}`,来计算其支持度?很显然,可以遍历毎条记录并检查该记录包含 0 和 3 ,如果记录确实同时包含这两项,那么就增加总计数值。在扫描完所有数据之后,使用统计得到的总数除以总的交易记录数,就可以得到支持度。这个计算过程还仅仅是对`{0, 3}`这个项集而言,如果想要将海量数据中所有可能出现的项集的支持度给算出来的话,那么很用可能算一辈子也算不完。
为了降低所需的计算时间,研究人员发现一种所谓的 Apriori 原理。Apriori 原理可以帮我们减少可能感兴趣的项集。Apriori 原理是说如果某个项集是频繁的,那么它的所有子集也是频繁的。
对于我们开小卖铺的例子,如果`{0, 1}`这个项集是频繁的,那么`{0}`和`{1}`也一定是频繁的。如果将这个命题进行逆否处理,那么会得到另一个结论,就是如果一个项集是非频繁的,那么它的所有超集都是非频繁的。
那这个结论有什么用呢?假设`{2, 3}`这个项集是非频繁的,那么跟它有关的`{0, 2, 3}``{1, 2, 3}``{0, 1, 2, 3}`都是非频繁的。也就是说算完`{2, 3}`的支持度发现不是频繁的,那么后面 3 个项集的支持度就不需要算了,这样就减小了计算的时间复杂度。
![](3.jpg)
## Apriori算法流程
Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集都被去掉。
所以 Apriori 算法的伪代码如下:
```python
while 集合中的项的个数 > 0:
构建一个由 k 个项组成的候选项集的列表
确认每个项集都是频繁的
保留频繁项集并构建 k+1 项组成的候选项集的列表
```
## 从频繁项集中挖掘关联规则
要找到关联规则,需要从一个频繁项集开始。我们知道集合中的元素是不重复的,但我们想知道基于这些元素能否获得其他内容。例如某个元素或者某个元素集合可能会推导出另一个元素 。从小卖铺的例子可以得到,如果有一个频繁项集`{薯片,西瓜}`,那么就可能有一条关联规
则`薯片->西瓜`。这意味着如果有人购买了薯片,那么在统计上他会购买西瓜的概率较大。
但是,这一条反过来并不总是成立。也就是说,即使`薯片->西瓜`统计上显著,那么`薯片->西瓜`也不一定成立。(从逻辑研究上来讲,箭头左边的集合称作前件,箭头右边的集合称为后件。)
那么怎样挖掘关联规则呢?在发现频繁项集时我们发现的是高于最小支持度的频繁项集,对于关联规则,也是用这种类似的方法。以小卖铺的例子为例,从项集`{0, 1, 2, 3}`产生的关联规则中,找出可信度高于最小可信度的关联规则。(**PS:Apriori 原理对于关联规则同样适用。**)

@ -1,2 +1,2 @@
# 第八章 Apriori
# 第八章 Apriori算法

@ -0,0 +1,40 @@
# 8.1 关联规则与Apriori算法
## 什么是关联规则
顾名思义,关联规则就是发现数据背后存在的某种规则或者联系。举个例子:通过调研超市顾客购买的东西,可以发现 30% 的顾客会同时购买薯片和可乐,而在购买薯片的顾客中有 80% 的人购买了可乐,这就存在一种隐含的关系:`薯片->可乐`,也就是说购买薯片的顾客会有很大可能购买可乐,因此商场可以将薯片和可乐放在同一个购物区,方便顾客购买。这样一来,很有可能会在无形之中提高超市的销售业绩。
![](1.jpg)
## 怎样挖掘关联规则
想要从海量数据中挖掘出关联规则是一件比较麻烦的事情,因为主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索方法并不能解决这个问题,所以需要用更智能的方法在合理的时间范围内找到**频繁项集**。而 Apriori 算法能够帮助我们从**频繁项集**中挖掘出**关联规则**。
## 频繁项集与关联规则
刚刚提到了一个新名词:频繁项集,频繁项集表示的是经常出现在一起的物品的集合。而关联规则指的是两个物品之间可能存在很强的某种关系。
假设现在这样的一份数据:
| 票号 | 商品 |
|:-:|:-:|
| 233 | 薯片 西瓜 |
| 234 | 抹布 可乐 纸巾 电池 |
| 235 | 薯片 可乐 纸巾 果汁 |
| 236 | 西瓜 薯片 可乐 纸巾 |
| 237 | 西瓜 薯片 可乐 果汁 |
现在想要找到频繁项集,但是频繁应该怎样来定义或者量化呢?通常来说,会根据项集的支持度和可信度来衡量项集是否频繁。
一个项集的支持度表示的是数据集中包含该项集的记录所占的比例。从上表中可知,`{薯片}`的支持度为 4/5 。`{薯片, 可乐}`的支持度为 3/5 。很明显,支持度这个指标是针对于项集的。
而可信度是针对关联规则而言的。例如`{可乐}->{纸巾}`的可信度为`支持度({可乐,纸巾})/支持度({可乐})`,即`{可乐}->{纸巾}`的可信度为 0.75 。这个 0.75 意味着对于包含可乐的所有记录,这个关联规则对其中 75% 的记录都适用。
支持度和可信度是用来量化关联分析是否成功的方法。假设想找到支持度大于 0.8 的所有项集 ,应该如何去做?一个办法是生成一个物品所有可能组合的清单,然后对每一种组合统计它出现的频繁程度,但当物品成千上万时,上述做法非常非常慢。此时就可以使用 Apriori 算法来寻找频繁项集,并从频繁项集中挖掘出关联规则。

@ -1,2 +1,108 @@
# 8.4:动手实现Apriori
# 8.3 动手实现Apriori
```python
# 寻找频繁项集部分 Begin
# 构建只有一个元素的项集, 假设dataSet为[[1, 2], [0, 1]. [3, 4]]
# 那么该项集为frozenset({0}), frozenset({1}), frozenset({2}),frozenset({3}), frozenset({4})
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset, C1)
# 从只有k个元素的项集生成有k+1个元素的频繁项集排除掉支持度小于最小支持度的项集
# D为数据集ck为createC1的输出minsupport为最小支持度
def scanD(D, ck, minsupport):
ssCnt = {}
for tid in D:
for can in ck:
if can.issubset(tid):
if not ssCnt.has_key(can):
ssCnt[can]=1
else:
ssCnt[can] +=1
numItems = float(len(D))
reList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key]/numItems
if support >= minsupoort:
reList.insert(0, key)
supportData[key] = support
#reList为有k+1个元素的频繁项集supportData为频繁项集对应的支持度
return reList, supportData
#构建含有k个元素的频繁项集
#如输入为{0},{1},{2}会生成{0,1},{0, 2},{1,2}
def aprioriGen(Lk, k):
retList = []
lenLk = len(LK)
for i in range(lenLk):
for j in range(i+1lenKk):
L1 = list(Lk[i])[k:-2]
L2 = list(Lk[j])[:k-2]
if L1 == L2:
relist.append(Lk[i] | Lk[j])
return reList
#生成候选的频繁项集列表,以及候选频繁项集的支持度,因为在算可信度时要用到
def apriori(dataSet, minsupport=0.5):
C1 = creatC1(dataSet)
D = map(set, dataSet)
L1, supportData = scanD(dataSet, C1, minsupport)
L = [L1]
k = 2
while (len(L[k-2])>0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minsupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
# 寻找频繁项集部分 End
# 挖掘关联规则部分 Begin
# 计算关联规则的可信度,并排除可信度小于最小可信度的关联规则
# freqSet为频繁项集H为规则右边可能出现的元素的集合supportData为频繁项集的支持度brl为存放关联规则的列表minConf为最小可信度
def calcConf(freqSet, H, supportData, brl, minConf = 0.7):
prunedH = []
for conseq in H:
conf = supportData[freqSet]/supportData[freqSet - conseq]
if conf >= minConf:
brl.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
# 从频繁项集中生成关联规则
# freqSet为频繁项集H为规则右边可能出现的元素的集合supportData为频繁项集的支持度brl为存放关联规则的列表minConf为最小可信度
def ruleFromConseq(freqSet, H, supportData, brl, minConf = 0.7):
m = len(H[0])
if len(freqSet) > m+1:
Hmp1 = aprioriGen(H, m+1)
Hmp1 = calcConf(freqSet, Hmp1, supporData, brl, minConf)
if len(Hmp1) > 1:
ruleFromConseq(freqSet, Hmp1, supportData, brl, minConf)
# 从频繁项集中挖掘关联规则
# L为频繁项集 supportData为频繁项集的支持度minConf为最小可信度
def generateRules(L, supportData, minConf = 0.7):
digRuleList = []
for i in range(1, len(L)):
# freqSet为含有i个元素的频繁项集
for freqSet in L[i]:
H1 = [frozenset([item]) for item in freqSet]
if i > 1:
# H1为关联规则右边的元素的集合
rulesFromConseq(freqSet, H1, supportData, digRuleList, minConf)
else:
calcConf(freqSet, H1, supportData, digRuleList, minConf)
return digRuleList
# 挖掘关联规则部分 End
```

@ -1,2 +1,38 @@
# 8.5:实战案例
# 8.4 实战案例
最后我们来尝试使用 Apriori 算法来寻找毒蘑菇中的一些公共特征,利用这些特征就能避免吃到那些有毒的蘑菇。现在有这样一个数据集,数据集合中有一个关于蘑菇的 23 种特征的数据集,每一个特征都包含一
个标称数据值。部分数据截图如下:
![](4.jpg)
其中每行的第一列为标签1 表示蘑菇无毒, 2 表示蘑菇有毒。接下来,为了找到毒蘑菇的共性特征,我们可以使用刚刚动手实现的 Apriori 算法来含有标签值为 2 的频繁项集。如寻找含有 3 个元素的频繁项集。
```python
import pandas as pd
# 读取蘑菇数据
data = pd.read_csv('./data.csv').values()
# 调用上一节中实现的apriori算法
L, _ = apriori(data, minsupport=0.4)
# 遍历含有3个元素的频繁项集
for item in L[3]:
if item.intersection(2):
# 打印出含有标签值为2的频繁项集
print(item)
```
结果如下:
```python
frozenset([63, 59, 2, 93])
frozenset([39, 2, 53, 34])
frozenset([2, 59, 23, 85])
frozenset([2, 59, 90, 85])
frozenset([39, 2, 36, 34])
frozenset([39, 63, 2, 85])
```
可以看出,当这些特征一起出现时,表示该蘑菇很有可能是有毒的。

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@ -1,2 +1,68 @@
# 9.2:PageRank算法原理
# 9.2 PageRank算法原理
## 最简单的场景
互联网中的网页可以看出是一个有向图其中网页是结点如果网页A有链接到网页B则存在一条有向边`A->B`,下面是一个简单的示例:
![](1.jpg)
这个例子中只有四个网页,如果当前在 A 网页,那么悠闲的上网者将会各以 1/3 的概率跳转到 B、C、D这里的 3 表示 A 有 3 条出路,如果一个网页有 k 条出路,那么跳转任意一个出路上的概率是 1/k同理 D 到 B、C 的概率各为 1/2 ,而 B 到 C 的概率为 0。一般用转移矩阵表示上网者的跳转概率如果用 n 表示网页的数目,则转移矩阵 M 是一个 n 阶的方阵;如果网页 j 有 k 个出路,那么对每一个出链指向的网页 i有 M[i][j]=1/k而其他网页的 M[i][j]=0。上面示例图对应的转移矩阵如下
![](2.jpg)
一开始,假设上网者在每一个网页的概率都是相等的,即 1/n ,于是初始的概率分布就是一个所有值都为 1/n 的 n 维列向量 V0用 V0 去右乘转移矩阵 M ,就得到了第一步之后上网者的概率分布向量 V1, 下面是V1 的计算过程:
![](3.JPG)
得到了 V1 后,再用 V1 去右乘 M 得到 V2 ,一直下去,最终 V 会收敛,即 Vn=MV(n-1),不断的迭代,最终 V=[3/9,2/9,2/9,2/9]。所以如果想要向该上网者推荐一个网页,那么就会推荐网页 A。因为它的概率最高。
## 更复杂的场景
上述上网者的行为是一个马尔科夫过程,要满足收敛性,需要具备一个条件:图是强连通的,即从任意网页可以到达其他任意网页。
然而,互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为 0 。假设我们把上面图中 C 到 A 的链接丢掉, C 变成了一个终止点。
![](4.jpg)
对应的转移矩阵 M 为:
![](5.jpg)
这样一个转移矩阵一直迭代下去的话会发现 V=[0,0,0,0]。
当然,还有更加复杂的场景,例如有些网页不存在指向其他网页的链接,但存在指向自己的链接。如下图所示:
![](6.jpg)
上网者跑到 C 网页后,就像陷入了漩涡,再也不能从 C 中出来,将最终导致概率分布值全部转移到 C 上来,这使得其他网页的概率分布值为 0 ,从而整个网页排名就失去了意义。
## 怎样解决复杂场景的问题
上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如图中的 C ),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是 1/n 。假设上网者每一步查看当前网页的概率为 a ,那么他从浏览器地址栏跳转的概率为 (1-a) ,于是迭代公式转化为:
$$
V'=\alpha MV+(1-\alpha)V
$$
假设场景如下图所示:
![](6.jpg)
很显然,该图所对应的转移矩阵 M 为如下所示:
![](7.jpg)
那么假设上网者查看当前网页的概率为 0.8 ,则根据公式可知:
![](8.jpg)
然后一直迭代下去,当收敛时可知 V=[3/9,2/9,2/9,2/9]。

@ -0,0 +1,8 @@
# 9.1 什么是PageRank
PageRank的Page可是认为是网页表示网页排名也可以认为是Larry Page(google 产品经理)因为他是这个算法的发明者之一还是google CEO。
PageRank算法计算每一个网页的PageRank值然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者上网者首先随机选择一个网页打开然后在这个网页上呆了几分钟后跳转到该网页所指向的链接这样无所事事、漫无目的地在网页上跳来跳去PageRank就是估计这个悠闲的上网者分布在各个网页上的概率。
当计算出上网者分布在各个网页上的概率之后,就可以将概率高的网页推荐给上网者以提高用户体验,同时也节省上网者查找资料的时间。

@ -1,2 +1,50 @@
# 9.4:动手实现PageRank
# 9.3 动手实现PageRank
理解了PageRank算法原理之后想要动手实现PageRank算法其实不难。代码如下
```python
from numpy import *
# 构造转移矩阵其中a为有向图的邻接矩阵
def graphMove(a):
b = transpose(a) # b为a的转置矩阵
c = zeros((a.shape), dtype=float)
for i in range(a.shape[0]):
for j in range(a.shape[1]):
c[i][j] = a[i][j] / (b[j].sum()) # 完成初始化分配
return c
# 初始化V0
def firstPr(c):
pr = zeros((c.shape[0], 1), dtype=float)
for i in range(c.shape[0]):
pr[i] = float(1) / c.shape[0]
return pr
# 计算pageRank值
def pageRank(p, m, v):
# 判断pr矩阵是否收敛,(v == p*dot(m,v) + (1-p)*v).all()判断前后的pr矩阵是否相等若相等则停止循环
while ((v == p * dot(m, v) + (
1 - p) * v).all() == False):
v = p * dot(m, v) + (1 - p) * v
return v
if __name__ == "__main__":
# 网页的邻接矩阵
a = array([[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 0, 0]], dtype=float)
M = graphMove(a)
pr = firstPr(M)
# 上网者查看当前网页的概率
p = 0.8
# 计算V
print(pageRank(p, M, pr))
```

@ -2,63 +2,58 @@
* [前言](README.md)
* [第一章 绪论](Chapter1/README.md)
* [1.1:为什么要数据挖掘](Chapter1/数据挖掘简介.md)
* [1.2: 什么是数据挖掘](Chapter1/数据挖掘所用到的技术.md)
* [1.3:数据挖掘主要任务](Chapter1/数据挖掘的应用场景.md)
* [第二章 数据探索](Chapter2/README.md)
* [2.1:数据与属性](Chapter2/数据与属性.md)
* [2.2:数据的基本统计指标](Chapter2/数据的基本统计指标.md)
* [2.3:数据可视化](Chapter2/数据可视化.md)
* [2.4:相似性度量](Chapter2/相似性度量.md)
* [1.1 为什么要数据挖掘](Chapter1/数据挖掘简介.md)
* [1.2 什么是数据挖掘](Chapter1/数据挖掘所用到的技术.md)
* [1.3 数据挖掘主要任务](Chapter1/数据挖掘的应用场景.md)
* [第二章 认识数据](Chapter2/README.md)
* [2.1 数据与属性](Chapter2/数据与属性.md)
* [2.2 数据的基本统计指标](Chapter2/数据的基本统计指标.md)
* [2.3 数据可视化](Chapter2/数据可视化.md)
* [第三章 数据预处理](Chapter3/README.md)
* [3.1:为什么要数据预处理](Chapter3/为什么要数据预处理.md)
* [3.2:标准化](Chapter3/标准化.md)
* [3.3:非线性变换](Chapter3/非线性变换.md)
* [3.4:归一化](Chapter3/归一化.md)
* [3.5:离散值编码](Chapter3/离散值编码.md)
* [3.6:生成多项式特征](Chapter3/生成多项式特征.md)
* [3.7:估算缺失值](Chapter3/估算缺失值.md)
* [3.1 为什么要数据预处理](Chapter3/为什么要数据预处理.md)
* [3.2 标准化](Chapter3/标准化.md)
* [3.3 非线性变换](Chapter3/非线性变换.md)
* [3.4 归一化](Chapter3/归一化.md)
* [3.5 离散值编码](Chapter3/离散值编码.md)
* [3.6 生成多项式特征](Chapter3/生成多项式特征.md)
* [3.7 估算缺失值](Chapter3/估算缺失值.md)
* [第四章 k-近邻](Chapter4/README.md)
* [4.1:k-近邻算法思想](Chapter4/k-近邻算法思想.md)
* [4.2:k-近邻算法原理](Chapter4/k-近邻算法原理.md)
* [4.3:k-近邻算法流程](Chapter4/k-近邻算法流程.md)
* [4.4:动手实现k-近邻](Chapter4/动手实现k-近邻.md)
* [4.5:实战案例](Chapter4/实战案例.md)
* [4.1 k-近邻算法思想](Chapter4/k-近邻算法思想.md)
* [4.2 k-近邻算法原理](Chapter4/k-近邻算法原理.md)
* [4.3 k-近邻算法流程](Chapter4/k-近邻算法流程.md)
* [4.4 动手实现k-近邻](Chapter4/动手实现k-近邻.md)
* [4.5 实战案例](Chapter4/实战案例.md)
* [第五章 线性回归](Chapter5/README.md)
* [5.1:线性回归算法思想](Chapter5/线性回归算法思想.md)
* [5.2:线性回归算法原理](Chapter5/线性回归算法原理.md)
* [5.3:线性回归算法流程](Chapter5/线性回归算法流程.md)
* [5.4:动手实现线性回归](Chapter5/动手实现线性回归.md)
* [5.5:实战案例](Chapter5/实战案例.md)
* [5.1 线性回归算法思想](Chapter5/线性回归算法思想.md)
* [5.2 线性回归算法原理](Chapter5/线性回归算法原理.md)
* [5.3 线性回归算法流程](Chapter5/线性回归算法流程.md)
* [5.4 动手实现线性回归](Chapter5/动手实现线性回归.md)
* [5.5 实战案例](Chapter5/实战案例.md)
* [第六章 决策树](Chapter6/README.md)
* [6.1:决策树算法思想](Chapter6/决策树算法思想.md)
* [6.2:决策树算法原理](Chapter6/决策树算法原理.md)
* [6.3:决策树算法流程](Chapter6/决策树算法流程.md)
* [6.4:动手实现决策树](Chapter6/动手实现决策树.md)
* [6.5:实战案例](Chapter6/实战案例.md)
* [6.1 决策树算法思想](Chapter6/决策树算法思想.md)
* [6.2 决策树算法原理](Chapter6/决策树算法原理.md)
* [6.3 决策树算法流程](Chapter6/决策树算法流程.md)
* [6.4 动手实现决策树](Chapter6/动手实现决策树.md)
* [6.5 实战案例](Chapter6/实战案例.md)
* [第七章 k-均值](Chapter7/README.md)
* [7.1:k-均值算法思想](Chapter7/k-均值算法思想.md)
* [7.2:k-均值算法原理](Chapter7/k-均值算法原理.md)
* [7.3:k-均值算法流程](Chapter7/k-均值算法流程.md)
* [7.4:动手实现k-均值](Chapter7/动手实现k-均值.md)
* [7.5:实战案例](Chapter7/实战案例.md)
* [7.1 k-均值算法思想](Chapter7/k-均值算法思想.md)
* [7.2 k-均值算法原理](Chapter7/k-均值算法原理.md)
* [7.3 k-均值算法流程](Chapter7/k-均值算法流程.md)
* [7.4 动手实现k-均值](Chapter7/动手实现k-均值.md)
* [7.5 实战案例](Chapter7/实战案例.md)
* [第八章 Apriori](Chapter8/README.md)
* [8.1:Apriori算法思想](Chapter8/Apriori算法思想.md)
* [8.2:Apriori算法原理](Chapter8/Apriori算法原理.md)
* [8.3:Apriori算法流程](Chapter8/Apriori算法流程.md)
* [8.4:动手实现Apriori](Chapter8/动手实现Apriori.md)
* [8.5:实战案例](Chapter8/实战案例.md)
* [8.1 关联规则与Apriori](Chapter8/关联规则与Apriori算法.md)
* [8.2 Apriori算法原理](Chapter8/Apriori算法原理.md)
* [8.3 动手实现Apriori](Chapter8/动手实现Apriori.md)
* [8.4 实战案例](Chapter8/实战案例.md)
* [第九章 PageRank](Chapter9/README.md)
* [9.1:PageRank算法思想](Chapter9/PageRank算法思想.md)
* [9.2:PageRank算法原理](Chapter9/PageRank算法原理.md)
* [9.3:PageRank算法流程](Chapter9/PageRank算法流程.md)
* [9.4:动手实现PageRank](Chapter9/动手实现PageRank.md)
* [9.5:实战案例](Chapter9/实战案例.md)
* [9.1 什么是PageRank](Chapter9/什么是PageRank.md)
* [9.2 PageRank算法原理](Chapter9/PageRank算法原理.md)
* [9.3 动手实现PageRank](Chapter9/动手实现PageRank.md)
* [第十章 推荐系统](Chapter10/README.md)
* [10.1:推荐系统概述](Chapter10/推荐系统概述.md)
* [10.2:基于矩阵分解的协同过滤算法思想](Chapter10/基于矩阵分解的协同过滤算法思想.md)
* [10.3:基于矩阵分解的协同过滤算法原理](Chapter10/基于矩阵分解的协同过滤算法原理.md)
* [10.4:基于矩阵分解的协同过滤算法流程](Chapter10/基于矩阵分解的协同过滤算法流程.md)
* [10.5:动手实现基于矩阵分解的协同过滤](Chapter10/动手实现基于矩阵分解的协同过滤.md)
* [10.6:实战案例](Chapter10/实战案例.md)
* [10.1 推荐系统概述](Chapter10/推荐系统概述.md)
* [10.2 基于矩阵分解的协同过滤算法思想](Chapter10/基于矩阵分解的协同过滤算法思想.md)
* [10.3 基于矩阵分解的协同过滤算法原理](Chapter10/基于矩阵分解的协同过滤算法原理.md)
* [10.4 动手实现基于矩阵分解的协同过滤](Chapter10/动手实现基于矩阵分解的协同过滤.md)
* [10.5 实战案例](Chapter10/实战案例.md)

@ -1,11 +1,12 @@
{
"plugins": [
"fontsettings",
"sharing",
"lunr",
"search",
"highlight",
"livereload",
"katex"
]
"title":"数据挖掘",
"author":"敖凌文",
"language":"zh-hans",
"pdf":{
"toc":true,
"pageNumbers":false,
"fontSize":16,
"paperSize":"a4"
},
"plugins": ["katex"]
}

Binary file not shown.
Loading…
Cancel
Save