统计学习中感知机的C++代码
感知机是古老的统计学习方法,主要应用于二类线性可分数据,策略是在给定的超平面上对误差点进行纠正,从而保证所有的点都是正确可分的。
用到的方法是随机梯度下降法,由于是线性可分的,可保证最终在有限步内收敛。具体可参考李航的《统计学习方法》
#include<iostream>
#include<algorithm>
#include<vector>
#include<fstream> using namespace std; typedef vector<double> feature;
typedef int label; class PercepMachine
{
private:
vector<feature> dataset;
vector<label> labelset;
double learningrate;
double vector_multi (const feature &x, const feature &y)
{
double sum = 0.0;
for (int i = 0; i != x.size(); ++i)
{
sum += x[i] * y[i];
}
return sum;
}
feature vector_multi(double x, const feature &y)
{
feature temp;
for (int i = 0; i != y.size(); ++i)
{
temp.push_back(x*y[i]);
}
return temp;
}
feature vector_add(const feature &x, const feature &y)
{
feature temp(0);
for (int i = 0; i != x.size(); ++i)
{
temp.push_back(x[i] + y[i]);
}
return temp;
}
public:
feature w;
double b;
PercepMachine(vector<feature> &traindata, vector<label> &trainlabel, feature &startw, double startb, double rate) :dataset(traindata), labelset(trainlabel), w(startw), b(startb), learningrate(rate){}
void calculate_percep();
}; void PercepMachine::calculate_percep()
{
vector<int> flag(dataset.size(), 1);
while (find(flag.begin(), flag.end(), 1) != flag.end())
{
for (int i = 0; i != dataset.size(); ++i)
{
double multi = vector_multi(dataset[i], w);
if ((multi + b)*labelset[i] <= 0)//有误分类点
{
flag[i] = 1;
w = vector_add(w, vector_multi(learningrate*labelset[i], dataset[i]));
b = b + learningrate*labelset[i]; }
else
{
flag[i] = 0;
}
}
}
} int main()
{
ifstream fin("data.txt");
if (!fin)
{
cout << "can not open the file data.txt" << endl;
exit(1);
}
/* input the dataSet 假设是平面数据,存储在txt文件中3列多行,最后一列存储类别信息1或-1*/
int feature_dimension = 2; vector<feature> traindata;
vector<label> trainlabel;
while (!fin.eof())
{
feature temp_data;
double temp;
for (int i = 0; i < feature_dimension; ++i)
{
fin >> temp;
temp_data.push_back(temp);
}
traindata.push_back(temp_data);
label mylabel;
fin >> mylabel;
trainlabel.push_back(mylabel);
}
feature startw(2,1);
double startb = 1.0;
double rate = 0.5; PercepMachine permachine(traindata, trainlabel, startw, startb, rate);
permachine.calculate_percep();
cout << "w=" << "("<<permachine.w[0] << " " << permachine.w[1]<<")" << endl;
cout << "b=" << permachine.b << endl; return 0; }
统计学习中感知机的C++代码的更多相关文章
- 【StatLearn】统计学习中knn算法实验(2)
接着统计学习中knn算法实验(1)的内容 Problem: Explore the data before classification using summary statistics or vis ...
- 【StatLearn】统计学习中knn算法的实验(1)
Problem: Develop a k-NN classifier with Euclidean distance and simple voting Perform 5-fold cross va ...
- 深度学习中正则化技术概述(附Python代码)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 磐石 介绍 数据科学研究者们最常遇见的问题之一就是怎样避免过拟合. ...
- 强化学习中REIINFORCE算法和AC算法在算法理论和实际代码设计中的区别
背景就不介绍了,REINFORCE算法和AC算法是强化学习中基于策略这类的基础算法,这两个算法的算法描述(伪代码)参见Sutton的reinforcement introduction(2nd). A ...
- [译]针对科学数据处理的统计学习教程(scikit-learn教程2)
翻译:Tacey Wong 统计学习: 随着科学实验数据的迅速增长,机器学习成了一种越来越重要的技术.问题从构建一个预测函数将不同的观察数据联系起来,到将观测数据分类,或者从未标记数据中学习到一些结构 ...
- 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化
1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...
- 卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)
卷积可能是现在深入学习中最重要的概念.卷积网络和卷积网络将深度学习推向了几乎所有机器学习任务的最前沿.但是,卷积如此强大呢?它是如何工作的?在这篇博客文章中,我将解释卷积并将其与其他概念联系起来,以帮 ...
- 记录Python学习中的几个小问题
记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...
- 深度学习中的Data Augmentation方法(转)基于keras
在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...
随机推荐
- android 图片压缩
引用:http://104zz.iteye.com/blog/1694762 第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ...
- python学习笔记系列----(七)类
7.1 python类和相关术语的简介 Python 通过最小的新语法和语义在语言中实现了类. 它是 C++ 或者 Modula-3 语言中类机制的混合.类的大多数重要特性都被完整的保留下来:类继承机 ...
- [SQL入门级] 接上篇,继续查询
距离上一篇时间隔得蛮久了,这篇继续查询,简单总结一下聚合函数.分组的知识. 一.聚合函数(组函数/多行函数) 何谓多行函数,顾名思义就是函数作用于多行数据得出一个输出结果,什么意思呢?看图: 那么常用 ...
- Win7下清除SQL SERVER 2008的SSMS保存的登录信息
C:\Users\{用户名}\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\
- HTML入门教程
什么是 HTML? HTML(Hyper Text Markup Language)超文本标记语言,是用来描述网页的一种语言,不是一种编程语言,而是一种标记语言 (markup languag ...
- dr.wondr博士随笔之某古旧非智能机T6XXX 恢复一例
大家好!欢迎再次来到dr.Wonde的微博! 今次我给大家带来索尼爱立信古董机T650i的取证工作展示! 首先请出今天我们的主角索尼爱立信 T650i>> 然后在工厂模式下,连接设备,看图 ...
- MVC,MVP 和 MVVM
复杂的软件必须有清晰合理的架构,否则无法开发和维护.MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 ...
- 放在NSArray、NSDictionary等容器内的对象Item,Item中的property在程序运行过程中被无故释放
可能是被释放的property本身是OC对象而它的属性被误写成assign,例如: @interface MyItem : Object @property (nonatomic, assign) N ...
- Python基础之条件和循环
阅读目录 一.if语句 1.1功能 1.2语法 1.2.1:单分支,单重条件判断 1.2.2:单分支,多重条件判断 1.2.3:if + else 1.2.4:多分支if + elif +else 1 ...
- JavaScript局部变量和全局变量的理解
原文链接:http://www.cnblogs.com/eric-qin/p/4166552.html JavaScript局部变量和全局变量的理解 1 2 3 4 5 6 7 8 9 10 &l ...