在中国大学MOOC上看了胡浩基的机器学习课程,完全面向入门人群感觉挺好。其中有关原理的部分讲的很细。(虽然有几个细节我还是没懂.......)其中在第二章的例题兵王问题中课程只给了MATLAB的版本。但是,我相信也有极小部分人和我一样对MATLAB不太熟悉的。所以,我自己就按照我对老师的MATLAB的代码的理解写了python版本。先放源码大多数的内容我都会写在注释(中文)上,还有几个我认为大家可能会有疑惑的地方会在之后列出。
# -*- coding: utf-8 -*-
import numpy as np
from libsvm.python.svm import *
from libsvm.python.svmutil import *
def data_read_mat(file_name):
'''
从文件中取出数据
:param file_name: 文件名称
:return: 返回一个n*7的矩阵,前6项是三个坐标,第七项是标签
'''
num_list = []
'''
一下是对数据进行读入并且处理,其中open的参数中encoding之所以设置成UTF-8-sig
是因为如果我们把这个参数设置为UTF-8或者不设置,在读入的开头多出\ufeff这么一串
东西,有时候会以中文字的形式出现。
'''
with open(file_name,"r",encoding='UTF-8-sig') as file:
for l in file:
l = l.split(',')
list_k = []
for j in range(3):
list_k.append(ord(l[j*2]) - ord('a'))
list_k.append(ord(l[j*2 + 1]) - ord('0'))
if(l[6][0] == 'd'):
list_k.append(-1)
else:
list_k.append(1)
num_list.append(list_k)
num_mat = np.array(num_list,dtype="float")
'''
在此处是以numpy的二维数据矩阵的形式存储的,本以为使用numpy的数据进行运算可以使得
训练的速度快一些。结果发现如果要往libsvm中的函数传入参数只能传入list型不能传入numpy
的数据类型。所以,后面又把数据类型转回了list型。但是,我猜应该是有方法可以把numpy
的数据类型传入使用的。于是我在读取数据后任然返回的是numpy的形式。
'''
return num_mat
def data_deal(mat,len_train,len1,len_test,len2):
'''
将数据进行处理,分出训练数据和测试数据
:param mat: 大矩阵,其中包括训练数据和测试数据
:param len_train:训练数据
:param len1: 输入坐标
:param len_test: 测试数据
:param len2: 标签
:return: 返回的依次是训练输入数据,测试输入数据,训练输入数据的标签,测试输入数据的标签
'''
np.random.shuffle(mat) #先将矩阵按行打乱。然后根据要求对矩阵进行分割,第一部分就是训练集,第二部分就是测试集
x_part1 = mat[0:len_train,0:len1]
x_part2 = mat[len_train:,0:len1]
y_part1 = mat[0:len_train,len1]
y_part2 = mat[len_train:,len1]
# 标准化
# 根据训练集求出均值和方差
avgX = np.mean(x_part1)
stdX = np.std(x_part1)
# print(avgX,stdX)
#将训练集和测试集都进行归一化处理
for data in x_part1:
for j in range(len(data)):
data[j] = (data[j] - avgX) / stdX
for data in x_part2:
for j in range(

本文分享了在胡浩基机器学习课程启发下,用Python重写MATLAB版兵王问题SVM模型的过程,包括数据读取、预处理、模型训练及参数优化,最后讨论了标准化和参数选择的重要性。
最低0.47元/天 解锁文章
2258





