期末复习速成
在进行学习前,我们需要知道一些基础概念(一堆废话)
感知器
在人工智能领域,有一个方法叫机器学习。在机器学习这个方法里,有一类算法叫神经网络。我们将输入数据称之为输入层,在这里我们用 X 来代替输入数据。神经元是将输入数据体征提取进行的计算模型,神经元也叫做感知器。并且,感知器算法也是非常简单的。
那么让我们来康康这个神经元中包含什么。
-
输入:接收来自其他神经元或外部环境的输入信号。
-
权重:每个输入信号都有一个相应的权重,用于调整输入信号对神经元输出的影响。
-
加权和:将输入信号与对应的权重相乘,并对所有加权后的输入信号求和。
-
激活函数:对加权和进行非线性转换,产生神经元的输出结果。
-
偏置:每个神经元都有一个偏置项,它可以调整神经元对输入信号的敏感度。
-
现在让我们进行总结计算公式:
y=f * (w * x +b)
其中y为输出数据,f为激活函数,w为权重,x输入数据,b偏置项
-
介绍这么多感知器知识,跟我们标题有什么联系呢?
那么请出我们今天的主角svm算法
还是先提一手概念:在二分类问题中,SVM将样本点视为特征空间中的向量,并将每个样本点分配给两个不同的类别。
通过上面表述是不是发现一个词 分类,这不得不提一手。SVM(支持向量机)是一种用于分类和回归问题的监督学习算法。监督学习概念不在这赘述。 -
感知器与svm有什么联系
感知器和SVM都是基于线性分类模型,所以他们的计算方法类似,这时候我们应该回到上面康康感知器包含什么了。那么在svm算法中我们的计算方法类似与感知器,但是有一些不同。所以先通过简单的感知器让大家初步理解。 -
接下来进入svm算法计算过程
例:
给定两个向量p={0.9,0.3,0.0}和n={0.1,0.2,0.7},请用SVM的方式拟合出特征集f,并测试向量t={0.7,0.5,0.1}是正样本还是负样本。
要求:
写出整个计算流程
需要经过至少两次迭代,且训练误差应小于等于0.01
- 初始化参数:
学习率:learning_rate = 0.1
最大迭代次数:max_iterations = 2
训练误差阈值:epsilon = 0.01
权重向量:w = [0, 0, 0]
偏置项:b = 0 - 迭代更新参数:
第1次迭代:
计算正样本的预测结果:
y_pred_p = np.dot(w, p) + b
计算负样本的预测结果:
y_pred_n = np.dot(w, n) + b
更新权重向量和偏置项:
w = w + learning_rate * (p - n)
b = b + learning_rate * (np.sum§ - np.sum(n))
计算正样本的间隔:
margin_p = np.maximum(0, 1 - y_pred_p)
计算负样本的间隔:
margin_n = np.maximum(0, 1 + y_pred_n)
计算训练误差:
train_error = np.mean(np.concatenate((margin_p, margin_n)))
判断训练误差是否小于等于阈值:
若 train_error <= epsilon,终止迭代
第2次迭代:同第1次迭代
进行测试: - 输入测试向量 t
计算测试向量的预测结果:
y_pred = np.dot(w, t) + b
判断样本类型:
若 y_pred >= 0,测试向量为正样本
若 y_pred < 0,测试向量为负样本
// 番茄
import numpy as np
# 训练样本
X = np.array([[0.9, 0.3, 0.0], [0.1, 0.2, 0.7]]) # 特征向量
y = np.array([1, -1]) # 类别标签
# 初始化参数
w = np.zeros(X.shape[1]) # 权重向量
b = 0 # 偏置项
learning_rate = 0.1 # 学习率
num_epochs = 1000 # 最大迭代次数
epsilon = 0.01 # 训练误差阈值
# 训练过程
for epoch in range(num_epochs):
# 计算预测结果
y_pred = np.dot(w, X.T) + b
# 计算损失和间隔
loss = 1 - y * y_pred
margin = np.maximum(0, loss)
# 更新参数
gradient_w = -np.dot(y * margin, X) # 权重梯度
gradient_b = -np.sum(y * margin) # 偏置项梯度
w -= learning_rate * gradient_w # 更新权重
b -= learning_rate * gradient_b # 更新偏置项
# 计算当前训练误差
train_error = np.mean(margin)
# 检查训练误差是否小于阈值
if train_error <= epsilon:
break
# 测试样本
test_sample = np.array([0.7, 0.5, 0.1])
y_pred = np.dot(w, test_sample) + b
# 判断样本类型
if y_pred >= 0:
sample_type = "正样本"
else:
sample_type = "负样本"
print("测试样本:", test_sample)
print("预测结果:", sample_type)