统计学习中感知机的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 ...
随机推荐
- Oracle EBS 初始化用户密码(转)
---修改密码,并且将限制用户下次登录的时候(第一次登录),强制要换一个新的口令: ---此过程可以完全模拟我们在标准用户的Form里面初始化用户的密码的动作! ---最后要说明的是,这个处理过程是通 ...
- Android应用开发中出现appcompat-v7错误
博客Melon麦东=原创记录 经常很多朋友在Android应用开发过程中,遇到创建的好的Android工程,出现appcompat-v7错误,这因为Android从5.0开始,引入了此项目库,解决方案 ...
- 2.多线程-GCD
1.基本概念 同步任务:在当前线程按顺序执行,不开启新的线程 异步任务:有开新线程的欲望 串行队列:一个一个执行 并行队列:多个任务同时执行 --------------------------- ...
- django和apache交互的wsgi分析
很多django程序员会用django进行web程序的开发,会用django的命令行命令进行程序的调试,但不会将simpleserver换成apache的配置,也有很多django程序员知道怎么用ws ...
- java第三次作业
import java.util.Scanner; public class Practice { public static void main(String[] args) { int nextV ...
- 下拉菜单demo---参考阿里云首页顶部下拉菜单
前言: 最近开始学习html+css,准备仿照各大网站写一些demo. 正文: 分析阶段: 如下图: 链接来自于: 阿里云:https://www.aliyun.com/ 实现过程: (一)用css3 ...
- Map三种遍历方式
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
- 谈谈我印象中的JVM不足之处
研究JVM也有一段时间了,其间也发现了它的很多不足之处,在此一一道来,由于本人对JVM的理解有限,如有错误的地方,还请大家指正:本文不介绍名词性术语和概念性知识,如有不了解的地方可Search Goo ...
- s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...
- PHP动态图像的创建要如何实现呢?
with-gd=[/path/to/gd] --with-jpeg-dir=[/path/to/jpeg-6b] --with-t1lib=[/path/to/t1lib] 完成添加后执行make命 ...