@ -0,0 +1,2 @@
|
||||
# 第一章 绪论
|
||||
|
@ -0,0 +1,10 @@
|
||||
# 1.1:数据挖掘简介
|
||||
|
||||
人类正被数据淹没,却饥渴于知识。随着数据库技术的应用越来越普及,人们正逐步陷入“数据丰富,知识贫乏”的尴尬境地。知识信息的“爆炸”给人类带来莫大益处,但也带来不少弊端,造成知识信息的“污染”。面临浩瀚无际而被污染的数据,人们呼唤从数据汪洋中来一个去粗取精、去伪存真的技术。在这种形势下,数据挖掘应运而生。数据挖掘就是指从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的,目标明确、 针对性强、精炼准确的信息和知识的过程。 数据与知识贫乏导致了知识发现和数据挖掘的出现,当人们进入 21 世纪以后,可以预计知识发现与数据挖掘的研究又将形成一个新的高潮。
|
||||
|
||||
数据挖掘是一门多学科交叉的领域。一方面,数据挖掘以计算技术的发展为首要条件,没有数据的有效组织,从一堆数据垃圾中发现有用的知识是痴人说梦;没有大量计算算法的支持,即使是简单的查询也会耗时巨大,更不用说发现有用的模式。另一方面,即使数据得到有效的组织,计算算法足够先进,要想发现数据中隐藏的有用信息,还必须综合利用统计学、模式识别、人工智能、机器学习、神经网络等学科的专业知识。比如数据挖掘使用的分析方法,有相当大比重是靠统计学中的多元分析来支撑的,由统计理论衍生出来的。当然,所有这些学科的发展必然会从不同的角度关 注数据分析技术的进展,数据挖掘也为这些学科的发展提供了新的机遇和挑战。
|
||||
|
||||
数据挖掘是用于数据处理的一种新的思维方法和技术手段,它是在现实生活中各种数据量不断增长,以及以数据库技术为核心的信息技术逐渐成熟的背景下产生的。数据挖掘可以帮助用户发现隐藏在数据库中的规律和模式,它融合了人工智能、统计、机器学习、模式识别和数据库等多种学科的理论、方法与技术,通过对数据的归纳、分析和推理,从中发掘出潜在的模式,帮助决策者调整策略,进行正确的决策。
|
||||
|
||||
但是,我们也必须看到,要研究数据挖掘,必须强调所用方法的概念和属性,而不是机械的应用不同的数据挖掘工具。对方法、模型以及它们怎样运转及运转原理的 深入理解是有效和成功运用数据挖掘技术的先决条件。任何在数据挖掘领域的研究者和实践者都要意识到这些问题,以便成功地应用一种特定的方法,理解一种方法的 局限性,或者开发新技术。
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第十章 推荐系统
|
||||
|
@ -0,0 +1,7 @@
|
||||
# 10.4:基于矩阵分解的协同过滤算法流程
|
||||
|
||||
- 1.随机初始矩阵值
|
||||
- 2.构造损失函数,求得矩阵参数梯度
|
||||
- 3.进行梯度下降,更新矩阵参数值
|
||||
- 4.喜好矩阵与内容矩阵相乘得到预测评分
|
||||
- 5.根据预测评分进行推荐
|
@ -0,0 +1,4 @@
|
||||
# 10.1:推荐系统概述
|
||||
|
||||
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第二章 数据探索
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 2.1:数据与属性
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 2.3:数据可视化
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 2.2:数据的基本统计指标
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 2.4:相似性度量
|
||||
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 2.5 KiB |
@ -0,0 +1,2 @@
|
||||
# 第三章 数据预处理
|
||||
|
@ -0,0 +1,4 @@
|
||||
# 3.1:为什么要数据预处理
|
||||
|
||||
数据挖掘其实就是从数据中学习到规律,再将学习到的规律对未知的数据进行分析。数据的质量直接影响到模型学习的好坏,而我们最开始获取的数据其中绝大多数是“有毛病”的,不利于后期进行分析。所以我们在分析前需要进行数据的预处理。
|
||||
`sklearn.preprocessing`包提供了几个常用的函数和转换类型,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。
|
@ -0,0 +1,81 @@
|
||||
# 3.3:非线性变换
|
||||
|
||||
|
||||
## 为什么要非线性转换
|
||||
|
||||
对于大多数数据挖掘算法来说,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。非线性转换就是将我们的特征映射到均匀分布或者高斯分布(即正态分布)。
|
||||
|
||||
## 映射到均匀分布
|
||||
|
||||
相比线性缩放,该方法不受异常值影响,它将数据映射到了零到一的均匀分布上,将最大的数映射为`1`,最小的数映射为`0`。其它的数按从小到大的顺序均匀分布在`0`到`1`之间,如有相同的数则取平均值,如数据为`np.array([[1],[2],[3],[4],[5]])`则经过转换为:`np.array([[0],[0.25],[0.5],[0.75],[1]])`,数据为`np.array([[1],[2],[9],[10],[2]])`则经过转换为:`np.array([[0],[0.375],[0.75],[1.0],[0.375]])`。第二个例子具体过程如下图:
|
||||
|
||||
![](1.jpg)
|
||||
|
||||
在`sklearn`中使用`QuantileTransformer`方法实现,用法如下:
|
||||
```python
|
||||
from sklearn.preprocessing import QuantileTransformer
|
||||
import numpy as np
|
||||
|
||||
data = np.array([[1],[2],[3],[4],[5]])
|
||||
quantile_transformer = QuantileTransformer(random_state=666)
|
||||
data = quantile_transformer.fit_transform(data)
|
||||
|
||||
>>>data
|
||||
array([[0. ],
|
||||
[0.25],
|
||||
[0.5 ],
|
||||
[0.75],
|
||||
[1. ]])
|
||||
```
|
||||
|
||||
## 映射到高斯分布
|
||||
|
||||
映射到高斯分布是为了稳定方差,并最小化偏差。在最新版`sklearn 0.20.x`中`PowerTransformer`现在有两种映射方法,`Yeo-Johnson`映射,公式如下:
|
||||
$$
|
||||
x_i^{(\lambda)} = \begin{cases}
|
||||
[(x_i+1)^\lambda-1],if \lambda\neq0,x_i\geq0\\
|
||||
\ln(x_i)+1,if\lambda=0,x_i\geq0\\
|
||||
-[(-x_i+1)^{2-\lambda}-1]/(2-\lambda),if\lambda\neq2,x_i<0\\
|
||||
-\ln(-x_i+1),if\lambda=2,x_i<0
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
`Box-Cox`映射,公式如下:
|
||||
|
||||
$$
|
||||
x_i^{(\lambda)} = \begin{cases}
|
||||
\frac{x_i^\lambda-1}{\lambda},if\lambda\neq0\\
|
||||
\ln(x_i),if\lambda=0
|
||||
\end{cases}
|
||||
$$
|
||||
|
||||
在`sklearn 0.20.x`中使用`PowerTransformer`方法实现,用法如下:
|
||||
```python
|
||||
from sklearn.preprocessing import PowerTransformer
|
||||
import numpy as np
|
||||
|
||||
data = np.array([[1],[2],[3],[4],[5]])
|
||||
pt = PowerTransformer(method='box-cox', standardize=False)
|
||||
|
||||
data = pt.fit_transform(data)
|
||||
```
|
||||
|
||||
学习平台使用的是`sklearn 0.19.x`,通过对`QuantileTransformer`设置参数`output_distribution='normal'`实现映射高斯分布,用法如下:
|
||||
```python
|
||||
from sklearn.preprocessing import QuantileTransformer
|
||||
import numpy as np
|
||||
|
||||
data = np.array([[1],[2],[3],[4],[5]])
|
||||
quantile_transformer = QuantileTransformer(output_distribution='normal',random_state=666)
|
||||
data = quantile_transformer.fit_transform(data)
|
||||
data = np.around(data,decimals=3)
|
||||
|
||||
>>>data
|
||||
array([[-5.199],
|
||||
[-0.674],
|
||||
[ 0. ],
|
||||
[ 0.674],
|
||||
[ 5.199]])
|
||||
```
|
||||
|
||||
|
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.3 KiB |
@ -0,0 +1,2 @@
|
||||
# 第四章 k-近邻
|
||||
|
@ -0,0 +1 @@
|
||||
# 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)
如上图,虽然蓝色正方形与红色三角形数量一样,但是根据加权投票的规则,绿色的圆应该属于蓝色正方形这个类别。
|
@ -0,0 +1,7 @@
|
||||
# 4.3:k-近邻算法流程
|
||||
|
||||
`knn`算法不需要训练模型,只是根据离样本最近的几个样本类型来判别该样本类型,所以流程非常简单:
|
||||
|
||||
- 1.计算出新样本与每一个样本的距离
|
||||
- 2.找出距离最近的`k`个样本
|
||||
- 3.根据加权投票规则得到新样本的类别
|
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.8 KiB |
After Width: | Height: | Size: 9.6 KiB |
@ -0,0 +1,52 @@
|
||||
# 4.4:动手实现k-近邻
|
||||
|
||||
`knn`算法实现`python`代码如下:
|
||||
|
||||
```python
|
||||
#encoding=utf8
|
||||
import numpy as np
|
||||
|
||||
def knn_clf(k,train_feature,train_label,test_feature):
|
||||
'''
|
||||
input:
|
||||
k(int):最近邻样本个数
|
||||
train_feature(ndarray):训练样本特征
|
||||
train_label(ndarray):训练样本标签
|
||||
test_feature(ndarray):测试样本特征
|
||||
output:
|
||||
predict(ndarray):测试样本预测标签
|
||||
'''
|
||||
#初始化预测结果
|
||||
predict = np.zeros(test_feature.shape[0],).astype('int')
|
||||
#对测试集每一个样本进行遍历
|
||||
for i in range(test_feature.shape[0]):
|
||||
#测试集第i个样本到训练集每一个样本的距离
|
||||
distance = np.sqrt(np.power(np.tile(test_feature[i],(train_feature.shape[0],1))-train_feature,2).sum(axis=1))
|
||||
#最近的k个样本的距离
|
||||
distance_k = np.sort(distance)[:k]
|
||||
#最近的k个样本的索引
|
||||
nearest = np.argsort(distance)[:k]
|
||||
#最近的k个样本的标签
|
||||
topK = [train_label[i] for i in nearest]
|
||||
#初始化进行投票的字典,字典的键为标签,值为投票分数
|
||||
votes = {}
|
||||
#初始化最大票数
|
||||
max_count = 0
|
||||
#进行投票
|
||||
for j,label in enumerate(topK):
|
||||
#如果标签在字典的键中则投票计分
|
||||
if label in votes.keys():
|
||||
votes[label] += 1/(distance_k[j]+1e-10)#防止分母为0
|
||||
#如果评分最高则将预测值更新为对应标签
|
||||
if votes[label] > max_count:
|
||||
max_count = votes[label]
|
||||
predict[i] = label
|
||||
#如果标签不在字典中则将标签加入字典的键,同时计入相应的分数
|
||||
else:
|
||||
votes[label] = 1/(distance_k[j]+1e-10)
|
||||
if votes[label] > max_count:
|
||||
max_count = votes[label]
|
||||
predict[i] = label
|
||||
return predict
|
||||
```
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第五章 线性回归
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,28 @@
|
||||
# 5.4:动手实现线性回归
|
||||
|
||||
线性回归`python`实现代码如下:
|
||||
|
||||
```python
|
||||
#encoding=utf8
|
||||
import numpy as np
|
||||
|
||||
def lr(train_feature,train_label,test_feature):
|
||||
'''
|
||||
input:
|
||||
train_feature(ndarray):训练样本特征
|
||||
train_label(ndarray):训练样本标签
|
||||
test_feature(ndarray):测试样本特征
|
||||
output:
|
||||
predict(ndarray):测试样本预测标签
|
||||
'''
|
||||
#将x0=1加入训练数据
|
||||
train_x = np.hstack([np.ones((len(train_feature),1)),train_feature])
|
||||
#使用正规方程解求得参数
|
||||
theta =np.linalg.inv(train_x.T.dot(train_x)).dot(train_x.T).dot(train_label)
|
||||
#将x0=1加入测试数据
|
||||
test_x = np.hstack([np.ones((len(test_feature),1)),test_feature])
|
||||
#求得测试集预测标签
|
||||
predict = test_x.dot(theta)
|
||||
return predict
|
||||
```
|
||||
|
@ -0,0 +1,67 @@
|
||||
# 5.2:线性回归算法原理
|
||||
|
||||
### 线性回归训练流程
|
||||
|
||||
我们已经知道线性回归模型如下:
|
||||
|
||||
|
||||
$$
|
||||
y = b +w_1x_1+w_2x_2+...+w_nx_n
|
||||
$$
|
||||
|
||||
为了方便,我们稍微将模型进行变换:
|
||||
|
||||
$$
|
||||
y = w_0x_0 +w_1x_1+w_2x_2+...+w_nx_n
|
||||
$$
|
||||
|
||||
其中`x0=1`,`w0=b`,通过向量化公式可写成如下形式:
|
||||
|
||||
$$
|
||||
Y=X.W
|
||||
$$
|
||||
|
||||
$$
|
||||
W = (w_0,w_1,...,w_n)
|
||||
$$
|
||||
|
||||
$$
|
||||
X = (1,x_1,...,x_n)
|
||||
$$
|
||||
|
||||
而我们的目的就是找出能够正确预测的多元线性回归模型,即找出正确的`W`(即权重与偏置)。那么如何寻找呢?通常在监督学习里面都会使用这么一个套路,构造一个损失函数,用来衡量真实值与预测值之间的差异,然后将问题转化为最优化损失函数。既然损失函数是用来衡量真实值与预测值之间的差异那么很多人自然而然的想到了用所有真实值与预测值的差的绝对值来表示损失函数。不过带绝对值的函数不容易求导,所以采用`MSE`(均方误差)作为损失函数,公式如下:
|
||||
|
||||
$$
|
||||
loss = \frac{1}{m}\sum\limits_{i=1}^m(y^{(i)}-p^{(i)})^2
|
||||
$$
|
||||
|
||||
其中`p`表示预测值,`y`表示真实值,`m`为样本总个数,`i`表示第`i`个样本。最后,我们再使用**正规方程解**来求得我们所需要的参数。
|
||||
|
||||
线性回归模型训练流程图如下:
|
||||
|
||||
![lr2](lr2.jpg)
|
||||
|
||||
### 正规方程解
|
||||
|
||||
对线性回归模型,假设训练集中`m`个训练样本,每个训练样本中有`n`个特征,可以使用矩阵的表示方法,预测函数可以写为:
|
||||
|
||||
$$
|
||||
Y = X.W
|
||||
$$
|
||||
|
||||
其损失函数可以表示为
|
||||
|
||||
$$
|
||||
loss = \frac{1}{m}(Y-X.W)^T(Y-X.W)
|
||||
$$
|
||||
|
||||
其中,标签`Y`为`m`行`1`列的矩阵,训练特征`X`为`m`行`(n+1)`列的矩阵,回归系数`W`为`(n+1)`行`1`列的矩阵,对`W`求导,并令其导数为零可解得:
|
||||
|
||||
$$
|
||||
W=(X^TX)^{-1}X^TY
|
||||
$$
|
||||
|
||||
这个就是正规方程解,我们可以通过正规方程解直接求得我们所需要的参数。
|
||||
|
||||
|
||||
|
@ -0,0 +1,8 @@
|
||||
# 5.3:线性回归算法流程
|
||||
|
||||
我们最终的目的是通过训练出来的线性回归模型对测试集数据进行预测,算法实现流程如下:
|
||||
|
||||
- 1.将`x0=1`加入训练数据
|
||||
- 2.使用正规方程解求得参数
|
||||
- 3.将`x0=1`加入测试数据
|
||||
- 4.对测试集数据进行预测
|
@ -0,0 +1,3 @@
|
||||
# 第六章 决策树
|
||||
|
||||
|
After Width: | Height: | Size: 314 KiB |
@ -0,0 +1,8 @@
|
||||
# 6.3:决策树算法流程
|
||||
|
||||
我们最终的目的是根据创建的决策树模型对测试集数据进行预测,算法实现流程如下:
|
||||
|
||||
- 1.计算训练样本信息增益
|
||||
- 2.获得信息增益最高的特征
|
||||
- 3.递归创建决策树
|
||||
- 4.根据决策树模型对测试集数据进行预测
|
@ -0,0 +1,2 @@
|
||||
# 第七章 k-均值
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@ -0,0 +1,9 @@
|
||||
# 7.3:k-均值算法流程
|
||||
|
||||
|
||||
`k-means`算法流程如下:
|
||||
|
||||
- 1.随机初始`k`个点,作为类别中心。
|
||||
- 2.对每个样本将其标记为距离类别中心最近的类别。
|
||||
- 3.将每个类别的质心更新为新的类别中心。
|
||||
- 4.重复步骤`2、3`,直到类别中心的变换小于阈值。
|
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,54 @@
|
||||
# 7.5:实战案例
|
||||
|
||||
### 鸢尾花数据
|
||||
|
||||
本次我们使用的仍然是鸢尾花数据,不过为了能够进行可视化我们只使用数据中的两个特征:
|
||||
|
||||
```python
|
||||
from sklearn.datasets import load_iris
|
||||
|
||||
iris = load_iris()
|
||||
x,y = iris.data,iris.target
|
||||
x = x[:,2:]
|
||||
```
|
||||
|
||||
可视化数据分布:
|
||||
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
plt.scatter(x[:,0],x[:,1])
|
||||
plt.show()
|
||||
```
|
||||
|
||||
可视化结果:
|
||||
|
||||
![k-means](k-means.jpg)
|
||||
|
||||
我们可以先根据数据的真实标签查看数据类别情况:
|
||||
|
||||
```python
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
plt.scatter(x[:,0],x[:,1],c=y)
|
||||
plt.show()
|
||||
```
|
||||
|
||||
效果如下:
|
||||
|
||||
![kmeans1](kmeans1.jpg)
|
||||
|
||||
### 进行聚类
|
||||
|
||||
最后,使用我们实现的`k-means`方法对数据进行聚类并查看聚类效果:
|
||||
|
||||
```python
|
||||
predict = predict(3,x,500,0.0001)
|
||||
|
||||
plt.scatter(x[:,0],x[:,1],c=predict)
|
||||
plt.show()
|
||||
```
|
||||
|
||||
![kmeans2](kmeans2.jpg)
|
||||
|
||||
可以发现,使用实现的方法进行聚类的结果与真实情况非常吻合。
|
@ -0,0 +1,2 @@
|
||||
# 8.2:Apriori算法原理
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 8.1:Apriori算法思想
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 8.3:Apriori算法流程
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第八章 Apriori
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 8.4:动手实现Apriori
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 8.5:实战案例
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 9.2:PageRank算法原理
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 9.1:PageRank算法思想
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 9.3:PageRank算法流程
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第九章 PageRank
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 9.4:动手实现PageRank
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 9.5:实战案例
|
||||
|
@ -0,0 +1,64 @@
|
||||
# Summary
|
||||
|
||||
* [前言](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)
|
||||
* [第三章 数据预处理](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)
|
||||
* [第四章 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)
|
||||
* [第五章 线性回归](Chapter5/README.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)
|
||||
* [第七章 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)
|
||||
* [第八章 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)
|
||||
* [第九章 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)
|
||||
* [第十章 推荐系统](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)
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第一章 绪论
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 1.1:为什么要数据挖掘
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 1.2: 什么是数据挖掘
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 1.3:数据挖掘主要任务
|
||||
|
@ -0,0 +1,2 @@
|
||||
# 第十章 推荐系统
|
||||
|