更新了机器学习部分文档

This commit is contained in:
jackfrued 2025-02-13 14:54:23 +08:00
parent 36d4f27f3c
commit da60fd3c31
6 changed files with 30 additions and 31 deletions

View File

@ -17,7 +17,7 @@ Python 语言支持很多种运算符,下面的表格按照运算符的优先
| `is`、`is not` | 身份运算符 |
| `in`、`not in` | 成员运算符 |
| `not`、`or`、`and` | 逻辑运算符 |
| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |
| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`\|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |
>**说明** 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号(小括号)来确保运算的执行顺序。

View File

@ -158,7 +158,7 @@ bmi = 16.3
你的体重过轻!
```
### 使用math和case构造分支结构
### 使用match和case构造分支结构
Python 3.10 中增加了一种新的构造分支结构的方式,通过使用`match`和`case` 关键字我们可以轻松的构造出多分支结构。Python 的官方文档在介绍这个新语法时,举了一个 HTTP 响应状态码识别的例子,非常有意思。如果不知道什么是 HTTP 响应状态吗,可以看看 MDN 上面的[文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status)。下面我们对官方文档上的示例稍作修改,为大家讲解这个语法,先看看下面用`if-else`结构实现的代码。

View File

@ -8,20 +8,20 @@
$$
P(A|B) = \frac{P(B|A)}{P(B)} \cdot P(A)
$$
其中,$\small{P(A)}$是事件$\small{A}$发生的**先验概率**,我们可以理解为已知事实或主观经验(**主观概率**$\small{P(B|A)}$是在事件$\small{A}$发生的条件下事件$\small{B}$发生的 条件概率,通常也称之为**似然性**likelihood$\small{P(B)}$是事件$\small{B}$发生的(全)概率,这两个概率可以通过我们收集到的样本数据(证据)获得;$\small{P(A|B)}$是在事件$\small{B}$发生的条件下事件$\small{A}$发生的条件概率,即收集到样本数据后对事件$\small{A}$发生概率的重新认知,称之为**后验概率**。贝叶斯定理告诉我们一个重要的事实:可以从已知的事实或主观经验出发,通过收集到的证据来更新我们对某个事件发生概率的认知,简单的说就是**可以通过已知的事实和收集的证据来推断出未知的真相**。
其中, $\small{P(A)}$ 是事件 $\small{A}$ 发生的**先验概率**,我们可以理解为已知事实或主观经验(**主观概率** $\small{P(B|A)}$ 是在事件 $\small{A}$ 发生的条件下事件 $\small{B}$ 发生的 条件概率,通常也称之为**似然性**likelihood $\small{P(B)}$ 是事件 $\small{B}$ 发生的(全)概率,这两个概率可以通过我们收集到的样本数据(证据)获得; $\small{P(A|B)}$ 是在事件 $\small{B}$ 发生的条件下事件 $\small{A}$ 发生的条件概率,即收集到样本数据后对事件 $\small{A}$ 发生概率的重新认知,称之为**后验概率**。贝叶斯定理告诉我们一个重要的事实:可以从已知的事实或主观经验出发,通过收集到的证据来更新我们对某个事件发生概率的认知,简单的说就是**可以通过已知的事实和收集的证据来推断出未知的真相**。
回到上面李女士购买飞机延误险的例子假设本次航班是从成都双流国际机场飞往北京首都国际机场执飞的航空公司是四川航空起飞地天气为雨天小雨温度为8°C东北风2级降落地天气为晴天温度4°C西北风2级。为了更简单的让大家理解贝叶斯定理我们对这里的条件稍作简化只保留天气中的降水信息暂不考虑温度和风速等其他因素对应到上面的贝叶斯定理有
$$
P(延误|起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航) = \\
\frac{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误)}{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航)} \cdot P(延误)
$$
上面公式等号左边就是李女士想知道的当前航班延误的概率,等号右边的部分其实就是历史数据和当前信息,计算这个概率的关键在于计算出似然性,即$\small{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误)}$到底是多少,那么这个条件概率又该如何计算呢?
上面公式等号左边就是李女士想知道的当前航班延误的概率,等号右边的部分其实就是历史数据和当前信息,计算这个概率的关键在于计算出似然性,即 $\small{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误)}$ 到底是多少,那么这个条件概率又该如何计算呢?
### 朴素贝叶斯
朴素贝叶斯算法是基于贝叶斯定理和特征条件独立性假设的分类算法,因其简单高效而受到广泛应用。朴素贝叶斯算法的关键在于“朴素”二字,就是刚才我们说到特征条件独立性假设,条件独立性假设是说用于分类的特征在类确定的条件下都是独立的,该假设使得朴素贝叶斯的学习成为可能。
假设我们有一个特征集合$\small{X = \{x_1, x_2, \ldots, x_n\}}$和一个类别$\small{C}$,朴素贝叶斯算法假设:
假设我们有一个特征集合 $\small{X = \{x_1, x_2, \ldots, x_n\}}$ 和一个类别 $\small{C}$ ,朴素贝叶斯算法假设:
$$
P(X|C) = P(x_1|C) \cdot P(x_2|C) \cdot \ldots \cdot P(x_n|C)
@ -43,22 +43,22 @@ $$
$$
P(C_{i}) = \frac{n_{i}}{n}
$$
其中,$\small{C_{i}}$表示类别,$\small{n_{i}}$是类别$\small{C_{i}}$的样本数量,$\small{n}$是总的样本容量。
其中, $\small{C_{i}}$ 表示类别, $\small{n_{i}}$ 是类别 $\small{C_{i}}$ 的样本数量, $\small{n}$ 是总的样本容量。
2. **计算条件概率**
$$
P(x_{j}|C_{i}) = \frac{n_{i,j}}{n_{i}}
$$
其中,$\small{n_{i,j}}$是在类别$\small{C_{i}}$中,特征$\small{x_{j}}$出现的次数。
其中, $\small{n_{i,j}}$ 是在类别 $\small{C_{i}}$ 中,特征 $\small{x_{j}}$ 出现的次数。
#### 预测阶段
在预测阶段,给定一个待分类样本$\small{X}$,朴素贝叶斯算法通过以下步骤来计算其属于每个类别的后验概率:
在预测阶段,给定一个待分类样本 $\small{X}$ ,朴素贝叶斯算法通过以下步骤来计算其属于每个类别的后验概率:
$$
P(C_{i}|X) = \frac{P(X|C_{i})}{P(X)} \cdot P(C_{i})
$$
上面的公式中,$\small{P(X)}$对应到每个类别都是一个常量,可以忽略掉它,再结合独立性假设有:
上面的公式中, $\small{P(X)}$ 对应到每个类别都是一个常量,可以忽略掉它,再结合独立性假设有:
$$
P(C_{i}|X) \propto P(C_{i}) \cdot P(x_1|C_{i}) \cdot P(x_2|C_{i}) \cdot \ldots \cdot P(x_n|C_{i})
$$
@ -110,7 +110,7 @@ def naive_bayes_fit(X, y):
return prior_probs, likelihoods
```
调用上面的函数,我们可以得到一个二元组,解包之后分别是类别标签$\small{C_{i}}$对应的先验概率和在类别$\small{C_{i}}$中,第$\small{j}$个特征取到某个值`value`(上面的代码中,我们用 pandas 的`cut`函数对特征值分箱,`value`的取值为`1` 到`5`)的似然性,前者是一个`Series`对象,后者是一个`dict`对象,如下所示:
调用上面的函数,我们可以得到一个二元组,解包之后分别是类别标签 $\small{C_{i}}$ 对应的先验概率和在类别 $\small{C_{i}}$ 中,第 $\small{j}$ 个特征取到某个值`value`(上面的代码中,我们用 pandas 的`cut`函数对特征值分箱,`value`的取值为`1` 到`5`)的似然性,前者是一个`Series`对象,后者是一个`dict`对象,如下所示:
```python
p_ci, p_x_ci = naive_bayes_fit(X_train, y_train)

View File

@ -21,7 +21,7 @@
$$
y = \beta_0 + \beta_1 x + \varepsilon
$$
其中,$\small{y}$ 是目标变量(因变量),$\small{x}$ 是输入变量(自变量),$\small{\beta_{0}}$ 是截距,表示$\small{x=0}$ 时的预测值,$\small{\beta_{1}}$ 是回归系数(斜率),表示输入变量对输出变量影响的大小,$\small{\varepsilon}$ 是误差项,用于表示数据中的随机噪声或无法解释的部分。
其中, $\small{y}$ 是目标变量(因变量), $\small{x}$ 是输入变量(自变量), $\small{\beta_{0}}$ 是截距,表示 $\small{x=0}$ 时的预测值, $\small{\beta_{1}}$ 是回归系数(斜率),表示输入变量对输出变量影响的大小, $\small{\varepsilon}$ 是误差项,用于表示数据中的随机噪声或无法解释的部分。
- 多元线性回归:建立一个因变量与多个自变量之间线性关系的模型。
$$
@ -31,7 +31,7 @@
$$
y = \mathbf{x}^{T} \mathbf{\beta} + \varepsilon
$$
其中,$\small{\mathbf{x} = [1, x_{1}, x_{2}, \dots, x_{n}]^{T}}$ 是包含截距的输入向量,$\small{\mathbf{\beta} = [\beta_{0}, \beta_{1}, \beta_{2}, \dots, \beta_{n}]^{T}}$ 是模型参数(包括截距 $\small{\beta_{0}}$ 和回归系数 $\small{\beta_{1}, \beta_{2}, \cdots, \beta_{n}}$$\small{\varepsilon}$ 是误差项。
其中, $\small{\mathbf{x} = [1, x_{1}, x_{2}, \dots, x_{n}]^{T}}$ 是包含截距的输入向量, $\small{\mathbf{\beta} = [\beta_{0}, \beta_{1}, \beta_{2}, \dots, \beta_{n}]^{T}}$ 是模型参数(包括截距 $\small{\beta_{0}}$ 和回归系数 $\small{\beta_{1}, \beta_{2}, \cdots, \beta_{n}}$ $\small{\varepsilon}$ 是误差项。
2. **多项式回归**Polynomial Regression引入高阶特征使模型能拟合更复杂的非线性关系属于线性模型的扩展因为因为它对参数 $\small{\beta}$ 的求解仍然是线性形式,如下面所示的二次关系:
$$
@ -42,18 +42,18 @@
4. **岭回归**Ridge Regression、**套索回归**Lasso Regression、**弹性网络回归**Elastic Net Regression在线性回归基础上加入正则化项用于处理过拟合、多重共线性和特征筛选问题。
5. **逻辑回归**Logistic Regression逻辑回归虽然名字中带“回归”但实际上是用于分类问题的模型。它通过 Sigmoid 函数将线性组合的输入值映射到区间$\small{(0, 1)}$,表示分类概率,适用于二分类问题;也可以扩展为 Softmax 回归,解决多分类问题。
5. **逻辑回归**Logistic Regression逻辑回归虽然名字中带“回归”但实际上是用于分类问题的模型。它通过 Sigmoid 函数将线性组合的输入值映射到区间 $\small{(0, 1)}$ ,表示分类概率,适用于二分类问题;也可以扩展为 Softmax 回归,解决多分类问题。
$$
P(y=1|x) = \frac{1}{1 + e^{-(\beta_{0} + \beta_{1} x_{1} + \cdots + \beta_{n} x_{n})}}
$$
### 回归系数的计算
建立回归模型的关键是找到最佳的回归系数 $\small{\mathbf{\beta}}$,所谓最佳回归系数是指让模型对数据的拟合效果达到最好的模型参数,即能够最小化模型的预测值 $\small{\hat{y}_{i}}$ 与实际观测值 $\small{y_{i}}$ 之间差异的模型参数。为此,我们先定义如下所示的损失函数。
建立回归模型的关键是找到最佳的回归系数 $\small{\mathbf{\beta}}$ ,所谓最佳回归系数是指让模型对数据的拟合效果达到最好的模型参数,即能够最小化模型的预测值 $\small{\hat{y}_{i}}$ 与实际观测值 $\small{y_{i}}$ 之间差异的模型参数。为此,我们先定义如下所示的损失函数。
$$
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}
$$
其中,$\small{m}$表示样本容量,代入回归模型,有:
其中, $\small{m}$ 表示样本容量,代入回归模型,有:
$$
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \mathbf{x}_{i}^{T}\mathbf{\beta})^{2}
$$
@ -61,9 +61,9 @@ $$
$$
L(\mathbf{\beta}) = (\mathbf{y} - \mathbf{X\beta})^{T}(\mathbf{y} - \mathbf{X\beta})
$$
其中,$\mathbf{y}$ 是目标值的向量,大小为 $\small{m \times 1}$$\mathbf{X}$ 是特征矩阵,大小为 $\small{m \times n}$$\small{\mathbf{\beta}}$ 是回归系数的向量,大小为 $\small{n \times 1}$。
其中, $\mathbf{y}$ 是目标值的向量,大小为 $\small{m \times 1}$ $\mathbf{X}$ 是特征矩阵,大小为 $\small{m \times n}$ $\small{\mathbf{\beta}}$ 是回归系数的向量,大小为 $\small{n \times 1}$。
通过最小化损失函数 $\small{L(\mathbf{\beta})}$,我们可以得到线性回归模型的解析解。对 $\small{L(\mathbf{\beta})}$ 求导并令其为 0
通过最小化损失函数 $\small{L(\mathbf{\beta})}$ ,我们可以得到线性回归模型的解析解。对 $\small{L(\mathbf{\beta})}$ 求导并令其为 0
$$
\frac{\partial{L(\mathbf{\beta})}}{\partial{\mathbf{\beta}}} = -2\mathbf{X}^{T}(\mathbf{y} - \mathbf{X\beta}) = 0
$$
@ -77,16 +77,16 @@ $$
$$
> **说明**:如果你对这里提到的正则化不理解可以先放放,后面我们再来讨论这个问题。
上述方法适用于小规模数据集,当数据体量不大(样本和特征数量较少)时,计算效率是没有问题的。对于大规模数据集或更为复杂的优化问题,我们可以使用**梯度下降法**,通过迭代更新参数来逐步逼近最优解。梯度下降法的目标也是最小化损失函数,该方法通过计算梯度方向进行参数更新。梯度是一个向量,包含了目标函数在各个参数方向上的偏导数。对于上面的损失函数 $\small{L(\mathbf{\beta})}$,梯度可以表示为:
上述方法适用于小规模数据集,当数据体量不大(样本和特征数量较少)时,计算效率是没有问题的。对于大规模数据集或更为复杂的优化问题,我们可以使用**梯度下降法**,通过迭代更新参数来逐步逼近最优解。梯度下降法的目标也是最小化损失函数,该方法通过计算梯度方向进行参数更新。梯度是一个向量,包含了目标函数在各个参数方向上的偏导数。对于上面的损失函数 $\small{L(\mathbf{\beta})}$ ,梯度可以表示为:
$$
\nabla L(\mathbf{\beta}) = \left[ \frac{\partial{L}}{\partial{\beta_{1}}}, \frac{\partial{L}}{\partial{\beta_{2}}}, \cdots, \frac{\partial{L}}{\partial{\beta_{n}}} \right]
$$
梯度下降法通过以下更新规则来更新参数 $\small{\mathbf{\beta}}$
梯度下降法通过以下更新规则来更新参数 $\small{\mathbf{\beta}}$
$$
\mathbf{\beta}^{\prime} = \mathbf{\beta} - \alpha \nabla L(\mathbf{\beta}) \\
\mathbf{\beta} = \mathbf{\beta^{\prime}}
$$
其中,$\small{\alpha}$ 是学习率step size通常是一个较小的正数用于控制每次更新的幅度。如果学习率 $\small{\alpha}$ 选择得当,梯度下降法将收敛到目标函数的局部最小值。如果学习率过大,可能导致震荡不收敛;如果学习率过小,则收敛的速度缓慢,需要更多次的迭代。
其中, $\small{\alpha}$ 是学习率step size通常是一个较小的正数用于控制每次更新的幅度。如果学习率 $\small{\alpha}$ 选择得当,梯度下降法将收敛到目标函数的局部最小值。如果学习率过大,可能导致震荡不收敛;如果学习率过小,则收敛的速度缓慢,需要更多次的迭代。
### 新数据集介绍
@ -249,15 +249,15 @@ print('截距:', model.intercept_)
\text{MAE} = \frac{1}{m} \sum_{i=1}^{m}|y_{i} - \hat{y}_{i}|
$$
4. 决定系数R-Squared, $\small{R^2}$)。$\small{R^2}$ 是一个相对指标,用于衡量模型对数据的拟合程度,其值越接近 1 越好。$\small{R^2}$ 的计算公式为:
4. 决定系数R-Squared, $\small{R^2}$)。 $\small{R^2}$ 是一个相对指标,用于衡量模型对数据的拟合程度,其值越接近 1 越好。 $\small{R^2}$ 的计算公式为:
$$
R^{2} = 1 - \frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}
$$
其中,$\small{\text{SS}_{\text{res}} = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^2}$ 为残差平方和,$\small{\text{SS}_{\text{tot}} = \sum_{i=1}^{m} (y_{i} - \bar{y})^{2}}$ 为总平方和,如下图所示。下图左边红色正方形的面积之和代表总平方和,右边蓝色正方形的面积之和代表残差的平方和,很显然,模型拟合的效果越好,$\small{\frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}}$的值就越接近 0$\small{R^{2}}$的值就越接近 1。通常$\small{R^{2} \ge 0.8}$时,我们认为模型的拟合效果已经很不错了。
其中, $\small{\text{SS}_{\text{res}} = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^2}$ 为残差平方和, $\small{\text{SS}_{\text{tot}} = \sum_{i=1}^{m} (y_{i} - \bar{y})^{2}}$ 为总平方和,如下图所示。下图左边红色正方形的面积之和代表总平方和,右边蓝色正方形的面积之和代表残差的平方和,很显然,模型拟合的效果越好, $\small{\frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}}$ 的值就越接近 0 $\small{R^{2}}$ 的值就越接近 1。通常 $\small{R^{2} \ge 0.8}$ 时,我们认为模型的拟合效果已经很不错了。
<img src="res/05_regression_r2.png" style="zoom:40%;">
可以使用 scikit-learn 中封装好的函数计算出均方误差、平均绝对误差和$\small{R^{2}}$的值,代码如下所示。
可以使用 scikit-learn 中封装好的函数计算出均方误差、平均绝对误差和 $\small{R^{2}}$ 的值,代码如下所示。
```python
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
@ -285,7 +285,7 @@ print(f'决定系数: {r2:.4f}')
$$
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \lambda \sum_{j=1}^{n}\beta_{j}^{2}
$$
其中,$\small{L2}$ 正则化项 $\small{\lambda \sum_{j=1}^{n} \beta_{j}^{2}}$ 会惩罚较大的回归系数,相当于缩小了回归系数的大小,但不会使系数为 0即不会进行特征选择。可以通过 scikit-learn 库`linear_model`模块的`Ridge`类实现岭回归,代码如下所示。
其中, $\small{L2}$ 正则化项 $\small{\lambda \sum_{j=1}^{n} \beta_{j}^{2}}$ 会惩罚较大的回归系数,相当于缩小了回归系数的大小,但不会使系数为 0即不会进行特征选择。可以通过 scikit-learn 库`linear_model`模块的`Ridge`类实现岭回归,代码如下所示。
```python
from sklearn.linear_model import Ridge
@ -315,7 +315,7 @@ print(f'决定系数: {r2:.4f}')
$$
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \lambda \sum_{j=1}^{n}|\beta_{j}|
$$
其中,$\small{L1}$ 正则化项 $\small{\lambda \sum_{j=1}^{n}|\beta_{j}|}$ 会将某些不重要的回归系数缩减为 0从而实现特征选择。可以通过 scikit-learn 库`linear_model`模块的`Lasso`类实现套索回归,代码如下所示。
其中, $\small{L1}$ 正则化项 $\small{\lambda \sum_{j=1}^{n}|\beta_{j}|}$ 会将某些不重要的回归系数缩减为 0从而实现特征选择。可以通过 scikit-learn 库`linear_model`模块的`Lasso`类实现套索回归,代码如下所示。
```python
from sklearn.linear_model import Lasso
@ -347,7 +347,7 @@ print(f'决定系数: {r2:.4f}')
$$
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \alpha \lambda \sum_{j=1}^{n}|\beta_{j}| + (1 - \alpha) \lambda \sum_{j=1}^{n}\beta_{j}^{2}
$$
其中,$\small{\alpha}$ 是控制 $\small{L1}$ 和 $\small{L2}$ 正则化的权重比例。
其中, $\small{\alpha}$ 是控制 $\small{L1}$ 和 $\small{L2}$ 正则化的权重比例。
### 线性回归另一种实现
@ -463,7 +463,7 @@ print(f'决定系数: {r2:.4f}')
Scikit-learn 库`preprocessing`模块中的`PolynomialFeatures`类可以将原始特征扩展为多项式特征,从而将线性模型转换为具有高次项的模型。创建`PolynomialFeatures`对象时有几个重要的参数:
1. `degree`:设置多项式的最高次项。例如,`degree=3` 会生成包含一次项、二次项和三次项的特征。
2. `interaction_only`:默认值为`False`,如果设置为`True`,则只生成交互项(如$\small{x_{1}x_{2}}$),不生成单独的高次项(如$\small{x_{1}^{2}}$、$\small{x_{2}^{2}}$)。
2. `interaction_only`:默认值为`False`,如果设置为`True`,则只生成交互项(如 $\small{x_{1}x_{2}}$ ),不生成单独的高次项(如 $\small{x_{1}^{2}}$ $\small{x_{2}^{2}}$ )。
3. `include_bias`:默认值为`True`,表示包括常数项(通常为 1设置为`False`则不包括常数项。
下面我们通过代码来演示如何通过`PolynomialFeatures`类进行特征预处理,实现多项式回归。

View File

@ -26,9 +26,9 @@
$$
J = \sum_{i=1}^{K} \sum_{x \in C_{i}} {\lVert x - \mu_{i} \rVert}^{2}
$$
其中,$\small{K}$是簇的数量,$\small{C_{i}}$表示第$\small{i}$个簇中的样本集合,$\small{\mu_{i}}$是第$\small{i}$个簇的中心,$\small{x}$是数据点。因为这个问题属于 NP 困难组合优化问题,所以在实际求解时我们会采用迭代的方式来寻求满意解。
其中, $\small{K}$ 是簇的数量, $\small{C_{i}}$ 表示第 $\small{i}$ 个簇中的样本集合, $\small{\mu_{i}}$ 是第 $\small{i}$ 个簇的中心, $\small{x}$ 是数据点。因为这个问题属于 NP 困难组合优化问题,所以在实际求解时我们会采用迭代的方式来寻求满意解。
首先随机选择$\small{K}$个点作为初始质心 $\small{\mu_{1}, \mu_{2}, \cdots, \mu_{K}}$,对于每个数据点$\small{x_{j}}$,计算到每个质心的距离,选择距离最近的质心,即:
首先随机选择 $\small{K}$ 个点作为初始质心 $\small{\mu_{1}, \mu_{2}, \cdots, \mu_{K}}$ ,对于每个数据点 $\small{x_{j}}$ ,计算到每个质心的距离,选择距离最近的质心,即:
$$
C_{i} = \lbrace {x_{j} \ | \ {\lVert x_{j} - \mu_{i} \rVert}^{2} \le {\lVert x_{j} - \mu_{k} \rVert}^{2} \ \text{for all} \ k \ne i} \rbrace
@ -188,7 +188,7 @@ print(km_cluster.inertia_) # 样本到质心的距离平方和
1. `n_clusters`:指定聚类的簇数,即$\small{K}$值,默认值为`8`。
2. `max_iter`:最大迭代次数,默认值为`300`,控制每次初始化中 K-Means 迭代的最大步数。
3. `init`:初始化质心的方法,默认值为`'k-means++'`,表示从数据中**多次**随机选取 K 个质心,每次都计算这一次选中的中心点之间的距离,然后取距离最大的一组作为初始化中心点,推荐大家使用这个值;如果设置为`'random'`则随机选择初始质心。
3. `init`:初始化质心的方法,默认值为`'k-means++'`,表示从数据中多次随机选取 K 个质心,每次都计算这一次选中的中心点之间的距离,然后取距离最大的一组作为初始化中心点,推荐大家使用这个值;如果设置为`'random'`则随机选择初始质心。
4. `n_init`:和上面的参数配合,指定算法运行的初始化次数,默认值为`10`。
5. `algorithm`K-Means 的计算算法,默认值为`'lloyd'`。还有一个可选的值为`'elkan'`,表示基于三角不等式的优化算法,适用于 K 值较大的情况,计算效率较高。
6. `tol`:容忍度,控制算法的收敛精度,默认值为`1e-4`。如果数据集较大时,可适当增大此值以加快收敛速度。

View File

@ -143,4 +143,3 @@
1. 在朋友的建议下给首页加了一个打赏的二维码看看有多少愿意为知识付费。今天一共收到了7位小伙伴的打赏在此表示感谢打赏获得的收入将通过腾讯公益平台全部捐出。
2. Django部分第41天到第55天更新到第47天最新上线的部分包括报表、日志、ORM查询优化以及中间件相关的内容并将投票应用的完成代码同步到github。