传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。 机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。 机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。
支持向量机(Support Vector Machine,简称SVM)是一种广泛应用于分类和回归分析的监督学习算法。其基本原理是通过在特征空间中找到一个最优的超平面,将不同类别的数据点分隔开。 在二分类问题中,SVM的目标是找到一个能够将两类数据点分隔开的超平面,使得两侧距离最近的数据点到超平面的距离(即间隔)最大。这些最靠近超平面的数据点被称为支持向量。超平面的选择不仅要使得间隔最大,还要满足不同类别的数据点被正确分类,即位于超平面两侧的点应被分到不同的类别。 SVM可以通过核函数来处理非线性问题,将数据映射到高维空间,从而找到一个在高维空间中的超平面来完成分类。常用的核函数有线性核、多项式核、径向基核等。 SVM在实际应用中表现出色,尤其在数据维度较高、样本数量不是很大的情况下。它对于处理线性和非线性问题都有很好的效果,是一个强大而灵活的分类算法。
资源获取:关注公众号【科创视野】回复:机器学习实验
(1)加深对监督学习的理解和认识;
(2)掌握SVM分类器的设计方法;
(3)通过鸢尾花的花萼(sepal)和花瓣(petal)的长和宽,建立SVM分类器来判断样本属于山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolor)还是维吉尼亚鸢尾(Iris Virginica)。
(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;
(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。
SVM(支持向量机)的实验原理基于其在特征空间中找到一个最优的超平面,以有效地对数据进行分类。以下是SVM实验的基本原理:
SVM的实验原理主要依赖于数学优化的方法,通过数学模型和凸优化理论来找到一个最优的决策边界,以实现对数据的有效分类。
使用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_iris
class SVM:
def __init__(self, learning_rate=0.0001, lambda_param=0.1, num_iterations=2000):
self.learning_rate = learning_rate
self.lambda_param = lambda_param
self.num_iterations = num_iterations
self.W = None
self.b = None
def fit(self, X, y):
y = np.where(y <= 0, -1, 1)
n_samples, n_features = X.shape
self.W = np.zeros(n_features)
self.b = 0
for _ in range(self.num_iterations):
for idx, x_i in enumerate(X):
condition = y[idx] * (np.dot(x_i, self.W) - self.b) >= 1
if 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.b
return np.sign(linear_output)
1. 导入鸢尾花数据集;
# Step 1: 导入鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
2. 数据归一化
# 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_size=0.3, random_state=2022)
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, average='weighted')
recall = recall_score(y_true, y_pred, average='weighted')
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_param=0.0) # 未加入松弛因子
svm_slack = SVM(lambda_param=101) # 加入松弛因子
# 训练模型(未加入松弛因子)
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
加入松弛因子:
图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_iris
class SVM:
def __init__(self, learning_rate=0.0001, lambda_param=0.1, num_iterations=2000):
self.learning_rate = learning_rate
self.lambda_param = lambda_param
self.num_iterations = num_iterations
self.W = None
self.b = None
def fit(self, X, y):
y = np.where(y <= 0, -1, 1)
n_samples, n_features = X.shape
self.W = np.zeros(n_features)
self.b = 0
for _ in range(self.num_iterations):
for idx, x_i in enumerate(X):
condition = y[idx] * (np.dot(x_i, self.W) - self.b) >= 1
if 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.b
return 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_size=0.3, random_state=2022)
# 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, average='weighted')
recall = recall_score(y_true, y_pred, average='weighted')
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_param=0.0) # 未加入松弛因子
svm_slack = SVM(lambda_param=101) # 加入松弛因子
# 训练模型(未加入松弛因子)
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.导入必要的库和模块
2.定义支持向量机类(SVM)
3.加载鸢尾花数据集
4.数据归一化
5.训练集和测试数据集划分
6.评价分类结果的函数
7.输出混淆矩阵、真阳性、假阴性、假阳性、真阴性、精确率和召回率的结果。 8.创建SVM对象
9.加入松弛因子后的对比
10.训练模型(未加入松弛因子)
11.预测(未加入松弛因子)
12.评价分类结果(未加入松弛因子)
13.训练模型(加入松弛因子)
14.预测(加入松弛因子)
15.评价分类结果(加入松弛因子)
通过本次支持向量机(SVM)算法实验,我在鸢尾花数据集上进行了分类任务,着重比较了加入松弛因子和未加入松弛因子情况下的分类结果,并深入研究了支持向量机的原理和参数设置。
支持向量机是用于分类和回归任务的强大算法,其核心思想是寻找最优的超平面,将不同类别的样本分隔开。在实验中,我分别训练了一个未加入松弛因子的SVM模型和一个引入了松弛因子的模型。
松弛因子的引入允许一些样本存在于超平面错误的一侧,从而提供一定的容错能力。这种机制使模型更具鲁棒性,能够容忍噪声或异常值的存在。通过设置不同的松弛因子参数,我探讨了模型的容错程度,实验中分别使用了松弛因子参数为0(未加入松弛因子)和101(加入较大松弛因子),并采用默认的学习率和迭代次数(0.0001和2000),对数据进行了归一化处理,确保特征具有相似的尺度,避免了某些特征对模型训练的主导影响。
在训练集和测试集划分方面,我采用了train_test_split函数,将数据集按照70%的训练集和30%的测试集进行划分,以确保模型在训练和测试阶段具有足够的数据支持。
实验结果显示,适度引入松弛因子可以提高模型的鲁棒性,使其更好地适应噪声或异常值。选择合适的松弛因子参数根据数据集的特点和任务要求,较小的参数适用于清晰数据,而较大的参数适用于复杂数据和存在噪声的情况。这次实验使我更深入了解了支持向量机的应用和参数调优。