理论部分见:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/17/2591592.html
http://blog.csdn.net/sunmenggmail/article/details/7445035
//这个版本的代码仅可以算是初步实现,一些代码优化还有停止条件的选择还有待改进。
#include <iostream>
#include <cmath>
using namespace std;
#define N 12 //样本空间大小
#define C 4 //惩罚参数
#define M 2 //样本维数
double b = 4;//原始问题常数参数b
double W[M]; //原始问题参数
double A[N] = {0}; //初始化对偶问题参数
//训练样本
double X[N][M] = {
{1, 2},
{1, 1},
{-2, 2},
{2, 1},
{-2, 1},
{-1, 1},
{1, 4},
{2, 3},
{3, 2},
{-1, 4},
{-2, 3},
{-3, 2}
};
double Y[] = {-1, -1, -1,-1,-1,-1, 1, 1, 1, 1, 1, 1};
//kernel tricks
double Kernel (double *x, double *y, int length)
{
double sum = 0;
for (int k = 0; k < M; k++)
sum += pow(x[k] * y[k] ,2);//将x=(x1, x2)映射到z = (z1, z2) = (x1*x1, x2*x2)上,将x空间的椭圆变换成新空间里的直线,当然,这只是实验,核函数还有很多,具体选什么样的核函数还要视情况而定。
//return pow(sum, 2);
return sum;
}
//kernel tricks for samples
double K (int i, int j)
{
return Kernel(X[i], X[j], M);
}
//tool function
double Convert(double *x)
{
int j = 0;
double sum = 0;
for (j = 0; j < N; j++)
{
sum += A[j] * Y[j] * Kernel(X[j], x, M);
}
return sum;
}
//求Ei
double E(int i)
{
return Convert(X[i]) + b - Y[i];
}
//求函数间隔,与Ei仅差一个Yi
double g(double *x)
{
return Convert(x) + b;
}
//选择两个变量进行坐标下降
bool choose(int &a1, int &a2)
{
int i;
for (i = 0; i < N; ++i)
{
//选择违反KKT的a作为第一个的变量
if ((A[i] == 0 && Y[i] * g(X[i]) < 1) || (A[i] < C && A[i] > 0 && Y[i] * g(X[i]) != 1) || (A[i] == C && Y[i]*g(X[i]) > 1))
{
a1 = i;
break;
}
else if( i == N - 1)
{
return true; //当所有参数都满足KKT时停止,无法满足时?TODO:将可行间隙比率 增加为停止条件
}
}
double e1 = E(a1);
double e, e2, max = 0;
for (i = 0; i < N; i++)
{
if (i != a1)
{
e = E(i);
if (abs(e1-e) > max)
{
max = abs(e1 - e);
a2 = i;
e2 = e;
}
}
}
double L, H;
if (Y[a1] != Y[a2])
{
L = A[a2] - A[a1] > 0 ? A[a2] - A[a1] : 0;
H = C + A[a2] -A[a1] < C ? C + A[a2] -A[a1] :C;
}
else
{
L = A[a2] + A[a1] - C > 0 ? A[a2] + A[a1] - C : 0;
H = A[a2] + A[a1] < C ? A[a2] + A[a1] :C;
}
double temp = A[a2] + Y[a2] * (e1 - e2) / (K(a1, a1) + K(a2, a2) -2 * K (a1, a2));
double old = A[a2];
A[a2] = temp < L ? L : (temp > H ? H : temp); //更新a2
A[a1] = A[a1] + Y[a1]* Y[a2] * (old - A[a2]);//更新a1
return false;
}
double compute_b(int num, int a1, int a2)
{
double sum = 0;
int t = num == 1 ? a1: a2;
for (int i = 0; i < N; i++)
{
if (i != a1 && i!= a2)
sum += A[i] * Y[i] * K(i, t);
}
return Y[t] - sum - A[a1] * Y[a1] * K(a1, t) - A[a2] * Y[a2] * K(a2, t);
}
//SMO 算法解最优化对偶问题
void SMO()
{
int a1, a2;
double b1, b2;
int i =0;
while(true)
{
i++;
if (i > 100)
break;//当停止条件改进后,就不再需要
if (choose(a1, a2))
{
//满足KKT就停止
return;
}
else//更新b
{
b1 = compute_b(1, a1, a2);
b2 = compute_b(2, a1, a2);
if ((A[a1] < C && A[a1] > 0) && (A[a2] < C && A[a2]) > 0)
{
b = b1 ;
}
if ((A[a1] == 0 || A[a1] == C) && (A[a2] == 0 || A[a2] == C) )
{
b = (b1 + b2) / 2;
}
}
}
}
int main()
{
SMO();
double test[] = {0, -5};
cout << g(test) << endl;
return 0;
}
实验结果为:2.94999 ,说明(0,-5)点是正的,其他结果同样可以验证。
SVM分类结果图:
分享到:
相关推荐
监督学习中,你会了解到诸如线性回归、逻辑回归、支持向量机(SVM)以及各种决策树和随机森林等算法;无监督学习则涵盖聚类算法,如K-means和层次聚类;而半监督学习和强化学习在实际应用中也有其独特价值。 接着,...
例如,对于历史数据和当前数据的预测任务,可能更适合使用传统的机器学习方法,如线性回归、决策树、支持向量机(SVM)和神经网络。而图像、视频和信号数据中的对象或动作识别任务,则更适合使用深度学习方法,如...
2. 分类算法:源代码可能涵盖了多种分类算法,如逻辑回归(LogisticRegression)、支持向量机(SVM)、决策树(DecisionTreeClassifier)、随机森林(RandomForestClassifier)等。这些算法的实现可以帮助我们理解...
svm支持向量机python代码 机器学习语义分割-随机森林,支持向量机,GBC Machine learning semantic segmentation - Random Forest, SVM, GBC.zip
Scikit-Learn是Python中最广泛使用的机器学习库之一,它包含了大量预训练的机器学习模型,如线性回归、逻辑回归、支持向量机、决策树以及集成方法如随机森林和梯度提升。该书将详细介绍如何利用Scikit-Learn进行数据...
接着,书中会介绍监督学习中的各种算法,如线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林以及集成方法如梯度提升(Gradient Boosting)。每个算法都会配合详尽的实例,帮助读者理解其工作原理和应用场景...
在监督学习中,我们将学习如何使用Scikit-Learn处理分类和回归问题,例如线性回归、逻辑回归、支持向量机(SVM)和决策树等算法。无监督学习则涉及聚类和降维技术,如K-Means、PCA(主成分分析)等。 Scikit-Learn...
在Scikit-Learn部分,你将学到如何使用各种经典的机器学习算法,例如线性回归、逻辑回归、决策树、随机森林、支持向量机(SVM)和梯度提升等。对于数据预处理,你将学习特征缩放、缺失值处理、编码分类变量等技术。...
5. **支持向量机(SVM)**:从感知机到支持向量机(SVM),是一个从简单到复杂的进化过程。SVM是强大的分类和回归工具,尤其在处理非线性问题时表现出色。sklearn中的`SVM`模块包含了多种SVM变体,如`LinearSVC`和`...
如线性回归、逻辑回归、支持向量机(SVM)、决策树和随机森林等模型。 2. 无监督学习:接着讨论了聚类和降维方法,如K-means、DBSCAN、PCA(主成分分析)和t-SNE(t分布随机邻域嵌入)。 二、数据预处理 1. 数据...
##### 一类别支持向量机(One-Class SVM) - **应用场景**:适用于数据集中大部分样本为正常类别的场景,通过训练模型来识别异常值。 - **特点**: - 训练速度快。 - 对于特征数量超过100的情况表现良好。 - 边界...
2. 监督学习:如线性回归、逻辑回归、支持向量机(SVM)、决策树和随机森林等模型,以及如何使用交叉验证来优化模型参数。 3. 无监督学习:包括聚类算法如K-Means和DBSCAN,以及降维技术如主成分分析(PCA)。 4. ...
支持向量机(Support Vector Machine,简称SVM)是一种强大的监督学习算法,广泛应用于分类和回归问题。在本示例中,“葡萄酒支持向量机SVM分类”是利用SVM来对葡萄酒数据进行分类的实践项目。这个压缩包可能包含了...
监督学习包括常见的线性回归、逻辑回归、决策树、随机森林、支持向量机(SVM)和各种神经网络模型,如人工神经网络(ANN)、卷积神经网络(CNN)和循环神经网络(RNN)。无监督学习则涉及聚类算法,如K-means、...
3. 监督学习:包括线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林、梯度提升(Gradient Boosting)等算法,这些算法可以用于分类和回归任务。 4. 无监督学习:如聚类(K-Means、DBSCAN)、主成分分析...
7. **支持向量机(Support Vector Machines, SVM)**:在练习7中,SVM作为一个强大的分类和回归工具会被介绍,包括核方法和软间隔概念。 8. **决策树(Decision Trees)与随机森林(Random Forests)**:最后的练习...
为解决有限样本学习问题提供了一个统一的框架,它能将很多现有方法纳入其中,同时,在这一理论基础上发展了一种新的通用学习方法——支持向量机(Support Vector Machine 或 SVM),它已初步表现出很多优于已有方法的...
使用多种方法完成MNIST分类任务 Python 3.6 Pytorch 1.0 Scikit-learn 0.21 无需下载数据直接跑,代码自动下载 逻辑回归 Logistic Regression ...支持向量机 SVM 卷积神经网络 CNN 循环神经网络 RNN
支持向量机(Support Vector Machine,简称SVM)是一种广泛应用于分类和回归分析的监督学习算法,尤其在处理小样本和高维数据时表现出色。本文将深入浅出地介绍SVM的核心概念、工作原理以及三层理解境界。 一、基本...