logistic代码分析

logistic.java

建立模型函数
buildClassifier(Instances train)

获取测试类的实例化对象,在调用测试方法来测试传入的数据集
getCapabilities().testWithFail(train);

将数据集中,所有有缺失数据的记录删除,自带的清洗功能
train = new Instances(train);
train.deleteWithMissingClass();


获取过滤器,此过滤器做缺失值填充
m_ReplaceMissingValues = new ReplaceMissingValues();

设定过滤器对象
m_ReplaceMissingValues.setInputFormat(train);

filter类为过滤器系列顶级静态类,调用过滤静态方法,传入过滤对象与过滤器
train = Filter.useFilter(train, m_ReplaceMissingValues);

获取过滤器,此过滤器做数据类型转换
m_NominalToBinary = new NominalToBinary();

设定过滤器对象
m_NominalToBinary.setInputFormat(train);

静态类调用静态方法,传入过滤对象与过滤器
train = Filter.useFilter(train, m_NominalToBinary);

设置数据集索引列
m_ClassIndex = train.classIndex();

获取数据集标签数量。标签数量的生成,根据对instancetest类的学习,了解到标签数量在生成变量时new Attribute就添加进了Attribute类的全局变量m_Hashtable中,不管用到没有都会添加进去,实际使用中会先对比hashtable内容准备标签。
int nK = m_NumClasses    = train.numClasses() - 1;

获取数据集列数量
int nR = m_NumPredictors = train.numAttributes() - 1;

获取数据集行数量
int nC = train.numInstances();

声明矩阵,一维行,二维列
m_Data = new double[nC][nR + 1];

声明数组,同数据集行数
int [] Y  = new int[nC];

声明数组,同数据集列数即变量数
double [] xMean= new double[nR + 1];

同上
double [] xSD  = new double[nR + 1];

声明数组,同数据集标签数
double [] sY = new double[nK + 1];

声明数据,同数据集行数
double [] weights = new double[nC];


double totWeights = 0;

声明矩阵,一维变量,二维标签数量
m_Par = new double[nR + 1][nK];

 


关于weights权重值,中间插入代码块说明
这是实例化单个instance时的构造方法,传入参数为列数即变量数
  public Instance(int numAttributes) {
   
    m_AttValues = new double[numAttributes];
    for (int i = 0; i < m_AttValues.length; i++) {
      m_AttValues[i] = MISSING_VALUE;
    }
    m_Weight = 1;
    m_Dataset = null;
  }
从代码块看来,weight这个权重属性默认为1,并instance在初始化时将所有列值初始化为默认值MISSING_VALUE

classValue,为一条记录的索引列值

根据行数循环
    for (int i = 0; i < nC; i++) {
从头到尾取出单行
      Instance current = train.instance(i);
取出单行的索引列值
      Y[i] = (int)current.classValue(); 
取出单行的权重
      weights[i] = current.weight();  
将所有行的权重相加
      totWeights += weights[i];
初始化新矩阵每行0下标为1
      m_Data[i][0] = 1;
变量J作列指针使用,第一列已初始化为0
      int j = 1;
根据列数循环,在行循环中的列循环
      for (int k = 0; k <= nR; k++) {
K为循环当前列,if语句判断当前列不是索引列,便进入代码块
 if (k != m_ClassIndex) {
取出单行记录的单个列值,因为此方法一开始调用了三个过滤器过滤数据集,所以可以保证取出来的都是数字型,没有字符串型
   double x = current.value(k);
将列值赋入新矩阵,新矩阵0下标已赋值,所以以J为下标,从下标1开始赋值
   m_Data[i][j] = x;

权重*列值,权重值在生成行时,默认为1,所以xMean为每一列列值的和
   xMean[j] += weights[i]*x;
xSD为每一列列值二次方的和
   xSD[j] += weights[i]*x*x;
下标后移
   j++;
 }
      }
// Class count   
      sY[Y[i]]++; 
    }

函数往下走已经是算法内部处理,目前无法理解,所以打住

weka没有合并instances的功能,不提供各种统计分析检验的算法,可以读取多种数据源

logistic算法内部流程基本搞懂,明天开始尝试造数据调用算法

 

 

 

 

转载于:https://www.cnblogs.com/Anroam/p/3302913.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值