matlab环境下使用libsvm,转自http://apinetree.blog.51cto.com/714152/1560254

本文详细介绍了如何从LIBSVM官网下载并集成最新版本的LIBSVM到MATLAB环境中,包括操作系统的考虑、路径设置、相关函数的使用及其参数解释。通过提供一个实际的测试例子,演示了如何使用libsvmread函数读取数据文件,以及如何利用svmtrain和svmpredict函数进行模型训练和预测。文章还深入解析了svmtrain函数返回的model结构和svmpredict函数的输出,帮助读者理解LIBSVM在MATLAB中的应用。

转自http://apinetree.blog.51cto.com/714152/1560254

1) 从LIBSVM的官网http://www.csie.ntu.edu.tw/~cjlin/libsvm/上下载最新版本的LIBSVM,当前版本为libsvm-3.18.zip

2) 解压压缩包到电脑上一位置,如:C:\Program Files\libsvm-3.18

3) 假设你使用的是64位的操作系统和matlab。此时将libsvm-3.18文件夹下的windows目录添加到matlab目录中。即在matlab目录中添加:C:\ProgramFiles\libsvm-3.18\windows。因为windows下包含了matlab可执行的二进制文件libsvmread.mexw64/libsvmwrite.mexw64/svmpredict.mexw64/svmtrain.mexw64

4) 假设你使用的是32位操作系统和matlab,则需要自己编译相应的二进制文件。

在matlab命令窗口输入

        >>mex –setup

这时matlab会提示你选择编译mex文件的c/c++编译器(先输入n,再选择对应的编译器)。

        选择一个你电脑上安装的c/c++编译器,例如Microsoft Visual C++ 2010

将matlab当前目录设置为:cd ‘C:\Program Files\libsvm-3.18\matlab’

        输入命令make

这时你会看到当前目录生成了二进制文件(4个):       

        libsvmread.mexw32

        libsvmwrite.mexw32

        svmpredict.mexw32

        svmtrain.mexw32

将当前目录添加到matlab路径中即可。

5) 例子一个测试

        注意到libsvm-3.18下有一个数据文件,名称为heart_scale。这是一个libsvm格式的数据文件。可使用libsvmread函数将其转化为matlab格式。

可使用以下命令测试:

        [heart_scale_label,heart_scale_inst]=libsvmread('heart_scale');

        model = svmtrain(heart_scale_label,heart_scale_inst, '-c 1 -g 0.07');

        [predict_label, accuracy, dec_values] =svmpredict(heart_scale_label, heart_scale_inst, model); % test the trainingdata

如果出现一行:Accuracy = 86.6667% (234/270) (classification)。就说明成功了。就可以在matlab中使用svm了。

6) svmtrain函数相关参数说明

        svmtrain函数返回的model可以用来对测试数据集进行预测。这是一个结构体变量,主要包括了以下几个域。[Parameters, nr_class, totalSV, rho, Label, ProbA, ProbB, nSV,sv_coef, SVs]。英文说明如下:

       -Parameters: parameters

       -nr_class: number of classes; = 2 for regression/one-class svm

       -totalSV: total #SV

       -rho: -b of the decision function(s) wx+b

       -Label: label of each class; empty for regression/one-class SVM

       -ProbA: pairwise probability information; empty if -b 0 or in one-classSVM

       -ProbB: pairwise probability information; empty if -b 0 or in one-classSVM

       -nSV: number of SVs for each class; empty for regression/one-class SVM

       -sv_coef: coefficients for SVs in decision functions

       -SVs: support vectors

        如果没有指定’-b 1’选项则ProbA和ProbB为空矩阵。此外,当指定’-v’选项时,返回的model是一个数值,是cross-validation的准确率。

        其中model.paramter是一个5X1的向量,model.Parameters参数意义从上到下依次为:

        -s svm类型:SVM设置类型(默认0)

        -t 核函数类型:核函数设置类型(默认2)

        -d degree:核函数中的degree设置(针对多项式核函数)(默认3)

        -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)

        -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)

7)svmpredict函数参数说明

        svmpredict函数返回三个值:

  1. predict_label,是训练集预测得到的label向量。

  2. accuracy,是一个3维的向量,从上到下分别是:分类准率(分类问题中用到的参数指标);平均平方误差(MSE (mean squared error)) (回归问题中用到的参数指标);平方相关系数(r2 (squared correlation coefficient))(回归问题中用到的参数指标)。

  3. 输出是个矩阵,包含着决策值或者是概率估计(当’-b 1’被指定时)。当训练数据有k类时,决策值矩阵是一个n行k*(k-1)/2列的矩阵(n为测试数据集个数,k为类别数),而每一行的输出是k*(k-1)/2个二分类器的结果。当’-b 1’被指定时,概率估计矩阵是一个n行k类的矩阵(n为测试数据集个数,k为类别数),每一行的输出是该测试数据属于每个类的概率。

  4. 本文出自 “松鼠” 博客,请务必保留此出处http://apinetree.blog.51cto.com/714152/1560254

好的,首先需要对数据集进行加载和预处理。我们可以使用Spark的ML库中的`LibSVMVectorReader`读取数据集文件,并将其换为DataFrame格式。 ```python from pyspark.ml.classification import MultilayerPerceptronClassifier from pyspark.ml.evaluation import MulticlassClassificationEvaluator from pyspark.ml.feature import VectorAssembler from pyspark.ml.linalg import Vectors from pyspark.ml.feature import StringIndexer from pyspark.ml.feature import IndexToString from pyspark.ml.feature import StandardScaler from pyspark.ml import Pipeline # 读取训练数据集和测试数据集 train_data = spark.read.format("libsvm").load("/data/mnist_train.libsvm") test_data = spark.read.format("libsvm").load("/data/mnist_test.libsvm") # 对数据进行预处理 assembler = VectorAssembler(inputCols=train_data.columns[1:], outputCol="features") scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures", withStd=True, withMean=False) labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(train_data) labelConverter = IndexToString(inputCol="prediction", outputCol="predictedLabel", labels=labelIndexer.labels) train_data = assembler.transform(train_data) test_data = assembler.transform(test_data) scalerModel = scaler.fit(train_data) train_data = scalerModel.transform(train_data) test_data = scalerModel.transform(test_data) ``` 接着,我们可以定义一个多层感知机分类器,并使用训练数据集对其进行训练。 ```python # 定义多层感知机分类器 layers = [784, 128, 64, 10] trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=1234) # 训练模型 model = trainer.fit(train_data) ``` 最后,我们可以使用测试数据集对模型进行评估,并计算识别精度。 ```python # 对测试数据集进行预测 predictions = model.transform(test_data) # 计算识别精度 evaluator = MulticlassClassificationEvaluator(predictionCol="prediction", labelCol="indexedLabel", metricName="accuracy") accuracy = evaluator.evaluate(predictions) print("Test Error = %g" % (1.0 - accuracy)) ``` 完整代码如下: ```python from pyspark.ml.classification import MultilayerPerceptronClassifier from pyspark.ml.evaluation import MulticlassClassificationEvaluator from pyspark.ml.feature import VectorAssembler from pyspark.ml.linalg import Vectors from pyspark.ml.feature import StringIndexer from pyspark.ml.feature import IndexToString from pyspark.ml.feature import StandardScaler from pyspark.ml import Pipeline # 读取训练数据集和测试数据集 train_data = spark.read.format("libsvm").load("/data/mnist_train.libsvm") test_data = spark.read.format("libsvm").load("/data/mnist_test.libsvm") # 对数据进行预处理 assembler = VectorAssembler(inputCols=train_data.columns[1:], outputCol="features") scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures", withStd=True, withMean=False) labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(train_data) labelConverter = IndexToString(inputCol="prediction", outputCol="predictedLabel", labels=labelIndexer.labels) train_data = assembler.transform(train_data) test_data = assembler.transform(test_data) scalerModel = scaler.fit(train_data) train_data = scalerModel.transform(train_data) test_data = scalerModel.transform(test_data) # 定义多层感知机分类器 layers = [784, 128, 64, 10] trainer = MultilayerPerceptronClassifier(maxIter=100, layers=layers, blockSize=128, seed=1234) # 训练模型 model = trainer.fit(train_data) # 对测试数据集进行预测 predictions = model.transform(test_data) # 计算识别精度 evaluator = MulticlassClassificationEvaluator(predictionCol="prediction", labelCol="indexedLabel", metricName="accuracy") accuracy = evaluator.evaluate(predictions) print("Test Error = %g" % (1.0 - accuracy)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值