R7-2 支持向量机分类: 圆周数据分类实验

本实验使用支持向量机 (SVM) 对自行产生的圆周数据进行分类。数据集包含 10 个类别,每个类别在半径不同的圆周上分布 10 个样本。不同类别的数据交替出现,例如第一类数据第一个点,第二类数据第一个点,最后一类数据第一个点,然后第一类数据第二个点,第二类数据第二个点。。。直到最后一类数据第十个点。

第 c 类数据都在半径为 3c 的圆上,类别编号为类别数字 - 1 (1 到 10 类,对应 0 到 9)。

横纵坐标中,cos, sin 的弧度为所在类别中的序号的 3 倍。

例如类别为 2 的数据中,第 4 个点,横坐标是 3 * 2 * cos(4 * 3),纵坐标 3 * 2 * sin(4 * 3),类别编号为 2 - 1 = 1;类别为 4 的数据中,第 5 个点,横坐标是 3 * 4 * cos(5 * 3),纵坐标 3 * 4 * sin(5 * 3),类别编号为 4 - 1 = 3。

train_test_split 用来分隔训练集和测试集,训练数据集比例 0.5,random_state = 1

使用 sklearn 的支持向量机,核函数 'rbf', gamma 系数 20, decision_function_shape 策略 'ovo' 对训练集拟合,而后测试训练集和测试集的精度。精度使用 score(),显示 2 位小数。

输入样例:

在这里给出数据类别的个数,例如:

2

输出样例:

accu of model for train set is 0.70
accu of model for test set is 0.30

代码如下:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# 获取数据类别个数
num_classes = int(input())

# 生成数据
X = []
y = []
for i in range(num_classes):
    for j in range(10):
        X.append([3 * (i + 1) * np.cos((j + 1) * 3), 3 * (i + 1) * np.sin((j + 1) * 3)])
        y.append(i)
X = np.array(X)
y = np.array(y)

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=1)

# 建立 SVM 模型
model = SVC(kernel='rbf', gamma=20, decision_function_shape='ovo')

# 训练模型
model.fit(X_train, y_train)

# 测试模型
train_acc = model.score(X_train, y_train)
test_acc = model.score(X_test, y_test)

# 输出结果
print(f'accu of model for train set is {train_acc:.2f}')
print(f'accu of model for test set is {test_acc:.2f}')
R7-2 支持向量机分类: 圆周数据分类实验

原文地址: https://www.cveoy.top/t/topic/mX1b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录