中国大学MOOC胡浩基的机器学习第二章(支持向量机)兵王问题python版本——在python上初步使用libsvm

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

      在中国大学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(
评论 42
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值