K近邻算法(KNN)原理与实战

一、KNN算法核心思想 K近邻(K-Nearest Neighbors)是一种基于实例的监督学习算法,其核心是物以类聚: 通过计算测试样本与训练集中各样本的距离(如欧式距离),选取最近的K个邻居。 根据这K个邻居的类别投票决定测试样本的类别。 二、Python代码示例 from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3) # 训练模型 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) # 预测与评估 accuracy = knn.score(X_test, y_test) print(f"Accuracy: {accuracy:.2f}")

February 20, 2024

深入理解支持向量机(SVM):原理与Python实战

什么是支持向量机? 支持向量机(Support Vector Machine, SVM)是20世纪90年代由Vapnik提出的经典机器学习算法,其核心思想是通过寻找最优超平面来实现数据分类。SVM在解决小样本、非线性及高维模式识别问题中表现出显著优势,广泛应用于文本分类、图像识别和生物信息学等领域。 数学原理剖析 最大间隔分类器 对于线性可分数据,SVM试图找到一个分离超平面: $$ w^Tx + b = 0 $$ 使得所有数据点到该平面的距离最大化。间隔(margin)计算公式为: $$ \frac{2}{|w|} $$ 优化问题 转化为凸二次规划问题: $$ \begin{align*} \min_{w,b} & \quad \frac{1}{2}|w|^2 \ \text{s.t.} & \quad y_i(w^Tx_i + b) \geq 1,\quad \forall i \end{align*} $$ 核技巧 通过核函数将低维不可分数据映射到高维空间: $$ K(x_i,x_j) = \phi(x_i)^T\phi(x_j) $$ 常用核函数包括: 线性核:$K(x_i,x_j) = x_i^Tx_j$ 多项式核:$K(x_i,x_j) = (γx_i^Tx_j + r)^d$ RBF核:$K(x_i,x_j) = \exp(-γ|x_i - x_j|^2)$ Python实战:鸢尾花分类 环境准备 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import accuracy_score 数据准备 # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data[:, [2, 3]] # 使用花瓣长度和宽度 y = iris.target # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42) # 标准化数据 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) 模型训练与评估 创建SVM分类器(使用RBF核) svm = SVC(kernel='rbf', gamma=0.5, C=1.0) svm.fit(X_train, y_train) 预测并评估 y_pred = svm.predict(X_test) print(f"准确率:{accuracy_score(y_test, y_pred):.2%}") 可视化决策边界 def plot_decision_regions(X, y, classifier): h = 0.02 # 网格步长 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) Z = classifier.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k') plt.xlabel('标准化花瓣长度') plt.ylabel('标准化花瓣宽度') plt.title('SVM分类决策边界') plot_decision_regions(X_test, y_test, svm) plt.show() SVM的优缺点分析 优点: 在高维空间中表现优异 ...

September 20, 2023