Skip to content

Latest commit

 

History

History
183 lines (173 loc) · 4.71 KB

File metadata and controls

183 lines (173 loc) · 4.71 KB

Newton method

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;
    var old_lost=10000000000;
    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;
        }
        if(Math.abs(loss2[0])>old_lost)
        {
          break;
        }
      for(var i=0;i<loss2[1].length-1;i++)
      {
        this.weight[i]=loss2[1][i];
      }
      this.intercept=loss2[1][i];
      old_lost=loss2[0];
    }
    
  }
  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;
  }
}