function key_na_by_sample(){
key_replace='sample';
}
function key_na_by_feture(){
key_replace='feature';
}
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;
}
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;
}
}
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;
}
}