机器学习 —— 向量机(matlab)

目录

一、SVM基本介绍

1.1 SVM算法定义

1.2 SVM和逻辑回归的区别

二、实验数学原理

三、实验算法和实验步骤

四、实例分析


一、SVM基本介绍

1.1 SVM算法定义

  SVM全称是supported vector machine(支持向量机),即寻找到一个超平面使样本分成两类,并且间隔最大。

  SVM能够执行线性和非线性分类,回归,甚至是异常值监测任务。特别适用于中小型复杂数据集的分类。

1.2 SVM和逻辑回归的区别

在这里插入图片描述

  1. 逻辑回归和SVM都是寻找一条分类直线,目标是把这两个类别分开
  2. 逻辑回归的最终判断标准是:准确率,而SVM最终的判断结果是:准确率+最大间隔
  3. 逻辑回归的分类直线可能有多条,而SVM的分类直线只有一条。

单纯考虑准确率和考虑最大间隔哪个泛化性能更好一点:
在这里插入图片描述

  1. 准确率只考虑了在训练集上的预测能力
  2. 准确率+最大间隔即考虑了预测能力,又考虑了模型对未知样本的泛化能力。

二、实验数学原理

线性支持向量机

三、实验算法和实验步骤

二分类逻辑回归算法

输入

输出过程:

1.读取数据集

2.数据归一化

3.构造问题的约束二次规划

4.构建拉格朗日函数

5.将问题对偶化

6.利用SMO算法进行求解,得到分类预测模型

7.根据预测模型对预测集样本的类别进行预测

输出:数据集的预测结果

四、实例分析

数据来源:传送门1  传送门2

线性向量机

clear;close all;clc;
%% 第一步:读取数据
load SVMdata1.mat;
%% 第二步:分离训练集和测试集
% [train_X,train_y,test_X,test_y] = split_train_test(X,y,2,0.8);
% randperm随机打算数据集X的顺序
index = randperm(size(X,1)); %获取打算顺序后的数据集的索引
n = length(index); %得到index的个数
% 分离训练集
T = round(n*0.8);
train_X = X(index(1:T),:); %分离出数据集X中的训练集
train_y = y(index(1:T),:); %分离出数据集y中的训练集
% 分离测试集或预测集
test_X = X(index(T+1:end),:); %分离出数据集X中的测试集
test_y = y(index(T+1:end),:); %分离出数据集y中的测试集

%% 第三步:标准支持向量机拟合训练
svmline = svmtrain(train_X,train_y,'Showplot',true);

%% 第四步:SVM预测
predictline = svmclassify(svmline,test_X,'Showplot',true);
fprintf('预测分类结果为:\n')
disp(predictline')
%继续绘制测试集数据
hold on; %继续在这张图上绘制
plot(test_X(:,1),test_X(:,2),'gs','Markersize',12) %圈出预测数据
xlabel('x') %添加行标签
ylabel('y') %添加列标签
title('标准支持向量机') %添加标题
hold off %接下来绘制重启一张图
%% 第五步:预测的准确率
accu = 1-sum(abs(predictline-test_y))/length(test_y);
fprintf('预测结果准确率为:%d',accu)

高斯向量机

clear;close all;clc;
%% 第一步:读取数据
load SVMdata2.mat;
%% 第二步:分离训练集和测试集
% [train_X,train_y,test_X,test_y] = split_train_test(X,y,2,0.8);
% randperm随机打算数据集X的顺序
index = randperm(size(X,1)); %获取打算顺序后的数据集的索引
n = length(index); %得到index的个数
% 分离训练集
T = round(n*0.8);
train_X = X(index(1:T),:); %分离出数据集X中的训练集
train_y = y(index(1:T),:); %分离出数据集y中的训练集
% 分离测试集或预测集
test_X = X(index(T+1:end),:); %分离出数据集X中的测试集
test_y = y(index(T+1:end),:); %分离出数据集y中的测试集

%% 第三步:高斯拟合训练集
svmgs = svmtrain(train_X,train_y,'Showplot',true,'kernel_function','rbf','rbf_sigma',1);

%% 第四步:SVM预测
predict = svmclassify(svmgs,test_X,'Showplot',true);
fprintf('预测分类结果为:\n')
disp(predict')
%继续绘制测试集数据
hold on; %继续在这张图上绘制
plot(test_X(:,1),test_X(:,2),'gs','Markersize',12) %圈出预测数据
xlabel('x') %添加行标签
ylabel('y') %添加列标签
title('高斯核支持向量机') %添加标题
hold off %接下来绘制重启一张图
%% 第五步:预测的准确率
% accu = sum(strcmp(predict,test_y))/length(test_y)*100
accu = 1-sum(abs(predict-test_y))/length(test_y);
fprintf('预测结果准确率为:%d',accu)
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要绘制正弦交流电路向量图,需要先了解交流电路的特性和向量的概念。 在交流电路中,电流和电压都是周期性变化的正弦函数。因此,我们可以用向量表示交流电路中电流和电压的大小和相位。 对于正弦交流电路,向量的长度表示电压或电流的最大值,向量的方向表示相位差。 在 Python 中,可以使用 NumPy 库来计算正弦函数的值,并使用 Matplotlib 库来绘制向量图。以下是一个简单的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 设置正弦函数的参数 f = 50 # 频率为50Hz Vp = 220 # 电压峰值为220V Ip = 5 # 电流峰值为5A phi = np.pi/4 # 相位差为45度 # 计算正弦函数的值 t = np.arange(0, 0.02, 0.0001) # 时间范围为0到20ms,间隔为0.1us V = Vp * np.sin(2*np.pi*f*t) # 电压的正弦函数 I = Ip * np.sin(2*np.pi*f*t + phi) # 电流的正弦函数 # 绘制向量图 plt.figure() plt.plot([0, Vp], [0, 0], 'r', linewidth=2) # 电压向量 plt.plot([0, 0], [0, Ip], 'b', linewidth=2) # 电流向量 plt.plot([0, V*np.cos(phi)], [0, V*np.sin(phi)], 'g', linewidth=2) # 电压向量的投影 plt.plot([0, I*np.cos(phi)], [0, I*np.sin(phi)], 'm', linewidth=2) # 电流向量的投影 plt.legend(['Voltage', 'Current', 'Voltage Projection', 'Current Projection']) plt.axis('equal') plt.show() ``` 上述代码中,我们首先设置正弦函数的参数,然后使用 NumPy 库计算正弦函数的值。接着,我们使用 Matplotlib 库绘制向量图。其中,红色表示电压向量,蓝色表示电流向量,绿色表示电压向量在相位差方向的投影,紫色表示电流向量在相位差方向的投影。 运行上述代码,即可得到正弦交流电路向量图。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值