机器学习之SVM多分类

实验要求
数据说明 :数据集data4train.mat是一个2*150的矩阵,代表了150个样本,每个样本具有两维特征,其类标在truelabel.mat文件中,trainning sample 图展示了理想的分类类结果;
方案选择:
选择并实现一种两分类方法(如感知机方法,SVM等);在此基础上设计使用该二分类器实现三分类问题的策略,并程序实现,画出分类结果
直接采用现成的可实现多分类的方法(如多类SVM,BP网络等)进行问题求解。画出分类结果。我选择第二种,时间不够,只能使用sklearn中的svc实现

实现思想
一对一:
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
优点:不需要重新训练所有的SVM,只需要重新训练和增加语音样本相关的分类器。在训练单个模型时,速度较快。
缺点:所需构造和测试的二值分类器的数量关于k成二次函数增长,总训练时间和测试时间相对较慢。

一对多
训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
**优点:**训练k个分类器,个数较少,其分类速度相对较快。
缺点:
①每个分类器的训练都是将全部的样本作为训练样本,这样在求解二次规划问题时,训练速度会随着训练样本的数量的增加而急剧减慢;
②同时由于负类样本的数据要远远大于正类样本的数据,从而出现了样本不对称的情况,且这种情况随着训练数据的增加而趋向严重。解决不对称的问题可以引入不同的惩罚因子,对样本点来说较少的正类采用较大的惩罚因子C;
③还有就是当有新的类别加进来时,需要对所有的模型进行重新训练

层次树:
首先将所有类别分为两个类别,再将子类进一步划分为两个次级子类,如此循环下去,直到所有的节点都只包含一个单独的类别为止,此节点也是二叉树树种的叶子。该分类将原有的分类问题同样分解成了一系列的两类分类问题,其中两个子类间的分类函数采用SVM。

我这里选择一对多,因为只有三类

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/7/2 23:25
# @Author : 朱红喜
# @File : Multi-classify.py
# @Software: PyCharm

# 引入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier

from FileUtil import FileUtil

# 加载数据
# 1.训练模型的数据
X = FileUtil.open_matfile("data4train.mat").T # 数据集
y = FileUtil.open_matfile("truelabel.mat") # 真实标签
print(X)
print(y[0])
print(y.shape)

# 2.测试模型的数据
X_2 = FileUtil.open_matfile("data4test.mat").T
y_2 = FileUtil.open_matfile("testtruelabel.mat")
print(X_2)
print(y_2[0])
print(y_2.shape)

# 标签二值化
y = label_binarize(y[0], classes=[1, 2, 3])
# print(y)

# 划分训练集和测试集
# 设置种类
n_classes = y.shape[1]
# print(y.shape[1])

# 训练模型并预测
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
# 随机化数据,并划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)

# 训练模型
# Learn to predict each class against the other
model = OneVsRestClassifier(svm.SVC(kernel=‘linear‘, probability=True, random_state=random_state))
clt = model.fit(X_train, y_train)

# 性能评估
# 1.在训练集上的得分
clt.score(X_train, y_train)
print(clt.score(X_train, y_train))

# 2.在测试集上的评分
clt.score(X_test, y_test)
print(clt.score(X_test, y_test))

# 查看各类别的预测情况
y_predict_scores = clt.decision_function(X_test)
print(y_predict_scores[:149])

# 转化为原始标签模式
result = np.argmax(clt.decision_function(X_test), axis=1)[:149]
# print(result)
# 转化为老师需要的 1,2,3类标
for i in range(result.__len__()):
result[i] = result[i]+1

print(result)

print("++++++++++++++++++++++data4train数据集++++++++++++++++++")
result_2 = np.argmax(clt.decision_function(X), axis=1)[:149]
# print(result_2)
# 转化为老师需要的 1,2,3类标
for i in range(result_2.__len__()):
result_2[i] = result_2[i]+1
print(result_2)

print("++++++++++++++++++++++data4test测试集++++++++++++++++++")
result_2 = np.argmax(clt.decision_function(X_2), axis=1)[:59]
# print(result_2)
# 转化为老师需要的 1,2,3类标
for i in range(result_2.__len__()):
result_2[i] = result_2[i]+1
print(result_2)

分类结果

原文地址:https://www.cnblogs.com/liuys635/p/11183827.html

时间: 2024-10-11 13:34:27

机器学习之SVM多分类的相关文章

吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm from sklearn.model_selection import train_test_split def load_data_classfication(): ''' 加载用于分类问题的数据集 ''' # 使用 scikit-learn 自带的 iris 数据集 iris=datasets.lo

机器学习:SVM做多分类问题

引言 SVM做二分类问题很简单明了,但是如何用二分类构建多分类问题,自己查找了部分资料,发现普遍分为两种,一种是直接法,直接求解多目标函数优化问题,但这种方法计算量很大,不实用,另外一种是间接法,通过多个二分类来实现多分类,常见的有一对多和一对一两种 最后针对一对一要构建n平方个二分类器,如果n过大,那么分类器个数过多的情况,提出一种有向无环图的方法,这种方法只需要构建n个分类器,但存在误差累计的问题 直接法求多目标优化问题(不实用) 一次性考虑所有样本,并求解一个多目标函数的优化问题,一串心得

机器学习笔记——SVM之一

SVM(Support Vector Machine),中文名为 支持向量机,就像自动机一样,听起来异常神气,最初总是纠结于不是机器怎么能叫"机",后来才知道其实此处的"机"实际上是算法的意思. 支持向量机一般用于分类,基本上,在我的理解范围内,所有的机器学习问题都是分类问题.而据说,SVM是效果最好而成本最低的分类算法. SVM是从线性可分的情况下最优分类面发展而来的,其基本思想可以用下图表示: (最优分类面示意图) 图中空心点和实心点代表两类数据样本,H为分类线

搜索引擎——用户搜索意图的理解及其难点解析,本质是利用机器学习用户的意图分类

用户搜索意图的理解及其难点解析 搜索引擎涉及的技术非常的繁复,既有工程架构方面的,又有算法策略方面的.综合来讲,一个搜索引擎的技术构建主要包含三大部分: 对 query 的理解 对内容(文档)的理解 对 query 和内容(文档)的匹配和排序 (点击放大图像) 我们今天主要探讨其中的 Query Understanding,即对 query 的理解.对 query 的理解, 换句话说就是对用户搜索意图的理解.先看垂直搜索中的一些例子: "附近的特价酒店" "上海到扬州高速怎么

SVM多分类

http://www.matlabsky.com/thread-9471-1-1.htmlSVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器.目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类.这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中:另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方

CS231N-线性回归+svm多分类+softmax多分类

CS231N-线性回归+svm多分类+softmax多分类 计算机视觉 这一部分比较基础,没有太多视觉相关的.. 1.线性回归 假定在著名的 CIFAR10数据集上,包含10类数据.每类数据有10000条? 目标是输入一个图片,通过模型给出一个label.线性回归的思想就是 得到到F(x)作为某个类别的分数.那么针对每个可能的label都经过一个线性函数输出一个分值,那么我们选最大的其实就是最有可能的分数. 为什么这么做是合理的? 角度1: 每个种类一个 template,每个线性函数的W的训练

机器学习 (一)------分类

机器学习 (一)------分类 机器学习分类 机器学习分为监督学习和无监督学习两类. 监督学习是指在有标记的样本上建立机器学习的模型(这类算法知道预测什么,即目标变量的分类信息). 无监督学习恰恰相反,是指没有标记的数据上建立学习模型. 主要任务: 分类:主要任务是将实例数据划分到合适的分类中. 回归:例如数据拟合曲线(根据给定数据点的最优拟合曲线),主要用于预测数值型数据. 如何选择合适的算法: 从上表中选择实际可用的算法,要考虑以下两个方面的问题: 1.使用机器学习算法的目的,想要算法完成

机器学习-正则化+回归与分类辨析

机器学习-正则化+回归与分类辨析 这篇文章是对自己早期一篇讲正则化和回归的补充.当时写作那篇文章的时候自己还刚刚入门机器学习,许多知识是理解了,但是缺少从一定的高度上的总结.结合这篇来看原来的那篇,不容易乱. 首先要明确,正则化不是回归的专利,回归和分类都是可以使用的.在回归中使用正则化就是岭回归(L2正则化)和Lasso(L1正则化),在分类中使用就是我们常见的loss function中的正则项了(其实还有一个方面的应用,知乎这位答主提到了,就是直接构造loss function,例如L1正

机器学习:SVM分类数据偏斜问题

? ? 引言 ? ? 自己之前做认证分析的时候,存在一个问题就是需要把一个用户的数据作为合法用户,将其余用户的数据作为非法用户,那么这样的话分类结果就会存在数据偏斜问题,虽然自己采取的方法是从所有非法用户中随机抽取与合法用户样本数差不多的非法样本数输入进分类器,但自己也想了解一下如何解决这种数据偏斜问题,找到的方法记录如下 ? ? 问题描述 ? ? 参与分类的两个类别样本数量差异很大,比如说正类有10,000个,负类只有100个 ? ? 由于负类样本较少,算出的分类面会偏向于负类方向 ? ? 解