我们继续第6篇的无监督属性过滤器的函数介绍。
Interquartile,用以指示实例的值是否可以视为离群值或极端值。(具体演算,我们就不实验了)
如果用户指定的极端值系数和四分位距的乘积值高于第75个四分位数之间的差,或低于第25个四分位数,该值就被标识为极端值。
具体看代码,我们在代码中注释了各参数的含义:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import weka.core.Instances;
import weka.filters.unsupervised.attribute.InterquartileRange;
public class Interquartile_test {
public static void main(String[] args) throws IOException, Exception{
// 读入数据
Instances data=new Instances(new BufferedReader(new FileReader("data\\weather.numeric.arff")));
for(int i=0;i<data.numInstances();i++)
System.out.println(data.instance(i));
System.out.println("========Interquartile========");
/*
* 1, 极端值,离群值只有数值变量才进行运算
* 2, 极端值,离群值是就每个记录运算的,如果2个属性,不一致情况下,任意一属性为极端值,那么该记录就是极端值
* 3, 极端值计算使用的变量:
* Q1: 25%位置值
* Q3: 75%位置值
* IQR: Q1-Q3
* OF: 离群因子
* EVF: 极端因子
* 4, Q3 + OF*IQR < x <= Q3 + EVF*IQR 上离群
* 5, x < Q1 - EVF*IQR 下极端
*
* -R 表示属性计算范围
* -O 表示指定离群因子
* -E 表示指定极端因子
* 输出顺序为:离群值标识/极端值标识
*
*/
InterquartileRange in=new InterquartileRange();
in.setOptions(new String[]{"-R","first-last","-O","3","-E","6"});
in.setInputFormat(data);
Instances newdata=weka.filters.Filter.useFilter(data, in);
for(int i=0;i<newdata.numInstances();i++)
System.out.println(newdata.instance(i));
}
}