统计学习中感知机的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;}
转载于:https://www.cnblogs.com/walking-dream/p/4345586.html
统计学习中感知机的C++代码相关推荐
- 【StatLearn】统计学习中knn算法实验(2)
接着统计学习中knn算法实验(1)的内容 Problem: Explore the data before classification using summary statistics orvisu ...
- 《统计学习导论》R语言代码整理
<统计学习导论>R语言代码整理 一.特殊函数 二.基本函数 三.画图 一些函数 一些参数 type pch (plotting character) lty(line types) 特定问 ...
- web前端学习中CSS,JS代码压缩
web前端要学习的知识有很多,前端基础要学习三个部分:HTML,CSS,JavaScript(简称JS),因此首先明确三个概念:HTML负责结构,网页想要表达的内容由html书写. CSS负责样式,网 ...
- 单元测试在深度学习中的应用 | 附代码「AI产品/工程落地」
关注:决策智能与机器学习,深耕AI脱水干货 作者 | Tilman Krokotsch 编译 | ronghuaiyang 报道 | AI公园 导读 本文非常详细的介绍并演示了如何将单元 ...
- 几大知名流量统计网站的统计脚本中相继植入广告代码的现象,严重影响上网体验
近段时间浏览网页时总是实然网页开始播放视频的声音,一开始以为是宽带服务商又强制推送广告或电脑中毒了,经过对源代码的分析发现是流量统计代码中植入了广告代码,最近非常影响网页浏览体验的是百度统计插入的视频 ...
- VCS视频学习中的一个例子代码:dff.v和dff_tb.v
前言 VCS课程中的一个例子! dff.v //r/dff_exp.v module dff_exp(//Inputsinput wire clk_i,input wire rst_l_i,input ...
- 【统计学习方法】统计学习及监督学习概论
1.1 统计学习 1.1.1统计学习的特点 数据对统计学习很重要 学习: 如果一个系统更能够通过执行某个过程改进它的性能 1.1.2 统计学习研究对象 统计学习研究对象:数据 数据的基本假设是同类数据 ...
- 统计学习笔记(1)——统计学习方法概论
1.统计学习 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,也称统计机器学习.统计学习是数据驱动的学科.统计学习是一门概率论.统计学.信息论.计算理论.最优化理 ...
- 统计学习导论(ISLR)(五):重采样方法(交叉验证和bootstrap)
统计学习导论(ISLR) 小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生. 参考资料: The Elements of Statistical Learning An Introdu ...
最新文章
- QT学习第8课:QT计算器界面实现
- 石头剪刀布python代码_我的第一个python程序,石头剪刀布猜拳游戏
- 回望2018,展望2019
- 阿里云(一)云存储OSS的命令行osscmd的安装和使用
- vue打包关闭console.log
- 两个相邻盒子的边框怎么只显示一个_一篇文章带你快速理解盒子模型「经典案例」...
- 微信小程序登录 getUserInfo:fail 登录用户不是该小程序的开发者
- 枚举生成MVC3: Bind Enum To DropDownList ?-java教程
- Linux 定时器设置
- 百度十年,我从技术走到管理
- 软件开发过程中需要的文档汇总
- dx 汇编dec_汇编语言算术指令
- 用html计算长方形的面积公式,长方形面积公式是什么
- c语言n的阶乘 longfact,如何定义函式fact(n) 计算n的阶乘:n!=1*2*……*n,函式返回值型别是double?...
- C++ for循环的几种使用方法
- vim insert VISUAL模式
- 日渐临近的苹果秋季发布会,iOS 11 GM 固件到底提前泄露了哪些秘密?
- 怎么简述计算机网络的含义,事业单位的计算机网络信息管理及实践意义论述
- Android 时间显示控件 TextClock
- 【STM32F429的DSP教程】第6章 ARM DSP源码和库移植方法(MDK5的AC5和AC6)