R7-2 支持向量机分类:圆周数据集实践
R7-2 支持向量机分类:圆周数据集实践
本实践使用 sklearn 的支持向量机算法,对自行创建的圆周数据集进行分类。数据集由多个类别组成,每个类别对应一个圆周上的点,类别之间数据交替出现。
数据集生成:
- 每类数据都是某一个圆周上的点,每类有 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 c in range(1, num_classes + 1):
for i in range(1, 11):
x = 3 * c * np.cos(i * 3)
y = 3 * c * np.sin(i * 3)
X.append([x, y])
Y.append(c - 1)
# 将数据集分成训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=1)
# 创建支持向量机模型
model = SVC(kernel='rbf', gamma=20, decision_function_shape='ovo')
# 训练模型
model.fit(X_train, Y_train)
# 测试模型
train_accu = model.score(X_train, Y_train)
print('accu of model for train set is {:.2f}'.format(train_accu))
test_accu = model.score(X_test, Y_test)
print('accu of model for test set is {:.2f}'.format(test_accu))
原文地址: https://www.cveoy.top/t/topic/mX0I 著作权归作者所有。请勿转载和采集!