【大数据】机器学习----------降维与度量学习
1. 降维与度量学习概述
降维旨在将高维数据映射到低维空间,同时尽可能保留重要信息,而度量学习旨在学习数据之间的距离度量,以改善学习算法的性能。
2. K近邻学习(K-Nearest Neighbors, KNN)
2.1 基本概念
- KNN是一种基于实例的学习算法,对于一个新的数据点,根据其最近的(k)个邻居的类别来确定该点的类别(分类)或根据其最近的(k)个邻居的属性计算该点的属性(回归)。
2.2 数学公式
- 对于分类:
,其中(N_k(x))是(x)的(k)个最近邻居,(y_i)是邻居(x_i)的类别,(I)是指示函数。
2.3 代码示例(使用 Python 和 scikit-learn
)
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 预测
y_pred = knn.predict(X_test)
# 计算准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
3. 低维嵌入
3.1 基本概念
- 将高维数据映射到低维空间,保持数据的某些特性,如局部结构或全局结构。
4. 主成分分析(Principal Component Analysis, PCA)
4.1 基本概念
- 找到数据的主成分,即数据方差最大的方向,将数据投影到这些方向上,实现降维。
4.2 数学公式
- 数据矩阵(X)的协方差矩阵!在这里插入图片描述
。 - 对(C)进行特征分解!在这里插入图片描述
,其中(U)是特征向量矩阵,(\Lambda)是特征值对角矩阵。 - 选择前(k)个最大特征值对应的特征向量(U_k),降维后的数据!在这里插入图片描述
4.3 代码示例(使用 Python 和 scikit-learn
)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 生成数据
np.random.seed(42)
X = np.random.randn(100, 5)
# PCA 降维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
# 可视化结果
plt.scatter(X_reduced[:, 0], X_reduced[:, 1])
plt.show()
5. 核化线性降维
5.1 基本概念
- 将数据映射到高维空间,然后在高维空间进行线性降维,通常使用核技巧避免显式计算高维映射。
5.2 数学公式
- 核矩阵(K):
,其中(\varphi)是核函数。
5.3 代码示例(使用 Python 和 scikit-learn
)
from sklearn.decomposition import KernelPCA
# 生成数据
np.random.seed(42)
X = np.random.randn(100, 5)
# 核 PCA 降维
kpca = KernelPCA(n_components=2, kernel='rbf')
X_reduced = kpca.fit_transform(X)
# 可视化结果
plt.scatter(X_reduced[:, 0], X_reduced[:, 1])
plt.show()
6. 流形学习
6.1 基本概念
- 假设数据位于一个低维流形上,通过保持流形的局部结构将高维数据映射到低维空间。
6.2 代码示例(使用 Python 和 scikit-learn
)
from sklearn.datasets import make_swiss_roll
from sklearn.manifold import Isomap
# 生成瑞士卷数据
X, color = make_swiss_roll(n_samples=1000, random_state=42)
# Isomap 流形学习
isomap = Isomap(n_neighbors=10, n_components=2)
X_reduced = isomap.fit_transform(X)
# 可视化结果
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=color)
plt.show()
7. 度量学习
7.1 基本概念
- 学习一个距离度量(d(x,y)),使同类样本之间的距离更近,不同类样本之间的距离更远。
7.2 代码示例(使用 Python 和 scikit-learn
)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from metric_learn import LMNN
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用 LMNN 进行度量学习
lmnn = LMNN(k=3, learn_rate=1e-3)
lmnn.fit(X_train, y_train)
X_train_metric = lmnn.transform(X_train)
X_test_metric = lmnn.transform(X_test)
# 使用 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train_metric, y_train)
# 预测
y_pred = knn.predict(X_test_metric)
# 计算准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
代码解释
KNN 代码解释:
datasets.load_iris()
:加载鸢尾花数据集。train_test_split
:划分训练集和测试集。KNeighborsClassifier
:创建 KNN 分类器,设置邻居数量。knn.fit(X_train, y_train)
:训练 KNN 分类器。knn.predict(X_test)
:对测试集进行预测。
PCA 代码解释:
np.random.randn
:生成随机数据。PCA(n_components=2)
:创建 PCA 降维器,设置降维后的维度。pca.fit_transform(X)
:对数据进行降维。
核化线性降维(Kernel PCA)代码解释:
KernelPCA
:创建核 PCA 降维器,设置降维后的维度和核函数。kpca.fit_transform(X)
:对数据进行核化降维。
流形学习(Isomap)代码解释:
make_swiss_roll
:生成瑞士卷数据。
Isomap
:创建 Isomap 流形学习器,设置邻居数量和降维后的维度。isomap.fit_transform(X)
:对数据进行流形学习降维。
度量学习代码解释:
load_iris()
:加载鸢尾花数据集。
LMNN
:使用 Large Margin Nearest Neighbor (LMNN) 进行度量学习。lmnn.transform
:将数据转换为新的度量空间。KNeighborsClassifier
:使用 KNN 分类器进行分类。
注意:
- 在使用
metric_learn
库时,你需要先安装该库,可通过pip install metric_learn
进行安装。