机器学习之支持向量回归(SVR)
2023-06-13 09:12:10 时间
大家好,又见面了,我是你们的朋友全栈君。
简介 支持向量机 (Support Vector Machine) 是由Vapnik等人于1995年提出来的,之后随着统计理论的发展,支持向量机 SVM 也逐渐受到了各领域研究者的关注,在很短的时间就得到了很广泛的应用。 支持向量机是被公认的比较优秀的分类模型。同时,在支持向量机的发展过程中,其理论方面的研究得到了同步的发展,为支持向量机的研究提供了强有力的理论支撑。 本实训项目主要围绕支持向量机的原理和技术进行介绍,并基于实际案例进行实战实训。
线性支持向量机
#encoding=utf8
from sklearn.svm import LinearSVC
def linearsvc_predict(train_data,train_label,test_data):
''' input:train_data(ndarray):训练数据 train_label(ndarray):训练标签 output:predict(ndarray):测试集预测标签 '''
#********* Begin *********#
clf = LinearSVC(dual=False)
clf.fit(train_data,train_label)
predict = clf.predict(test_data)
#********* End *********#
return predict
非线性支持向量机
#encoding=utf8
from sklearn.svm import SVC
def svc_predict(train_data,train_label,test_data,kernel):
''' input:train_data(ndarray):训练数据 train_label(ndarray):训练标签 kernel(str):使用核函数类型: 'linear':线性核函数 'poly':多项式核函数 'rbf':径像核函数/高斯核 output:predict(ndarray):测试集预测标签 '''
#********* Begin *********#
clf =SVC(kernel=kernel)
clf.fit(train_data,train_label)
predict = clf.predict(test_data)
#********* End *********#
return predict
序列最小优化算法
#encoding=utf8
import numpy as np
class smo:
def __init__(self, max_iter=100, kernel='linear'):
''' input:max_iter(int):最大训练轮数 kernel(str):核函数,等于'linear'表示线性,等于'poly'表示多项式 '''
self.max_iter = max_iter
self._kernel = kernel
#初始化模型
def init_args(self, features, labels):
self.m, self.n = features.shape
self.X = features
self.Y = labels
self.b = 0.0
# 将Ei保存在一个列表里
self.alpha = np.ones(self.m)
self.E = [self._E(i) for i in range(self.m)]
# 错误惩罚参数
self.C = 1.0
#********* Begin *********#
#kkt条件
def _KKT(self, i):
y_g = self._g(i)*self.Y[i]
if self.alpha[i] == 0:
return y_g >= 1
elif 0 < self.alpha[i] < self.C:
return y_g == 1
else:
return y_g <= 1
# g(x)预测值,输入xi(X[i])
def _g(self, i):
r = self.b
for j in range(self.m):
r += self.alpha[j]*self.Y[j]*self.kernel(self.X[i], self.X[j])
return r
# 核函数,多项式添加二次项即可
def kernel(self, x1, x2):
if self._kernel == 'linear':
return sum([x1[k]*x2[k] for k in range(self.n)])
elif self._kernel == 'poly':
return (sum([x1[k]*x2[k] for k in range(self.n)]) + 1)**2
return 0
# E(x)为g(x)对输入x的预测值和y的差
def _E(self, i):
return self._g(i) - self.Y[i]
#初始alpha
def _init_alpha(self):
# 外层循环首先遍历所有满足0<a<C的样本点,检验是否满足KKT
index_list = [i for i in range(self.m) if 0 < self.alpha[i] < self.C]
# 否则遍历整个训练集
non_satisfy_list = [i for i in range(self.m) if i not in index_list]
index_list.extend(non_satisfy_list)
for i in index_list:
if self._KKT(i):
continue
E1 = self.E[i]
# 如果E2是+,选择最小的;如果E2是负的,选择最大的
if E1 >= 0:
j = min(range(self.m), key=lambda x: self.E[x])
else:
j = max(range(self.m), key=lambda x: self.E[x])
return i, j
#选择alpha参数
def _compare(self, _alpha, L, H):
if _alpha > H:
return H
elif _alpha < L:
return L
else:
return _alpha
#训练
def fit(self, features, labels):
''' input:features(ndarray):特征 label(ndarray):标签 '''
self.init_args(features, labels)
for t in range(self.max_iter):
i1, i2 = self._init_alpha()
# 边界
if self.Y[i1] == self.Y[i2]:
L = max(0, self.alpha[i1]+self.alpha[i2]-self.C)
H = min(self.C, self.alpha[i1]+self.alpha[i2])
else:
L = max(0, self.alpha[i2]-self.alpha[i1])
H = min(self.C, self.C+self.alpha[i2]-self.alpha[i1])
E1 = self.E[i1]
E2 = self.E[i2]
# eta=K11+K22-2K12
eta = self.kernel(self.X[i1], self.X[i1]) + self.kernel(self.X[i2], self.X[i2]) - 2*self.kernel(self.X[i1], self.X[i2])
if eta <= 0:
continue
alpha2_new_unc = self.alpha[i2] + self.Y[i2] * (E2 - E1) / eta
alpha2_new = self._compare(alpha2_new_unc, L, H)
alpha1_new = self.alpha[i1] + self.Y[i1] * self.Y[i2] * (self.alpha[i2] - alpha2_new)
b1_new = -E1 - self.Y[i1] * self.kernel(self.X[i1], self.X[i1]) * (alpha1_new-self.alpha[i1]) - self.Y[i2] * self.kernel(self.X[i2], self.X[i1]) * (alpha2_new-self.alpha[i2])+ self.b
b2_new = -E2 - self.Y[i1] * self.kernel(self.X[i1], self.X[i2]) * (alpha1_new-self.alpha[i1]) - self.Y[i2] * self.kernel(self.X[i2], self.X[i2]) * (alpha2_new-self.alpha[i2])+ self.b
if 0 < alpha1_new < self.C:
b_new = b1_new
elif 0 < alpha2_new < self.C:
b_new = b2_new
else:
# 选择中点
b_new = (b1_new + b2_new) / 2
# 更新参数
self.alpha[i1] = alpha1_new
self.alpha[i2] = alpha2_new
self.b = b_new
self.E[i1] = self._E(i1)
self.E[i2] = self._E(i2)
def predict(self, data):
''' input:data(ndarray):单个样本 output:预测为正样本返回+1,负样本返回-1 '''
r = self.b
for i in range(self.m):
r += self.alpha[i] * self.Y[i] * self.kernel(data, self.X[i])
return 1 if r > 0 else -1
#********* End *********#
支持向量回归
#encoding=utf8
from sklearn.svm import SVR
def svr_predict(train_data,train_label,test_data):
''' input:train_data(ndarray):训练数据 train_label(ndarray):训练标签 output:predict(ndarray):测试集预测标签 '''
#********* Begin *********#
svr = SVR(kernel='rbf',C=100,gamma= 0.001,epsilon=0.1)
svr.fit(train_data,train_label)
predict = svr.predict(test_data)
#********* End *********#
return predict
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136562.html原文链接:https://javaforall.cn
相关文章
- 罗京佳教授:机器学习加速气候模拟
- 快速入门Python机器学习(15)
- 机器学习笔记,统计模型觉得难,不妨来看点概念吧
- 一步一步理解机器学习的ROC曲线
- 【机器学习】支持向量机原理及例题详解
- 10个机器学习中常用的距离度量方法
- 遥感数据机器学习的准备工作:python将栅格数据提取至EXCEL
- 动手体验 Elasticsearch 8.4.x 机器学习预测打车价格
- 图机器学习 | PyG 安装配置记录
- [NC | 论文简读] devCellPy是一个机器学习支持的管道,用于自动注释复杂的多层单细胞转录组数据
- npj | ESA-ECMWF: 机器学习在地球系统观测和预测方面应用的最新进展和研究方向
- PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享|附代码数据
- A.机器学习入门算法(四): 基于支持向量机的分类预测
- 27场机器学习面试后,来划个概念重点吧
- 清华大学发布首个自动图机器学习工具包AutoGL,开源易用可扩展,支持自定义模型
- CNCC 2016 | 周志华 57 张 PPT 揭开机器学习本质
- 开发者入门必读:最值得看的十大机器学习公开课
- 《代码英雄》第四季(1):小型机 —— 旧机器的灵魂
- 1g2核心机器安装高效Oracle数据库(1g2核安装oracle)
- 引入机器学习,Google表格可以帮你自动把数据做成图表
- 使用机器学习进行预测性维护
- 专访腾讯云机器学习平台技术负责人:揭秘腾讯深度学习平台DI-X背后的秘密