【算法】一类支持向量机OC-SVM(2)


前言

在上则博文【算法】一类支持向量机OC-SVM(1) 中,我们提及到了蜂群算法优化一类支持向量机超参数模型,采用的适应度函数是r方,用的python 自带的 r2_score 模块,后来想想,不太合适,效果不佳,索性简单粗暴,直接比较分类正确的数量,然后进行适应度判断。同时,增加散点图分布来提高查阅效果。基于以上情况,对编写过程进行一个记录,方便后续同样情况的适用。

纠正内容

数据集创建方式

在优化后的模型中,数据集不再用make_blobs自动生成,采用excel 导入的形式展开。

orignal = pd.read_excel('C:/Users/11003189/Desktop/py/data.xlsx', sheet_name='点')  # 读取数据
print(orignal)
col =['X','Y']
col1 =['Unnamed: 3']
data =orignal[col]
target =orignal[col1]
array =target.to_numpy()

这里有一个问题,输出导入的excel 数据,选取其中的列,它的输出格式如下所示:
在这里插入图片描述

这并不是数组,这个要明确,否则编写代码时候会有问题。

通过to_numpy对一列数据进行数组转换,它并不会变成一维数组,而是如下所示:
在这里插入图片描述
因此在数据读取时应该时a[index][0]

适应度函数

将预测的分类结果与真实的分类结果进行比较,然后统计预测正确的个数,并进行适应度返回。

# 适应度函数
def fitness_function(params):
    # 选取X_train 为正类
    # X_train, X_test, _, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    # y_test = np.where(y_test == 0, -1, 1)  # 将标签转换为-1和1
    nu = params['nu']
    kernel = params['kernel']
    gamma = params['gamma']
    
    # 创建和训练One-Class SVM模型
    ocsvm = OneClassSVM(nu=nu, kernel=kernel, gamma=gamma)
    # ocsvm.fit(X_train)
    ocsvm.fit(data,target)
    
    # 预测测试集并计算ROC AUC分数作为适应度值
    # y_pred = ocsvm.predict(X_test)
    predictions = ocsvm.predict(data)
    # fitness =r2_score(y_test, y_pred)
    count =0
    for index, element in enumerate(predictions):
        if(element ==array[index][0]):
            count=count+1
    return count
    # return fitness

新增内容

散点图示例

跟前面博文画折线图用的模块一样,也是pyplot,只不过用的是scatter方法,示例代码如下:

import matplotlib.pyplot as plt
import numpy as np
import time
 
# 生成数据
x = np.random.rand(10)
y = np.random.rand(10)
# colors = np.random.rand(10)
colors =[1,0,1,1,1,1,1,1,1,1]# 0黑色 1亮色
#colors =['#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#FFFFFF','#000000']# 0黑色 1亮色
print(colors)

fig, ax = plt.subplots()
scatter = ax.scatter(x, y, c=colors)
plt.colorbar(scatter)  # 显示颜色条
 
# 动态更新颜色
# for i in range(10):
#     colors = np.random.rand(10)
#     scatter.set_facecolors(plt.cm.viridis(colors))  # 使用viridis colormap
#     plt.draw()
#     time.sleep(0.5)  # 等待0.5秒
 
# plt.savefig('test5.png')
plt.show()
  • 其中colors 的赋值,可以是直接用颜色的RGB 十六进制,也可以用0-1中的数值来指代,只不过1是黄色,0是黑色。

效果图如图所示:
在这里插入图片描述

模型散点图展示

在模型中增加散点图也是一样的编写,在资源绑定中提供的代码,里面包括预测数据的生成图和真实数据的生成图,xy分别表示2个特征值,点的颜色以正例和负例进行区分,负例黑色,正例黄色。同时也用plt.savefig('predictions.png')进行图片的保存,但建议这里保存路径用绝对路径,相对路径有时候会找不到,得全局搜寻。
路径编写时,斜杠/和反斜杠\不同,可以参考大佬python中关于\和/的使用说明介绍

plt.savefig('C:/Users/11003189/Desktop/py/test5.png')
plt.savefig(r'C:\Users\11003189\Desktop\py\test5.png')
plt.savefig('C:\\Users\\11003189\\Desktop\\py\\test5.png')

在这里插入图片描述

在这里插入图片描述

这里图片主要是展示一个效果,数据集的相关性和优化效果都没进行考虑,为了方便输出,迭代次数和种群都是按照最小的配置,因此图片效果不佳。但不影响代码的适用性,可根据需要进行数据集替换和相关超参数范围的选取。

相关推荐

  1. 支持向量SVM

    2024-03-19 23:04:05       31 阅读
  2. 支持向量SVM

    2024-03-19 23:04:05       33 阅读
  3. 支持向量SVM

    2024-03-19 23:04:05       31 阅读
  4. 支持向量SVM

    2024-03-19 23:04:05       29 阅读
  5. SVM支持向量

    2024-03-19 23:04:05       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 23:04:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 23:04:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 23:04:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 23:04:05       20 阅读

热门阅读

  1. 网页的制作

    2024-03-19 23:04:05       20 阅读
  2. 关于我的经历

    2024-03-19 23:04:05       22 阅读
  3. 【笔记】Linux常用命令

    2024-03-19 23:04:05       18 阅读
  4. PHP使用AES进行加解密

    2024-03-19 23:04:05       20 阅读
  5. 面试宝典:MySQL 索引优化

    2024-03-19 23:04:05       22 阅读
  6. 杂题——1187: 假币问题

    2024-03-19 23:04:05       23 阅读
  7. js iframe获取documen中的对象为空问题

    2024-03-19 23:04:05       18 阅读
  8. 计算机网络技术基础知识

    2024-03-19 23:04:05       20 阅读
  9. el-input添加keyup事件无响应

    2024-03-19 23:04:05       18 阅读