转自 Koala++'s blog 感谢原作者

移动超平面是非常好的一种模拟数据流的方法(我感觉它应该是最好的),倒不是它没有缺点,只是别的模拟方法实在是有点差劲。

自己写的程序又一次在硬盘的结束中逝去了,还好找到一个更强大的数据流构造的程序集(不过对于我需要的移动超平面来说,它是相当的弱,以前我写的程序可以产生很多种变化,而且使用非常方便)。下面是链接:

http://www.cs.waikato.ac.nz/~abifet/MOA/software.html(MOA的页面)

http://sourceforge.net/projects/moa-datastream/(下载地址)

它里面实现了Hoeffding树,我也看过VFDT,cVFDT,还有一个改进版本VFDTc,反正我是不喜欢他那种方式,我这次讲的是他其中产生数据流的一个程序:HyperPlaneGenerator(在wDriftGenerators.zip包中),它是VFDT的作者提出的,在Wang那篇经典论文中也用的是这种方法。

我自己写了两行代码,让它先能运行起来:

publicvoid write2File( String path, int N )

{

HashMap<Integer,Instance> map = new HashMap<Integer,Instance>();

generateHeader();

restart();

for( int i = 0; i < N; i++ )

{

map.put( i, nextInstance() );

}

try{

File file = new File( path );

FileWriter filewriter = new FileWriter( file, false );

filewriter.write( streamHeader.toString() );

for( int i = 0; i < N; i++ )

{

filewriter.write( map.get( i  ) + "\n" );

}

filewriter.close();

}catch( Exception e )

{

e.printStackTrace();

}

}

public static void main(String[] args) {

HyperplaneGenerator g = new HyperplaneGenerator();

g.write2File(".//data.arff", 10000);

}

你可能会想,我产生一亿条样本,难道我这把这一亿条样本的数据集读到内存里吗?当然不是了,你自己把这一亿个样本拆开分成几个数据集不就行了。另外,自己用数学软件看一下数据漂移的变化规律,在对数据都不了解的情况下,产生10000和1000000000个样本是没有区别的。

下面介绍一下代码:

public void restart() {

this.instanceRandom = new Random(this.instanceRandomSeedOption

.getValue());

this.weights = new double[this.numAttsOption.getValue()];

this.sigma = new int[this.numAttsOption.getValue()];

for (int i = 0; i < this.numAttsOption.getValue(); i++) {

this.weights[i] = this.instanceRandom.nextDouble();

this.sigma[i] = (i < this.numDriftAttsOption.getValue() ? 1 : 0);

}

}

Restart是初始化权重(weights)和概念漂移时权重变大还是变小(sigma,也就是原文说的:specify the total number of demensions whose weights are changing),也许你会奇怪,为什么这个函数不叫init,start,我猜是因为它还可能会在渐变(Gradual)漂移的同时产生突变(Abrupt)漂移,或是什么Recur之类的漂移。

Public Instance nextInstance() {

int numAtts = this.numAttsOption.getValue();

double[] attVals = newdouble[numAtts + 1];

double sum = 0.0;

double sumWeights = 0.0;

for (int I = 0; I < numAtts; i++) {

attVals[i] = this.instanceRandom.nextDouble();

sum += this.weights[i] * attVals[i];

sumWeights += this.weights[i];

}

int classLabel;

if (sum >= sumWeights * 0.5) {

classLabel = 1;

} else {

classLabel = 0;

}

//Add Noise

if ((1 + (this.instanceRandom.nextInt(100))) <=

this.noisePercentageOption.getValue()) {

classLabel = (classLabel == 0 ? 1 : 0);

}

Instance inst = new Instance(1.0, attVals);

inst.setDataset(getHeader());

inst.setClassValue(classLabel);

addDrift();

return inst;

}

这段代码就是产生一个样本,代码非常简单(其实上这一切都很简单),sum是权重向量与样本向量的乘积,sumWeights是权重之和,如论文中所述,大于权重之和1/2就是正例,小于权重1/2就是负例。将样本的类别进行反转的方式产生噪音。最后调用addDrift进行漂移处理。

privatevoid addDrift() {

for (int i = 0; i < this.numDriftAttsOption.getValue(); i++) {

this.weights[i] += (double) ((double) sigma[i])

* ((double) this.magChangeOption.getValue());

if (//this.weights[i] >= 1.0 || this.weights[i] <= 0.0 ||

(1 + (this.instanceRandom.nextInt(100))) <=

this.sigmaPercentageOption

.getValue()) {

this.sigma[i] *= -1;

}

}

}

这里有两个问题,第一,原论文中并没有说明,漂移的维是固定的几个维在漂移,还是一会这一些在漂移,下一次另一些在漂移,这其实也很好理解,固定的几个维能比较真实的模拟现实中的概念漂移,乱漂移的这种我还想不出来现实中什么漂移是这样的。第二,代码中有一行注释,这行注释是很重要的,加与不加区别是很大的,规律也不是很清楚,用数学软件自己看一下就明白了。

数据流-移动超平面(HyperPlane)构造相关推荐

  1. 论文浅尝 | 基于超平面的时间感知知识图谱嵌入

    链接:http://talukdar.net/papers/emnlp2018_HyTE.pdf 本文主要关注 KG embedding 中三元组成立的时间有效性问题,比如三元组(Cristiano ...

  2. Support Vector Machine学习笔记

    学习目标 掌握SVM的基本原理以及推导过程 1.SVM的基本原理: SVM本质上是一种二分类模型,基本模型是定义在特征空间中间隔最大的分类器,它的学习/优化目的就是使得这个间隔最大化. 为什么要使间隔 ...

  3. 优达学城机器学习之--支持向量机(SVM)

    前言 SVM是支持向量机的简称(Support Vector Machine) 文章目录如下: 简述 选择分隔线 核函数(kernel)及其参数c, gamma 过拟合 over-fitting SV ...

  4. 使用决策树进行个人信用风险评估

    决策树方法介绍 决策树简介 决策树(decision tree)是一种基本的分类与回归方法.如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块( ...

  5. 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)

    文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...

  6. 机器学习二:支持向量机

    支持向量机 1. 介绍 2. 对偶问题 3. 非线性数据 3.1 核函数与核技巧 3.1.1 数学解释 3.1.2 几种常用的核函数 4. SVM 响应离群点 4.1 软间隔 4.2 正则化 4.3 ...

  7. 机器学习常用术语词汇表

    EOF是一个计算机术语,为End Of File的缩写 ,在操作系统中表示资料源无更多的资料可读取. 刚接触机器学习框架 TensorFlow 的新手们,这篇由 Google 官方出品的常用术语词汇表 ...

  8. Google发布机器学习术语表 (中英对照)

    来源 | TensorFlow Google 工程教育团队已经发布了多语种的 Google 机器学习术语表,该术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义.语言版本包括西班 ...

  9. 超全汇总!机器学习常用术语词汇表

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 刚接触机器学习框架 TensorFlow 的新手们,这篇由 Goo ...

  10. 支持向量回归_量化投资学习笔记22——回归分析:支持向量机

    支持向量机(Support Vector Machine, SVM)是一种基于统计学习的模式识别的分类方法,主要用于模式识别.所谓支持向量指的是在分割区域边缘的训练样本点,机是指算法.就是要找到具有最 ...

最新文章

  1. git 换行问题_后端必备的 Git 分支开发规范指南
  2. kail安装和vmtools安装
  3. vue2 切换路由时 页面滚动到顶部 用游览器返回时 记住上页的位置
  4. MM--关于STO步骤和配置
  5. 基于TMS320VC5507的语音识别系统实现
  6. CSS背景图像的简单响应
  7. 浅谈Android垃圾回收机制
  8. 【编译原理】自上而下语法分析(C/C++源码+实验报告)
  9. 腾讯云账户注销操作教程
  10. 将自己的数据制作成cityscape格式
  11. AH快递单打印软件(顺丰申通圆通韵达中通天天EMS) 3.77
  12. Monash call:概述生物特征识别
  13. 程序员的岗位路线规划,不止是编程?
  14. 计算机无法搜索文件夹内容,系统我的电脑中文件夹和搜索选项无法使用的解决方法...
  15. 什么是 GPU 加速的计算?
  16. IKVM.NET的妙手偶得
  17. python爬取网易云音乐评论分析_Python爬取网易云音乐评论(附加密算法)
  18. Android蓝牙开发之一:打开、关闭蓝牙
  19. 计算机如何改变原子排列方式,新的原子分组方式预示着新的材料、药物和计算机...
  20. 【python数据分析】足球运动员的特征分析

热门文章

  1. 数据结构-银行业务模拟系统
  2. SpringBoot整合Redis_Jedis版(二十)
  3. C++-类的六个默认成员函数及其性质
  4. Mac设置鼠标滚轮方向
  5. 根据前序序列和中序序列重建二叉树
  6. 七个 ios 上的 android 模拟器
  7. C语言之switch语句用法
  8. UEFI与BIOS GPT与MBR 科普
  9. 锦鱼课堂:跪着赚快钱,一年20W你愿意吗?
  10. Java实习生工作总结(一)