import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs from sklearn import model_selection from sklearn.metrics import f1_score def show_svm(a, b, bt): plt.figure(bt) plt.title('SVM with ' + bt) # 建立图像坐标 axis = plt.gca() plt.scatter(a[:, 0], a[:, 1], c=b, s=30) xlim = [a[:, 0].min(), a[:, 0].max()] ylim = [a[:, 1].min(), a[:, 1].max()] # 生成两个等差数列 xx = np.linspace(xlim[0], xlim[1], 50) yy = np.linspace(ylim[0], ylim[1], 50) X, Y = np.meshgrid(xx, yy) xy = np.vstack([X.ravel(), Y.ravel()]).T Z = clf.decision_function(xy).reshape(X.shape) # 画出分界线 axis.contour(X, Y, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--']) axis.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=200, linewidths=1, facecolors='none') if __name__ == '__main__': # data = np.loadtxt('separable_data.txt', delimiter=',') # data = np.loadtxt('non_separable_data.txt', delimiter=',') # data = np.loadtxt('banknote.txt', delimiter=',') data = np.loadtxt('ionosphere.txt', delimiter=',') # data = np.loadtxt('wdbc.txt', delimiter=',') X = data[:, 0:-1] y = data[:, -1] """标签中有一类标签为1""" y = y + 1 ymin = min(y) if not (1 in set(y)): ll = max(list(set(y))) + 1 for i in range(len(y)): if y[i] == ymin: y[i] = 1 # 建立一个线性核(多项式核)的SVM clf = svm.SVC(kernel='linear') clf.fit(X, y) """显示所有数据用于训练后的可视化结果""" show_svm(X, y, 'all dataset') """divide the data into two sections: training and test datasets""" X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.1, random_state=42) """training""" clf = svm.SVC(kernel='linear')#线性内核 # clf = svm.SVC(kernel='poly')# 多项式内核 # clf = svm.SVC(kernel='sigmoid')# Sigmoid内核 clf.fit(X_train, y_train) # show_svm(X_train, y_train, 'training dataset') """predict""" pred = clf.predict(X_test) pred = np.array(pred) y_test = np.array(y_test) print(f'SVM 的预测结果 f1-score:{f1_score(y_test, pred)}') # plt.show()结果与分析
时间: 2024-04-22 21:22:18 浏览: 175
这段代码实现了一个支持向量机(SVM)分类器,并对数据进行了可视化展示。具体来说,它包括以下几个主要步骤:
1. 导入需要使用的库,如 numpy、matplotlib、sklearn 等。
2. 定义一个名为 show_svm 的函数,用于对数据进行可视化展示。函数有三个参数:a 表示数据的特征值,b 表示数据的标签,bt 表示图像的标题。
3. 在主函数中,首先读取数据,然后将标签中的一类标签设为 1,并划分数据集为训练集和测试集。
4. 建立一个线性核的 SVM 分类器,并用训练集进行训练。
5. 对训练后的模型进行可视化展示,包括所有数据集和训练数据集的分界线。
6. 对测试集进行预测,并计算预测结果的 f1-score。
7. 最后展示结果。
总的来说,这段代码的功能是对数据进行 SVM 分类,并对分类结果进行可视化和评估。其中,SVM 模型的核函数可以通过修改代码中的 kernel 参数进行更换。
相关问题
from sklearn.datasets import make_blobs, make_classification, make_moons, make_circles from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV import matplotlib.pyplot as plt import numpy as np啥意思
这些程序是用来实现一个基于支持向量机(SVM)的分类器,该分类器可以对使用不同生成器函数生成的数据集进行分类。具体来说,该程序使用make_blobs、make_classification、make_moons和make_circles函数生成不同的数据集,然后使用svm模块中的SVC类创建一个支持向量机分类器。接着,使用GridSearchCV函数进行网格搜索,以寻找最佳的模型参数。最后,使用matplotlib.pyplot库可视化分类结果。这些程序中的numpy库是用来进行数据处理和计算的。
# 导入必要的库 import numpy as np from sklearn import svm from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # 生成一些随机数据 X, y = make_blobs(n_samples=100, centers=2, random_state=6) # 创建SVM分类器 clf = svm.SVC(kernel='linear', C=1000) # 训练分类器 clf.fit(X, y) # 绘制数据和决策边界 plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired) ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() # 创建网格来评估模型 xx = np.linspace(xlim[0], xlim[1], 30) yy = np.linspace(ylim[0], ylim[1], 30) YY, XX = np.meshgrid(yy, xx) xy = np.vstack([XX.ravel(), YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) # 绘制决策边界和边界 ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--']) ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k') plt.show()请详细分析此代码
这段代码主要实现了以下功能:
1. 导入了必要的库,包括 numpy、sklearn、matplotlib.pyplot;
2. 使用 make_blobs 生成了一些随机数据,其中包括 100 个样本,分为 2 类,使用 random_state 参数使得每次生成的数据都相同;
3. 创建了一个 SVM 分类器,使用线性核函数和 C=1000 进行参数配置;
4. 使用 fit() 方法对分类器进行训练;
5. 使用 scatter() 方法绘制了数据点,其中颜色 c 由类别 y 决定;
6. 使用 get_xlim() 和 get_ylim() 方法获取 X 和 Y 轴的范围;
7. 使用 linspace() 方法生成了一个 xx 和 yy 数组,分别对应 X 和 Y 轴的网格点;
8. 使用 meshgrid() 方法将 xx 和 yy 进行组合,生成了一个网格点坐标矩阵 XX 和 YY;
9. 使用 decision_function() 方法对网格点坐标进行分类,并将其保存到 Z 中;
10. 使用 contour() 方法绘制了等高线图,其中 levels=[-1, 0, 1] 表示画三条等高线,分别是决策边界和分类边界;
11. 使用 scatter() 方法绘制了支持向量,并将其设置为透明,只显示边缘。
这段代码的作用是绘制 SVM 分类器的决策边界和支持向量。其中,决策边界是分类器将两类样本区分开的线性边界,而支持向量是离该边界最近的一些样本点。通过绘制这些图形,可以帮助我们更好地理解 SVM 分类器的工作原理。
阅读全文
相关推荐















