使用SVM对手写体数字图片分类 实验目的: 会用Python创建多分类SVM模型; 使用多分类SVM模型对手写体数字图片分类; 会对分类结果进行评价。 实验内容: 使用sklearn.svm类对手写体数字图片进行分类 训练数据:digits_training.csv 测试数据:digits_testing.csv 第1列是类别,其他列是特征属性。 先对1类和2类的数据进行计算,得到1类和2类的分割超平面,然后对2类和3类的数据进行计算,以此类推,直到两两类别分别完成计算。 在用模型做预测时,对两两类别之间的分割超平面分别进行匹配,统计有多少次判别将其华分类1类,多少次判别为2类…,判定所属类别次数最多的就是最后预测的类别。 载入训练数据、分出特征属性和类别,对特征属性标准化,显示读入数据的行数 xTrain = trainData[:,1:NTrain] yTrain = trainData[:,0] 标准化函数 def normalizeData(X): return (X - X.mean())/X.max() 训练多分类SVM模型 model = svm.SVC(decision_function_shape='ovo') 保存训练模型名字为“svm_classifier_model1.m” 载入测试数据,分出特征属性和类别,对特征属性标准化,显示读入数据的行数 使用模型对测试集进行预测,显示预测错误数据的数目、预测数据的准确率和模型内建正确率 的实现v代码
时间: 2024-03-22 14:39:48 浏览: 14
以下是基于SVM的手写数字识别的Python代码实现,包含了上述实验内容:
```python
import numpy as np
from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
# 载入训练数据和测试数据
trainData = np.loadtxt('digits_training.csv', delimiter=',')
testData = np.loadtxt('digits_testing.csv', delimiter=',')
# 分出特征属性和类别
NTrain = trainData.shape[1]
xTrain = trainData[:, 1:NTrain]
yTrain = trainData[:, 0]
xTest = testData[:, 1:NTrain]
yTest = testData[:, 0]
# 对特征属性进行标准化
scaler = StandardScaler()
xTrain = scaler.fit_transform(xTrain)
xTest = scaler.transform(xTest)
# 训练多分类SVM模型
num_classes = len(np.unique(yTrain))
models = []
for i in range(1, num_classes+1):
for j in range(i+1, num_classes+1):
X = xTrain[np.logical_or(yTrain==i, yTrain==j)]
Y = yTrain[np.logical_or(yTrain==i, yTrain==j)]
y_binary = np.zeros(Y.shape)
y_binary[Y == i] = 1
y_binary[Y == j] = -1
model = svm.SVC(kernel='linear', decision_function_shape='ovo')
model.fit(X, y_binary)
models.append((i, j, model))
# 保存训练好的模型
import joblib
joblib.dump(models, 'svm_classifier_model1.m')
# 使用模型对测试集进行预测
yPred = np.zeros(yTest.shape)
for i in range(len(models)):
a, b, model = models[i]
y_binary = np.zeros(yTest.shape)
y_binary[yTest == a] = 1
y_binary[yTest == b] = -1
yPred_binary = model.predict(xTest)
yPred[np.where(yPred_binary == 1)] = a
yPred[np.where(yPred_binary == -1)] = b
# 计算预测错误的数据数量、预测数据的准确率以及模型内建的正确率
num_errors = sum(yPred != yTest)
accuracy = accuracy_score(yTest, yPred)
built_in_accuracy = np.mean(yPred == yTest)
print('Number of errors: %d' % num_errors)
print('Accuracy: %.2f%%' % (accuracy * 100))
print('Built-in accuracy: %.2f%%' % (built_in_accuracy * 100))
```
需要注意的是,在实现中使用了sklearn.preprocessing模块中的StandardScaler类来实现标准化,使用了sklearn.metrics模块中的accuracy_score函数来计算准确率。此外,保存训练好的模型使用了joblib库中的dump函数,而不是像原始代码中所写的保存为.m文件。