从零开始的数字图片处理学习(2)—svm

期末复习速成

在进行学习前,我们需要知道一些基础概念(一堆废话)

感知器

在人工智能领域,有一个方法叫机器学习。在机器学习这个方法里,有一类算法叫神经网络。我们将输入数据称之为输入层,在这里我们用 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)



  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值