临沂门户网站制作,什么网站做的好看的,申请域名注册平台,书画院网站建设模板#x1f308;个人主页#xff1a;Sarapines Programmer#x1f525; 系列专栏#xff1a;《人工智能奇遇记》#x1f516;少年有梦不应止于心动#xff0c;更要付诸行动。 目录结构 1. 机器学习之SVM支持向量机概念
1.1 机器学习
1.2 SVM支持向量机
2. SVM支持向量机… 个人主页Sarapines Programmer 系列专栏《人工智能奇遇记》少年有梦不应止于心动更要付诸行动。 目录结构 1. 机器学习之SVM支持向量机概念
1.1 机器学习
1.2 SVM支持向量机
2. SVM支持向量机算法
2.1 实验目的
2.2 实验准备
2.3 实验原理
2.4 实验内容
2.5 实验心得
致读者 1. 机器学习之SVM支持向量机概念
1.1 机器学习 传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而在机器学习的魔法领域我们向计算机系统灌输了海量数据让它在数据的奔流中领悟模式与法则自主演绎未来不再需要手把手的指点迷津。 机器学习犹如三千世界的奇幻之旅分为监督学习、无监督学习和强化学习等多种类型各具神奇魅力。监督学习如大师传道授业算法接收标签的训练数据探索输入与输出的神秘奥秘以精准预测未知之境。无监督学习则是数据丛林的探险者勇闯没有标签的领域寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话智能体通过交互掌握决策之术追求最大化的累积奖赏。 机器学习如涓涓细流渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域它在智慧的浪潮中焕发生机将未来的可能性绘制得更加丰富多彩。 1.2 SVM支持向量机 支持向量机Support Vector Machine简称SVM是一种广泛应用于分类和回归分析的监督学习算法。其基本原理是通过在特征空间中找到一个最优的超平面将不同类别的数据点分隔开。 在二分类问题中SVM的目标是找到一个能够将两类数据点分隔开的超平面使得两侧距离最近的数据点到超平面的距离即间隔最大。这些最靠近超平面的数据点被称为支持向量。超平面的选择不仅要使得间隔最大还要满足不同类别的数据点被正确分类即位于超平面两侧的点应被分到不同的类别。 SVM可以通过核函数来处理非线性问题将数据映射到高维空间从而找到一个在高维空间中的超平面来完成分类。常用的核函数有线性核、多项式核、径向基核等。 SVM在实际应用中表现出色尤其在数据维度较高、样本数量不是很大的情况下。它对于处理线性和非线性问题都有很好的效果是一个强大而灵活的分类算法。 机器学习源文件https://download.csdn.net/download/m0_57532432/88521177?spm1001.2014.3001.5503 2. SVM支持向量机算法
2.1 实验目的
1加深对监督学习的理解和认识
2掌握SVM分类器的设计方法
3通过鸢尾花的花萼sepal和花瓣petal的长和宽建立SVM分类器来判断样本属于山鸢尾Iris Setosa、变色鸢尾Iris Versicolor还是维吉尼亚鸢尾Iris Virginica。 2.2 实验准备
1安装机器学习必要库如NumPy、Pandas、Scikit-learn等
2配置环境用来运行 Python、Jupyter Notebook和相关库等内容。 2.3 实验原理 SVM支持向量机的实验原理基于其在特征空间中找到一个最优的超平面以有效地对数据进行分类。以下是SVM实验的基本原理 数据准备 首先需要一个带标签的训练数据集其中包含了输入特征和相应的类别标签。 超平面的选择 SVM的目标是找到一个超平面能够将不同类别的数据点分隔开并使得两侧最靠近超平面的数据点到超平面的距离最大。这个最优的超平面可以通过求解一个凸优化问题来得到。 间隔最大化 SVM的关键思想是通过间隔最大化来确保分类的鲁棒性。间隔是指超平面两侧距离最近的数据点到超平面的距离。最优的超平面是使得间隔最大的超平面。 支持向量 在最优超平面的两侧存在一些被称为支持向量的数据点。这些支持向量是离超平面最近的数据点它们对于定义最优超平面至关重要。 核函数 SVM可以通过核函数来处理非线性问题。核函数能够将数据映射到更高维的空间使得在这个高维空间中存在一个线性超平面从而在原始空间中完成非线性分类。 训练和预测 通过解决优化问题找到最优超平面的参数。在训练阶段算法学习如何调整超平面的参数以实现最佳的分类。在预测阶段新的数据点通过超平面的位置来进行分类。 SVM的实验原理主要依赖于数学优化的方法通过数学模型和凸优化理论来找到一个最优的决策边界以实现对数据的有效分类。 2.4 实验内容
使用Python手动实现SVM支持向量机代码如下
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_score, recall_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_irisclass SVM:def __init__(self, learning_rate0.0001, lambda_param0.1, num_iterations2000):self.learning_rate learning_rateself.lambda_param lambda_paramself.num_iterations num_iterationsself.W Noneself.b Nonedef fit(self, X, y):y np.where(y 0, -1, 1)n_samples, n_features X.shapeself.W np.zeros(n_features)self.b 0for _ in range(self.num_iterations):for idx, x_i in enumerate(X):condition y[idx] * (np.dot(x_i, self.W) - self.b) 1if condition:self.W - self.learning_rate * (2 * self.lambda_param * self.W)else:self.W - self.learning_rate * (2 * self.lambda_param * self.W - np.dot(x_i, y[idx]))self.b - self.learning_rate * y[idx]def predict(self, X):linear_output np.dot(X, self.W) - self.breturn np.sign(linear_output)1. 导入鸢尾花数据集;
# Step 1: 导入鸢尾花数据集
iris load_iris()
X iris.data
y iris.target2. 数据归一化
# Step 2: 数据归一化
scaler StandardScaler()
X scaler.fit_transform(X)3. 训练集和测试数据集划分;
# Step 3: 训练集和测试数据集划分
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state2022)4. 评价分类结果TP、FN、FP、TN以及精确率和召回率;
# Step 4: 评价分类结果
def evaluate_results(y_true, y_pred):confusion confusion_matrix(y_true, y_pred)tp confusion[1, 1]fn confusion[1, 0]fp confusion[0, 1]tn confusion[0, 0]precision precision_score(y_true, y_pred, averageweighted)recall recall_score(y_true, y_pred, averageweighted)print(Confusion Matrix:)print(confusion)print(True Positives:, tp)print(False Negatives:, fn)print(False Positives:, fp)print(True Negatives:, tn)print(Precision:, precision)print(Recall:, recall)# 创建SVM对象
svm SVM()5. 加入松弛因子后与未加松弛因子之前效果做对比。
# Step 5: 加入松弛因子后的对比
svm_no_slack SVM(lambda_param0.0) # 未加入松弛因子
svm_slack SVM(lambda_param101) # 加入松弛因子# 训练模型未加入松弛因子
svm_no_slack.fit(X_train, y_train)# 预测未加入松弛因子
y_pred_slack svm_no_slack.predict(X_test)# 评价分类结果未加入松弛因子
print(未加入松弛因子)
evaluate_results(y_test, y_pred_slack)# 训练模型加入松弛因子
svm_slack.fit(X_train, y_train)# 预测加入松弛因子
y_pred_slack svm_slack.predict(X_test)# 评价分类结果加入松弛因子
print(加入松弛因子后)
evaluate_results(y_test, y_pred_slack)实验结果
未加入松弛因子 图5-1 加入松弛因子 图5-2
完整代码如下
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_score, recall_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_irisclass SVM:def __init__(self, learning_rate0.0001, lambda_param0.1, num_iterations2000):self.learning_rate learning_rateself.lambda_param lambda_paramself.num_iterations num_iterationsself.W Noneself.b Nonedef fit(self, X, y):y np.where(y 0, -1, 1)n_samples, n_features X.shapeself.W np.zeros(n_features)self.b 0for _ in range(self.num_iterations):for idx, x_i in enumerate(X):condition y[idx] * (np.dot(x_i, self.W) - self.b) 1if condition:self.W - self.learning_rate * (2 * self.lambda_param * self.W)else:self.W - self.learning_rate * (2 * self.lambda_param * self.W - np.dot(x_i, y[idx]))self.b - self.learning_rate * y[idx]def predict(self, X):linear_output np.dot(X, self.W) - self.breturn np.sign(linear_output)# Step 1: 导入鸢尾花数据集
iris load_iris()
X iris.data
y iris.target# Step 2: 数据归一化
scaler StandardScaler()
X scaler.fit_transform(X)# Step 3: 训练集和测试数据集划分
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state2022)# Step 4: 评价分类结果
def evaluate_results(y_true, y_pred):confusion confusion_matrix(y_true, y_pred)tp confusion[1, 1]fn confusion[1, 0]fp confusion[0, 1]tn confusion[0, 0]precision precision_score(y_true, y_pred, averageweighted)recall recall_score(y_true, y_pred, averageweighted)print(Confusion Matrix:)print(confusion)print(True Positives:, tp)print(False Negatives:, fn)print(False Positives:, fp)print(True Negatives:, tn)print(Precision:, precision)print(Recall:, recall)# 创建SVM对象
svm SVM()# Step 5: 加入松弛因子后的对比
svm_no_slack SVM(lambda_param0.0) # 未加入松弛因子
svm_slack SVM(lambda_param101) # 加入松弛因子# 训练模型未加入松弛因子
svm_no_slack.fit(X_train, y_train)# 预测未加入松弛因子
y_pred_slack svm_no_slack.predict(X_test)# 评价分类结果未加入松弛因子
print(未加入松弛因子)
evaluate_results(y_test, y_pred_slack)# 训练模型加入松弛因子
svm_slack.fit(X_train, y_train)# 预测加入松弛因子
y_pred_slack svm_slack.predict(X_test)# 评价分类结果加入松弛因子
print(加入松弛因子后)
evaluate_results(y_test, y_pred_slack)代码分析 1.导入必要的库和模块 numpy用于数值计算的Python库。train_test_split用于将数据集划分为训练集和测试集的函数。confusion_matrix、precision_score、recall_score用于评估分类结果的指标。StandardScaler用于数据归一化的类。load_iris用于加载鸢尾花数据集的函数。 2.定义支持向量机类SVM __init__方法初始化SVM对象的学习率learning_rate、正则化参数lambda_param和迭代次数num_iterations等属性。fit方法用于训练SVM模型。接受特征数据X和标签y作为输入。该方法使用梯度下降法更新模型的权重W和偏置b。predict方法用于预测新的样本。接受特征数据X作为输入通过计算线性输出linear_output并对其进行符号化处理返回预测结果。 3.加载鸢尾花数据集 使用load_iris函数加载鸢尾花数据集将特征数据存储在X中将标签存储在y中。 4.数据归一化 使用StandardScaler类创建一个归一化器对象scaler。调用fit_transform方法对特征数据进行归一化将归一化后的数据保存回X中。 5.训练集和测试数据集划分 使用train_test_split函数将数据集按照指定的比例划分为训练集和测试集。将训练集特征数据存储在X_train中训练集标签存储在y_train中测试集特征数据存储在X_test中测试集标签存储在y_test中。 6.评价分类结果的函数 定义了一个名为evaluate_results的函数用于评估分类结果。接受真实标签y_true和预测标签y_pred作为输入。使用confusion_matrix函数计算混淆矩阵并从中提取真阳性tp、假阴性fn、假阳性fp和真阴性tn的数量。使用precision_score和recall_score函数计算精确率precision和召回率recall。 7.输出混淆矩阵、真阳性、假阴性、假阳性、真阴性、精确率和召回率的结果。 8.创建SVM对象 使用默认参数创建一个SVM对象svm。 9.加入松弛因子后的对比 创建两个SVM对象一个没有加入松弛因子svm_no_slack的对象另一个加入了松弛因子svm_slack的对象。lambda_param参数控制松弛因子的大小0.0表示没有松弛因子101表示加入了较大的松弛因子。 10.训练模型未加入松弛因子 使用训练集数据X_train和y_train调用fit方法训练未加入松弛因子的SVM模型。 11.预测未加入松弛因子 使用测试集数据X_test调用predict方法进行预测将预测结果存储在y_pred_slack中。 12.评价分类结果未加入松弛因子 调用evaluate_results函数传入真实标签y_test和预测标签y_pred_slack输出评价结果。 13.训练模型加入松弛因子 使用训练集数据X_train和y_train调用fit方法训练加入松弛因子的SVM模型。 14.预测加入松弛因子 使用测试集数据X_test调用predict方法进行预测将预测结果存储在y_pred_slack中。 15.评价分类结果加入松弛因子 调用evaluate_results函数传入真实标签y_test和预测标签y_pred_slack输出评价结果。 2.5 实验心得
通过本次支持向量机SVM算法实验我在鸢尾花数据集上进行了分类任务着重比较了加入松弛因子和未加入松弛因子情况下的分类结果并深入研究了支持向量机的原理和参数设置。
支持向量机是用于分类和回归任务的强大算法其核心思想是寻找最优的超平面将不同类别的样本分隔开。在实验中我分别训练了一个未加入松弛因子的SVM模型和一个引入了松弛因子的模型。
松弛因子的引入允许一些样本存在于超平面错误的一侧从而提供一定的容错能力。这种机制使模型更具鲁棒性能够容忍噪声或异常值的存在。通过设置不同的松弛因子参数我探讨了模型的容错程度实验中分别使用了松弛因子参数为0未加入松弛因子和101加入较大松弛因子并采用默认的学习率和迭代次数0.0001和2000对数据进行了归一化处理确保特征具有相似的尺度避免了某些特征对模型训练的主导影响。
在训练集和测试集划分方面我采用了train_test_split函数将数据集按照70%的训练集和30%的测试集进行划分以确保模型在训练和测试阶段具有足够的数据支持。
实验结果显示适度引入松弛因子可以提高模型的鲁棒性使其更好地适应噪声或异常值。选择合适的松弛因子参数根据数据集的特点和任务要求较小的参数适用于清晰数据而较大的参数适用于复杂数据和存在噪声的情况。这次实验使我更深入了解了支持向量机的应用和参数调优。 致读者 风自火出家人君子以言有物而行有恒