Skip to content

Latest commit

 

History

History
433 lines (401 loc) · 11.1 KB

File metadata and controls

433 lines (401 loc) · 11.1 KB

9. Feature selection

function key_na_by_sample(){
  key_replace='sample';
}
function key_na_by_feture(){
  key_replace='feature';
}

get data

function select_data_to_feature_select()
{

//get data;
var data= getinforvalue('training_decision');
var label=getinforlabel('label_decision');
var label_unique=sort_unique(label);
//console.log(label_unique);
//merge_matrix()


merge_array=merge_matrix(data,label);
//console.log(merge_array);
merge_array=shufflearray(merge_array);
//console.log(merge_array);
//
var train_range_ratio=[0,1];
var validate_range_ratio=[0,1];
var train_range=[];
var validate_range=[];
var number=parseInt(train_range_ratio[1]*(data.length)) ;

//train_range_ratio[1]*(data.length);
train_range.push(parseInt(train_range_ratio[0]*(data.length)));
train_range.push(parseInt(train_range_ratio[1]*(data.length)));
//
validate_range.push(parseInt(validate_range_ratio[0]*(data.length)));
validate_range.push(parseInt(validate_range_ratio[1]*(data.length)));

//The data will be one vs rest.
var train=generate_train_validate_data(label_unique,train_range,merge_array);
trainingData =train[0];
trainingLabel=train[1];
var valide=generate_train_validate_data(label_unique,validate_range,merge_array);
validateData=valide[0];
validateLabel=valide[1];

//
var config_model='';
var data=[];
for(var i=0;i<trainingData.length;i++)
  {
    var row=[];
    row.push(trainingData[i][0]);
    var name='model'+i;
    window[name]=feature_select_model(trainingData[i][1]);

    //config_model+='<p>'+trainingData[i][0]+" "+window[name].weight+" intercept"+window[name].intercept+'</p>';
    //proarr=model_data_probability(window[name],validateData[i][1]);
    //rocarray=mljs_validate(proarr,validateLabel[i][1]);
    //row.push(rocarray[3]);
    //row.push(rocarray[1]);
    //row.push(rocarray[2]);
    //console.log(row);
    //data.push(row);
  }
}

function feature_select_model(trainingdata){
  lg1=new lasso();
  lg1.fit(trainingdata);
  return lg1;
}

LASSO

function lasso(){
  this.weight=[];
  this.intercept=Math.random();
  this.loss=[];
  this.ratio=1;

  function exploss(data,weight,intercept)
  {
    var lossv=0;
    var lossarray=[];
   var epowersumarray=[];序列比对
    var exp2_exp3=0;
    var exp1_exp2=0;
    var derivativearray=[];
    var derivativeone=[];
    var hessematrix=[];
    var old_beta=JSON.parse(JSON.stringify(weight));
    old_beta.push(intercept);
    //initialize the derivative array and hessematrix.
    for(var j=0;j<data[0].length;j++)
    {
      derivativearray.push(0);
      derivativeone.push(0);
      var row=[];
      for(var i=0;i<data[0].length;i++){
        row.push(0);
      }
      hessematrix.push(row);
    }
    //console.log(derivativearray);
    //console.log(hessematrix);
    for(var i=0;i<data.length;i++)
    {
      var ybx=0;
      var lnx=0;
      var losssinge=0;
      epowersum=0;
      var y_ebx_1ebx=0;
      for(var j=0;j<data[i].length-1;j++)
      {
        epowersum+=data[i][j]*weight[j];
      }
      epowersum+=intercept;
      //caculate p1 and p0
      var p1=Math.exp(epowersum)/(1+Math.exp(epowersum));
      var p0=1/(1+Math.exp(epowersum));
      //ybx=-y(i)beta*x
      ybx=data[i][data[i].length-1]*(-1)*epowersum;
      //lnx=ln(1+e^beta*x)
      lnx=Math.log(1+Math.exp(epowersum));
      //calculate the loss value. loss value=foreach[-y(i)beatax+ln(1+e^betax)]
      lossv+=ybx+lnx;
      //calculate the step -y(i)+exp(Bx)/1+exp(Bx) 
      y_ebx_1ebx=data[i][data[i].length-1]*(-1)+Math.exp(epowersum)/(1+Math.exp(epowersum));
      for(var j=0;j<data[i].length-1;j++)
      {
        //
        derivativearray[j]+=y_ebx_1ebx*data[i][j];
        //console.log(j+" "+derivativearray[j]);
      }
      derivativearray[data[i].length-1]+=y_ebx_1ebx;
      
      for(var j=0;j<data[i].length-1;j++)
      {
        //console.log(j);
        for(var k=0;k<data[i].length-1;k++)
        {
          var sum=data[i][j]*data[i][k]*p1*p0;
          //console.log("order:"+i+" data:"+data[i]+" ij:"+data[i][j]+" ik:"+data[i][k]+" "+sum);
          hessematrix[j][k]+=sum;
          
        }
        var sum=data[i][j]*p1*p0;
        hessematrix[j][k]+=sum;
      }
      for(var k=0;k<data[i].length-1;k++)
        {
          var sum=data[i][k]*p1*p0;
          //console.log("order:"+i+" data:"+data[i]+" ij:"+data[i][j]+" ik:"+data[i][k]+" "+sum);
          hessematrix[j][k]+=sum;
          
        }
        var sum=p1*p0;
        hessematrix[j][k]+=sum;
      //console.log(hessematrix);

    }
    //console.log(derivativearray);
    //calculate derivate of first
    //math.multiply();
    var hesse_inv=math.inv(hessematrix);
    //calculate the point the derivate vlaue.
    var deriavte_value=math.multiply(derivativearray,old_beta);
    //return the update value.
    var step=math.multiply(derivativearray,hesse_inv);
    var update=[];
    for(var i=0;i<step.length;i++)
    {
      update.push(old_beta[i]-step[i]);
    }
    //return [lossv,derivativearray,deriavte_value,old_beta,hessematrix,hesse_inv,step,update];
    return[deriavte_value,update,lossv];
    //return derivativearray;
  }
  
  this.fit=function(data){
    this.data=data;
    this.variable_number=data[0].length-1;
    this.labelindex=this.variable_number;
    for(var i=0;i<this.variable_number;i++)
    {
      this.weight.push(0);
    }
    for(var j=0;j<this.data.length;j++)
    {
      for(var i=0;i<this.variable_number;i++)
      {
        this.weight[i]+=data[j][i];
      }
    }
    for(var i=0;i<this.variable_number;i++)
    {
      this.weight[i]=1/this.weight[i];
      //this.weight[i]=Math.random();
    }
    //console.log(this.weight);
    
    var lossold=0;
    loss2=[];
    var flate_count=0;
    var big_count=0;
    for(var j=0;j<70;j++)
    {
      loss2=exploss(this.data,this.weight,this.intercept);
      console.log(loss2);
      if(Math.abs(loss2[0])<1.0e-3){
        break;
        }
      for(var i=0;i<loss2[1].length-1;i++)
      {
        this.weight[i]=loss2[1][i];
      }
      this.intercept=loss2[1][i];
    }
    
  }
  this.predict=function (array)
  {
    var powersum=0;
    for(var i=0;i<array.length-1;i++)
      {
        powersum+=this.weight[i]*array[i];
      }
      powersum+=this.intercept;
      var pro=Math.exp(powersum)/(Math.exp(powersum)+1);
      return [powersum,pro];
  }
  this.transform=function (array)
  {
    var powersum=0;
    for(var i=0;i<array.length-1;i++)
      {
        powersum+=this.weight[i]*array[i];
      }
      powersum+=this.intercept;
      var pro=Math.exp(powersum)/(Math.exp(powersum)+1);
      return pro;
  }
}

old newtonlg function

function newtonlg(){
  this.weight=[];
  this.intercept=Math.random();
  this.loss=[];
  this.ratio=1;

  function exploss(data,weight,intercept)
  {
    var lossv=0;
    var lossarray=[];
   var epowersumarray=[];序列比对
    var exp2_exp3=0;
    var exp1_exp2=0;
    var derivativearray=[];
    var derivativeone=[];
    var hessematrix=[];
    var old_beta=JSON.parse(JSON.stringify(weight));
    old_beta.push(intercept);
    //initialize the derivative array and hessematrix.
    for(var j=0;j<data[0].length;j++)
    {
      derivativearray.push(0);
      derivativeone.push(0);
      var row=[];
      for(var i=0;i<data[0].length;i++){
        row.push(0);
      }
      hessematrix.push(row);
    }
    //console.log(derivativearray);
    //console.log(hessematrix);
    for(var i=0;i<data.length;i++)
    {
      var ybx=0;
      var lnx=0;
      var losssinge=0;
      epowersum=0;
      var y_ebx_1ebx=0;
      for(var j=0;j<data[i].length-1;j++)
      {
        epowersum+=data[i][j]*weight[j];
      }
      epowersum+=intercept;
      //caculate p1 and p0
      var p1=Math.exp(epowersum)/(1+Math.exp(epowersum));
      var p0=1/(1+Math.exp(epowersum));
      //ybx=-y(i)beta*x
      ybx=data[i][data[i].length-1]*(-1)*epowersum;
      //lnx=ln(1+e^beta*x)
      lnx=Math.log(1+Math.exp(epowersum));
      //calculate the loss value. loss value=foreach[-y(i)beatax+ln(1+e^betax)]
      lossv+=ybx+lnx;
      //calculate the step -y(i)+exp(Bx)/1+exp(Bx) 
      y_ebx_1ebx=data[i][data[i].length-1]*(-1)+Math.exp(epowersum)/(1+Math.exp(epowersum));
      for(var j=0;j<data[i].length-1;j++)
      {
        //
        derivativearray[j]+=y_ebx_1ebx*data[i][j];
        //console.log(j+" "+derivativearray[j]);
      }
      derivativearray[data[i].length-1]+=y_ebx_1ebx;
      
      for(var j=0;j<data[i].length-1;j++)
      {
        //console.log(j);
        for(var k=0;k<data[i].length-1;k++)
        {
          var sum=data[i][j]*data[i][k]*p1*p0;
          //console.log("order:"+i+" data:"+data[i]+" ij:"+data[i][j]+" ik:"+data[i][k]+" "+sum);
          hessematrix[j][k]+=sum;
          
        }
        var sum=data[i][j]*p1*p0;
        hessematrix[j][k]+=sum;
      }
      for(var k=0;k<data[i].length-1;k++)
        {
          var sum=data[i][k]*p1*p0;
          //console.log("order:"+i+" data:"+data[i]+" ij:"+data[i][j]+" ik:"+data[i][k]+" "+sum);
          hessematrix[j][k]+=sum;
          
        }
        var sum=p1*p0;
        hessematrix[j][k]+=sum;
      //console.log(hessematrix);

    }
    //console.log(derivativearray);
    //calculate derivate of first
    //math.multiply();
    var hesse_inv=math.inv(hessematrix);
    //calculate the point the derivate vlaue.
    var deriavte_value=math.multiply(derivativearray,old_beta);
    //return the update value.
    var step=math.multiply(derivativearray,hesse_inv);
    var update=[];
    for(var i=0;i<step.length;i++)
    {
      update.push(old_beta[i]-step[i]);
    }
    //return [lossv,derivativearray,deriavte_value,old_beta,hessematrix,hesse_inv,step,update];
    return[deriavte_value,update,lossv];
    //return derivativearray;
  }
  
  this.fit=function(data){
    this.data=data;
    this.variable_number=data[0].length-1;
    this.labelindex=this.variable_number;
    for(var i=0;i<this.variable_number;i++)
    {
      this.weight.push(0);
    }
    for(var j=0;j<this.data.length;j++)
    {
      for(var i=0;i<this.variable_number;i++)
      {
        this.weight[i]+=data[j][i];
      }
    }
    for(var i=0;i<this.variable_number;i++)
    {
      this.weight[i]=1/this.weight[i];
      //this.weight[i]=Math.random();
    }
    //console.log(this.weight);
    
    var lossold=0;
    loss2=[];
    var flate_count=0;
    var big_count=0;
    for(var j=0;j<70;j++)
    {
      loss2=exploss(this.data,this.weight,this.intercept);
      console.log(loss2);
      if(Math.abs(loss2[0])<1.0e-3){
        break;
        }
      for(var i=0;i<loss2[1].length-1;i++)
      {
        this.weight[i]=loss2[1][i];
      }
      this.intercept=loss2[1][i];
    }
    
  }
  this.predict=function (array)
  {
    var powersum=0;
    for(var i=0;i<array.length-1;i++)
      {
        powersum+=this.weight[i]*array[i];
      }
      powersum+=this.intercept;
      var pro=Math.exp(powersum)/(Math.exp(powersum)+1);
      return [powersum,pro];
  }
  this.transform=function (array)
  {
    var powersum=0;
    for(var i=0;i<array.length-1;i++)
      {
        powersum+=this.weight[i]*array[i];
      }
      powersum+=this.intercept;
      var pro=Math.exp(powersum)/(Math.exp(powersum)+1);
      return pro;
  }
}