自然语言处理与机器学习中的数据统计知识
在自然语言处理(NLP)和机器学习领域,数据处理和统计是非常重要的基础。下面将详细介绍一些关键的概念和技术。
1. 降维算法
降维算法主要分为线性降维和非线性降维。
-
线性降维(PCA)
:基于线性变换的定义,主成分分析(PCA)是一种线性降维算法。线性降维涉及计算特征的线性组合或执行线性变换。例如,假设有一组正交向量 ${v_1, v_2, \cdots, v_n}$ 构成 $n$ 维向量空间 $V$ 的一个基,$M$ 是一个 $n\times n$ 的非奇异矩阵(行列式不为零),那么 ${Mv_1, Mv_2, \cdots, Mv_n}$ 就是基 $B$ 的一个线性变换,且同样张成向量空间 $V$。
-
非线性降维(Kernel PCA)
:非线性降维技术执行非线性变换。通常可分为两类:
- 提供高维到低维映射(或反之)的非线性技术。
- 提供可视化的非线性技术。映射方法用于执行初始特征提取步骤,之后机器学习算法可以进行模式识别;而提供可视化的非线性技术则涉及对象之间距离的计算。
2. 距离度量类型
不同的降维技术可能使用不同的距离度量。
-
物理距离度量
-
欧几里得距离
:基于勾股定理,线性降维技术常使用该度量。欧几里得算法还遵循三角形不等式,即在欧几里得平面中,任意三角形任意两边长度之和必须大于第三边的长度。
-
曼哈顿距离
:也称为“出租车”度量。在矩形网格中,给定两点 $A$ 和 $B$,曼哈顿距离通过计算从 $A$ 到 $B$ 必须穿越的“街区”数量来计算两点之间的距离。例如,在矩形网格中向北移动两个街区,然后向东移动三个街区,曼哈顿距离就是 5。
-
切比雪夫距离
:在某些特定场景下使用。
-
编辑距离度量
-
汉明距离
:用于衡量两个等长字符串之间对应位置不同字符的数量。
-
Jaro - Winkler 距离
:常用于字符串相似度的度量。
-
李距离
:在编码理论等领域有应用。
-
莱文斯坦距离
:计算将一个字符串转换为另一个字符串所需的最少编辑操作(插入、删除、替换)次数。
-
马氏距离
:基于一个有趣的思想,给定一个点 $P$ 和一个概率分布 $D$,该度量衡量点 $P$ 与分布 $D$ 之间的标准差数量。更多信息可参考:https://en.wikipedia.org/wiki/Mahalanobis_distance
-
瓦瑟斯坦距离
:也称为“推土机距离”,用于衡量在度量空间 $X$ 上两个概率分布之间的距离。它表示将一堆土移动到另一堆土上的最小成本。与 KL 散度有一些表面上的相似之处,但有重要区别:
- 瓦瑟斯坦距离是一个度量,具有对称性,并且满足三角形不等式。
- KL 散度不是一个度量(是一个散度),不具有对称性($KL(P,Q) \neq KL(Q,P)$),也不满足三角形不等式。需要注意的是,基于 KL 散度的 JS(Jenson - Shannon)散度是一个真正的度量,这使得它可以与其他度量(如瓦瑟斯坦距离)进行更有意义的比较。
3. 其他知名距离度量
-
皮尔逊相关系数
:皮尔逊相似度是两个向量之间的皮尔逊系数。给定随机变量 $X$ 和 $Y$,设 $std(X)$ 为 $X$ 的标准差,$std(Y)$ 为 $Y$ 的标准差,$cov(X,Y)$ 为 $X$ 和 $Y$ 的协方差,则皮尔逊相关系数 $\rho(X,Y)$ 定义为:
[
\rho(X,Y) = \frac{cov(X,Y)}{std(X) \times std(Y)}
]
需要注意的是,皮尔逊系数仅限于相同类型的项目。更多信息可参考:https://en.wikipedia.org/wiki/Pearson_correlation_coefficient - 杰卡德指数(相似度) :杰卡德相似度基于对物品 $A$ 和 $B$ 都进行了评分的用户数量除以对 $A$ 或 $B$ 进行了评分的用户数量。杰卡德相似度基于句子中的唯一单词,不受重复项的影响,而余弦相似度基于所有单词向量的长度(添加重复项时会改变)。选择余弦相似度还是杰卡德相似度取决于单词重复项是否重要。以下是一个计算两个句子杰卡德相似度的 Python 方法:
def get_jaccard_sim(str1, str2):
set1 = set(str1.split())
set2 = set(str2.split())
set3 = set1.intersection(set2)
# (size of intersection) / (size of union):
return float(len(set3)) / (len(set1) + len(set2) - len(set3))
杰卡德相似度可用于涉及布尔值(如产品购买(真/假))的情况,而不是数值。更多信息可参考:https://en.wikipedia.org/wiki/Jaccard_index
4. 局部敏感哈希(LSH)
哈希算法通常用于创建哈希表,将项目与值关联起来。哈希表的优点是查找项目是否存在的时间是常数。但可能会出现两个项目“碰撞”的情况,即它们占据哈希表中的同一个桶。在这种情况下,一个桶可以由一个项目列表组成,可以在大致常数时间内进行搜索。如果同一个桶中有太多项目,可以选择不同的哈希函数来减少碰撞次数。传统哈希算法的目标是最小化碰撞次数。
而局部敏感哈希(LSH)算法将相似的输入项目哈希到相同的“桶”中。实际上,LSH 的目标是最大化碰撞次数。由于相似的项目最终会在同一个桶中,LSH 对于数据聚类和最近邻搜索很有用。此外,LSH 是一种降维技术,它可以在低维空间中使高维数据点更接近,同时保留这些数据点之间的相对距离。更多细节可参考:https://en.wikipedia.org/wiki/Locality - sensitive_hashing
5. Sklearn 库
Sklearn 是一个非常有用的 Python 库,支持大量的机器学习算法。它支持许多分类算法,如逻辑回归、朴素贝叶斯、决策树、随机森林和支持向量机(SVM)。此外,Sklearn 还提供了各种内置数据集,可以用一行代码轻松访问。
以下是几个使用 Sklearn 的代码示例:
-
加载鸢尾花数据集到 Pandas 数据框(sklearn_iris1.py)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
print("=> iris keys:")
for key in iris.keys():
print(key)
print()
print("=> iris feature names:")
for feature in iris.feature_names:
print(feature)
print()
X = iris.data[:, [2, 3]]
y = iris.target
print('=> Class labels:', np.unique(y))
print()
print("=> target:")
print(iris.target)
print()
print("=> all data:")
print(iris.data)
运行上述代码,将输出数据集的键、特征名称、类别标签、目标值和所有数据。
- 将鸢尾花数据集加载到 Pandas 数据框(pandas_iris1.py)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
print("=> IRIS feature names:")
for feature in iris.feature_names:
print(feature)
print()
# Create a dataframe with the feature variables
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print("=> number of rows:")
print(len(df))
print()
print("=> number of columns:")
print(len(df.columns))
print()
print("=> number of rows and columns:")
print(df.shape)
print()
print("=> number of elements:")
print(df.size)
print()
print("=> IRIS details:")
print(df.info())
print()
print("=> top five rows:")
print(df.head())
print()
X = iris.data[:, [2, 3]]
y = iris.target
print('=> Class labels:', np.unique(y))
运行此代码将输出数据集的特征名称、数据框的行数、列数、元素数量、数据集详细信息、前五行数据和类别标签。
- 使用 Sklearn 进行异常值检测(elliptic_envelope.py)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.covariance import EllipticEnvelope
datapoints = [[-1,1], [1,1], [1,-1], [-1,-1], [2,2]]
columns = ["x", "y"]
index = [0,1,2,3,4]
df = pd.DataFrame(np.array(datapoints), columns=columns, index=index)
# display datapoints in a scatterplot:
plt.scatter(df["x"], df["y"], color = "r")
plt.grid()
data = df[['x', 'y']].values
# the contamination parameter defines the proportion of values
# that will be identified as outliers: values are in [0, 0.5]
model1 = EllipticEnvelope(contamination = 0.1)
model1.fit(data)
# new data for prediction:
pred_data = [[3,3], [1.5,1.5], [-2,-2], [-3,-3]]
new_data = np.array(pred_data)
# display new datapoints in a scatterplot:
plt.scatter(new_data[:,0], new_data[:,1], s=100, color = "b")
# predict on new data:
pred1 = model1.predict(new_data)
# negative values are outliers:
print("negative predicted values are outliers:")
print(pred1)
for i in range(new_data.shape[0]):
print("new_data[",i,"] = ",new_data[i],"is an outlier:",pred1[i]==-1)
#plt.show()
运行上述代码,将输出预测结果,负的预测值表示异常值。取消最后一行代码的注释,将显示初始数据点(红色)和测试数据点(蓝色)的散点图。
6. 贝叶斯推断
贝叶斯推断是统计学中的一项重要技术,它涉及统计推断和贝叶斯定理,用于在获得更多信息时更新假设的概率。贝叶斯推断通常被称为“贝叶斯概率”,在序列数据的动态分析中非常重要。
-
贝叶斯定理
给定两个集合 $A$ 和 $B$,定义以下数值(都在 0 到 1 之间):- $P(A)$:属于集合 $A$ 的概率。
- $P(B)$:属于集合 $B$ 的概率。
- $P(Both)$:同时属于 $A$ 和 $B$ 的概率。
- $P(A|B)$:在属于 $B$ 的条件下属于 $A$ 的概率。
-
$P(B|A)$:在属于 $A$ 的条件下属于 $B$ 的概率。
则有以下公式:
[
P(A|B) = \frac{P(Both)}{P(B)} \quad (1)
]
[
P(B|A) = \frac{P(Both)}{P(A)} \quad (2)
]
将上述两个方程两边分别乘以分母,得到:
[
P(B) \times P(A|B) = P(Both) \quad (3)
]
[
P(A) \times P(B|A) = P(Both) \quad (4)
]
令方程 $(3)$ 和 $(4)$ 的左边相等,得到:
[
P(B) \times P(A|B) = P(A) \times P(B|A) \quad (5)
]
将方程 $(5)$ 两边同时除以 $P(B)$,得到著名的贝叶斯公式:
[
P(A|B) = \frac{P(A) \times P(B|A)}{P(B)} \quad (6)
]
-
一些贝叶斯术语
在前面的推导中,我们得到了以下关系:
[
P(h|d) = \frac{P(d|h) \times P(h)}{P(d)}
]
其中:- 后验概率是 $P(h|d)$,即给定数据 $d$ 时假设 $h$ 的概率。
- $P(d|h)$ 是假设 $h$ 为真时数据 $d$ 的概率。
- 假设 $h$ 的先验概率是 $P(h)$,即假设 $h$ 为真的概率(不考虑数据)。
- $P(d)$ 是数据的概率(不考虑假设)。我们感兴趣的是根据先验概率 $P(h)$、$P(D)$ 和 $P(d|h)$ 计算后验概率 $P(h|d)$。
-
最大后验概率(MAP)
最大后验概率(MAP)假设是具有最高概率的假设,即最大可能的假设。可以表示为:
[
MAP(h) = \max(P(h|d))
]
或者:
[
MAP(h) = \max\left(\frac{P(d|h) \times P(h)}{P(d)}\right)
]
或者:
[
MAP(h) = \max(P(d|h) \times P(h))
] -
使用贝叶斯定理的原因
贝叶斯定理基于与事件可能相关的条件的先验知识来描述事件的概率。如果我们知道条件概率,就可以使用贝叶斯规则来找出其他相关概率。
综上所述,这些概念和技术在自然语言处理和机器学习中起着至关重要的作用,通过合理运用它们,可以更好地处理数据、进行模型训练和预测。
自然语言处理与机器学习中的数据统计知识(续)
7. 各种概念和技术的应用场景总结
在实际的自然语言处理和机器学习任务中,前面介绍的各种概念和技术都有其特定的应用场景,下面通过表格的形式进行总结:
| 概念/技术 | 应用场景 |
| — | — |
| 线性降维(PCA) | 当数据具有线性结构,需要减少特征维度以降低计算复杂度、去除噪声时使用。例如在图像识别中,对图像的特征进行降维处理。 |
| 非线性降维(Kernel PCA) | 处理具有非线性结构的数据,如复杂的生物数据、金融市场数据等,用于特征提取和可视化。 |
| 欧几里得距离 | 在许多传统的机器学习算法中广泛使用,如 K - 近邻算法,用于衡量样本之间的距离。 |
| 曼哈顿距离 | 在路径规划、网格地图等场景中应用较多,例如计算城市中两点之间的最短路径。 |
| 切比雪夫距离 | 在国际象棋等棋盘游戏中,用于衡量棋子之间的移动距离。 |
| 汉明距离 | 常用于数据传输中的错误检测和纠正,以及基因序列的比对。 |
| 杰卡德指数(相似度) | 在文本分类、推荐系统中,处理文本数据时,当关注的是文本中唯一单词的重叠情况时使用。 |
| 余弦相似度 | 在信息检索、文本相似度计算中,用于比较文档或向量之间的相似度。 |
| 局部敏感哈希(LSH) | 在大规模数据的聚类和最近邻搜索中,如搜索引擎中的网页聚类、图像检索等。 |
| Sklearn 库 | 适用于各种机器学习任务,包括分类、回归、聚类等,能够快速实现各种算法和处理数据集。 |
| 贝叶斯推断 | 在垃圾邮件过滤、文本分类、概率预测等领域,利用先验知识和新数据更新假设的概率。 |
8. 不同距离度量之间的对比分析
为了更直观地了解不同距离度量的特点,下面通过一个表格对几种常见的距离度量进行对比分析:
| 距离度量 | 公式 | 特点 | 应用场景 |
| — | — | — | — |
| 欧几里得距离 | (d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2}) | 基于空间中的直线距离,直观易懂,对数据的尺度敏感。 | 大多数传统机器学习算法,如 K - 近邻、聚类算法。 |
| 曼哈顿距离 | (d(x,y)=\sum_{i = 1}^{n}\vert x_i - y_i\vert) | 计算简单,考虑了坐标轴方向的移动距离。 | 路径规划、网格数据处理。 |
| 切比雪夫距离 | (d(x,y)=\max_{i}\vert x_i - y_i\vert) | 衡量的是两个点在各个维度上的最大差异。 | 棋盘游戏、图像处理中的像素距离。 |
| 汉明距离 | (d(x,y)=\sum_{i = 1}^{n}[x_i\neq y_i]) | 仅适用于离散数据,计算两个等长字符串对应位置不同字符的数量。 | 数据传输错误检测、基因序列比对。 |
| 杰卡德相似度 | (J(A,B)=\frac{\vert A\cap B\vert}{\vert A\cup B\vert}) | 关注集合元素的交集和并集,不受重复元素的影响。 | 文本分类、推荐系统中的用户兴趣匹配。 |
| 余弦相似度 | (\cos(\theta)=\frac{\mathbf{x}\cdot\mathbf{y}}{\vert\mathbf{x}\vert\vert\mathbf{y}\vert}) | 衡量两个向量的夹角,对向量的方向敏感,不受向量长度的影响。 | 信息检索、文本相似度计算。 |
9. 利用 Sklearn 进行机器学习任务的流程
下面通过 mermaid 格式的流程图展示利用 Sklearn 进行机器学习任务的一般流程:
graph LR
A[数据准备] --> B[数据加载]
B --> C[数据预处理]
C --> D[特征选择与降维]
D --> E[模型选择与训练]
E --> F[模型评估]
F --> G{是否满足要求}
G -- 是 --> H[模型应用]
G -- 否 --> I[调整参数或更换模型]
I --> E
具体步骤如下:
1.
数据准备
:收集和整理相关的数据,确保数据的质量和完整性。
2.
数据加载
:使用 Sklearn 提供的内置数据集或加载自己的数据集,如前面提到的鸢尾花数据集。
3.
数据预处理
:对数据进行清洗、归一化、编码等操作,以提高模型的性能。
4.
特征选择与降维
:根据数据的特点和任务需求,选择合适的特征,并进行降维处理,如使用 PCA 或 LSH。
5.
模型选择与训练
:根据任务的类型(分类、回归、聚类等)选择合适的模型,并使用训练数据对模型进行训练。
6.
模型评估
:使用测试数据对训练好的模型进行评估,选择合适的评估指标,如准确率、召回率、均方误差等。
7.
判断是否满足要求
:根据评估结果判断模型是否满足要求,如果不满足,则调整模型的参数或更换模型。
8.
模型应用
:将训练好的模型应用到实际的任务中,进行预测或分类。
10. 总结与展望
在自然语言处理和机器学习领域,数据处理和统计知识是非常重要的基础。通过对降维算法、距离度量、哈希技术、Sklearn 库以及贝叶斯推断等概念和技术的学习,我们可以更好地处理数据、选择合适的模型和算法,从而提高模型的性能和效率。
未来,随着数据量的不断增加和数据结构的日益复杂,对这些技术的需求也会越来越高。例如,在处理大规模的文本数据时,需要更高效的降维算法和相似度计算方法;在实时数据处理中,需要更快的哈希技术和模型训练方法。同时,随着深度学习的发展,如何将这些传统的统计技术与深度学习模型相结合,也是一个值得研究的方向。
总之,不断学习和掌握这些数据处理和统计知识,将有助于我们在自然语言处理和机器学习领域取得更好的成果。
超级会员免费看

被折叠的 条评论
为什么被折叠?



