import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Logistic {
float[] Tag;
float[][] Var;
float[] beta;
public Logistic() throws IOException{//函数作用:初始化,把文件的数据读入程序中
BufferedReader br=new BufferedReader(new FileReader("F:/数据挖掘--算法实现/Logistic算法/testSet.txt"));
String line="";
List<String> Var=new ArrayList<String>();
List<String> Tag=new ArrayList<String>();
while((line=br.readLine())!=null){
String[] content=line.split(" ");
String tmp="";
for(int i=0;i<content.length-1;i++){
tmp=tmp+" "+content[i];
}
Var.add(tmp.trim());
Tag.add(content[content.length-1]);
}
this.Tag=new float[Tag.size()];
this.Var=new float[Var.size()][Var.get(0).split(" ").length+1];
for(int i=0;i<Tag.size();i++){
this.Var[i][0]=1.0f;
this.Var[i][1]=Float.parseFloat(Var.get(i).split(" ")[0]);
this.Var[i][2]=Float.parseFloat(Var.get(i).split(" ")[1]);
this.Tag[i]=Float.parseFloat(Tag.get(i));
}
}
public float sum_exp(float x_i[],float beta[]){//函数作用:求exp(x[0]*beta[0]+...+x[j]*beta[j])其中x[0]=1
float tmp=0;
for(int j=0;j<x_i.length;j++){
tmp=tmp+x_i[j]*beta[j];
}
return (float)Math.exp(tmp);
}
public float Logistic_D(float x[][],float y[],float beta[],int j){//函数作用:求最大似然函数对数的偏导数值
float tmp=0;
for(int i=0;i<x.length;i++){
tmp=x[i][j]*sum_exp(x[i],beta)/(1+sum_exp(x[i],beta))-y[i]*x[i][j];
}
return tmp;
}
public float Logistic_D_norm(float x[][],float y[],float beta[]){//函数作用:求偏导数值的二范数值
float tmp=0;
for(int j=0;j<beta.length;j++){
tmp=tmp+Logistic_D(x,y,beta,j)*Logistic_D(x,y,beta,j);
}
return (float)Math.sqrt(tmp);
}
public void Logistic_main(float x[][],float y[],float beta[],float a){//函数作用:梯度下降法求解最大似然函数的最小值点
if(Logistic_D_norm(x,y,beta)<=0.01){
this.beta=beta;
return;
}
float[] beta_tmp=beta;
for(int j=0;j<beta.length;j++){
beta_tmp[j]=beta[j]-Logistic_D(x,y,beta,j)*a;
}
beta=beta_tmp;
Logistic_main(x,y,beta,a);
}
public void Logistic_predict(float x[][],float y[],float beta[]){//函数作用输出真实值与逻辑斯蒂回归预测值
float[] y_predict=new float[y.length];
for(int i=0;i<y.length;i++){
y_predict[i]=sum_exp(x[i],this.beta)/(1+sum_exp(x[i],this.beta));
System.out.println("Actual:"+Tag[i]+" Predict:"+y_predict[i]);
}
return;
}
public static void main(String[] args) throws IOException {
Logistic a=new Logistic();
float[] beta=a.Var[0];
for(int i=0;i<beta.length;i++){beta[i]=0.0f;}
a.Logistic_main(a.Var,a.Tag,beta,(float) 0.01);
a.Logistic_predict(a.Var,a.Tag,a.beta);
}
}
理论知识:
输入:
-0.017612 14.0530640
-1.395634 4.6625411
-0.752157 6.5386200
-1.322371 7.1528530
0.423363 11.0546770
0.406704 7.0673351
0.667394 12.7414520
-2.460150 6.8668051
0.569411 9.5487550
-0.026632 10.4277430
0.850433 6.9203341
1.347183 13.1755000
1.176813 3.1670201
-1.781871 9.0979530
-0.566606 5.7490031
0.931635 1.5895051
-0.024205 6.1518231
-0.036453 2.6909881
-0.196949 0.4441651
1.014459 5.7543991
1.985298 3.2306191
-1.693453 -0.5575401
-0.576525 11.7789220
-0.346811 -1.6787301
-2.124484 2.6724711
1.217916 9.5970150
-0.733928 9.0986870
-3.642001 -1.6180871
0.315985 3.5239531
1.416614 9.6192320
-0.386323 3.9892861
0.556921 8.2949841
1.224863 11.5873600
-1.347803 -2.4060511
1.196604 4.9518511
0.275221 9.5436470
0.470575 9.3324880
-1.889567 9.5426620
-1.527893 12.1505790
-1.185247 11.3093180
-0.445678 3.2973031
1.042222 6.1051551
-0.618787 10.3209860
1.152083 0.5484671
0.828534 2.6760451
-1.237728 10.5490330
-0.683565 -2.1661251
0.229456 5.9219381
-0.959885 11.5553360
0.492911 10.9933240
0.184992 8.7214880
-0.355715 10.3259760
-0.397822 8.0583970
0.824839 13.7303430
1.507278 5.0278661
0.099671 6.8358391
-0.344008 10.7174850
1.785928 7.7186451
-0.918801 11.5602170
-0.364009 4.7473001
-0.841722 4.1190831
0.490426 1.9605391
-0.007194 9.0757920
0.356107 12.4478630
0.342578 12.2811620
-0.810823 -1.4660181
2.530777 6.4768011
1.296683 11.6075590
0.475487 12.0400350
-0.783277 11.0097250
0.074798 11.0236500
-1.337472 0.4683391
-0.102781 13.7636510
-0.147324 2.8748461
0.518389 9.8870350
1.015399 7.5718820
-1.658086 -0.0272551
1.319944 2.1712281
2.056216 5.0199811
-0.851633 4.3756911
-1.510047 6.0619920
-1.076637 -3.1818881
1.821096 10.2839900
3.010150 8.4017661
-1.099458 1.6882741
-0.834872 -1.7338691
-0.846637 3.8490751
1.400102 12.6287810
1.752842 5.4681661
0.078557 0.0597361
0.089392 -0.7153001
1.825662 12.6938080
0.197445 9.7446380
0.126117 0.9223111
-0.679797 1.2205301
0.677983 2.5566661
0.761349 10.6938620
-2.168791 0.1436321
1.388610 9.3419970
0.317029 14.7390250
输出:
Actual:0.0 Predict:0.5606811
Actual:1.0 Predict:0.08983738
Actual:0.0 Predict:0.03744656
Actual:0.0 Predict:0.028106958
Actual:0.0 Predict:0.004135808
Actual:1.0 Predict:0.028764626
Actual:0.0 Predict:0.0018012184
Actual:1.0 Predict:0.032601494
Actual:0.0 Predict:0.008632111
Actual:0.0 Predict:0.005650719
Actual:1.0 Predict:0.030718023
Actual:0.0 Predict:0.0014445343
Actual:1.0 Predict:0.16712694
Actual:0.0 Predict:0.011023995
Actual:1.0 Predict:0.05418498
Actual:1.0 Predict:0.30441096
Actual:1.0 Predict:0.044623833
Actual:1.0 Predict:0.20444235
Actual:1.0 Predict:0.4377795
Actual:1.0 Predict:0.05319864
Actual:1.0 Predict:0.16164665
Actual:1.0 Predict:0.56443
Actual:0.0 Predict:0.0029291054
Actual:1.0 Predict:0.6893827
Actual:1.0 Predict:0.20957194
Actual:0.0 Predict:0.008373756
Actual:0.0 Predict:0.010899674
Actual:1.0 Predict:0.6904619
Actual:1.0 Predict:0.14518888
Actual:0.0 Predict:0.008266081
Actual:1.0 Predict:0.11976635
Actual:1.0 Predict:0.015893796
Actual:0.0 Predict:0.0031574024
Actual:1.0 Predict:0.7624485
Actual:1.0 Predict:0.07687254
Actual:0.0 Predict:0.008680456
Actual:0.0 Predict:0.009603223
Actual:0.0 Predict:0.008884382
Actual:0.0 Predict:0.0024648989
Actual:0.0 Predict:0.0037125102
Actual:1.0 Predict:0.1606882
Actual:1.0 Predict:0.045124844
Actual:0.0 Predict:0.005991301
Actual:1.0 Predict:0.42168543
Actual:1.0 Predict:0.20414893
Actual:0.0 Predict:0.0053931167
Actual:1.0 Predict:0.73902637
Actual:1.0 Predict:0.04958199
Actual:0.0 Predict:0.0032823293
Actual:0.0 Predict:0.0042590536
Actual:0.0 Predict:0.012971083
Actual:0.0 Predict:0.005960136
Actual:0.0 Predict:0.018001493
Actual:0.0 Predict:0.0011055288
Actual:1.0 Predict:0.07403084
Actual:1.0 Predict:0.032229148
Actual:0.0 Predict:0.0049191834
Actual:1.0 Predict:0.020736596
Actual:0.0 Predict:0.0032730496
Actual:1.0 Predict:0.08562134
Actual:1.0 Predict:0.113672785
Actual:1.0 Predict:0.26805925
Actual:0.0 Predict:0.010938313
Actual:0.0 Predict:0.0020877975
Actual:0.0 Predict:0.002266411
Actual:1.0 Predict:0.6676025
Actual:1.0 Predict:0.0372906
Actual:0.0 Predict:0.0031238655
Actual:0.0 Predict:0.0025479672
Actual:0.0 Predict:0.004282208
Actual:0.0 Predict:0.0042147175
Actual:1.0 Predict:0.43782312
Actual:0.0 Predict:0.0010982874
Actual:1.0 Predict:0.19028516
Actual:0.0 Predict:0.0073206644
Actual:0.0 Predict:0.022435196
Actual:1.0 Predict:0.49938652
Actual:1.0 Predict:0.24655403
Actual:1.0 Predict:0.07389847
Actual:1.0 Predict:0.10155429
Actual:0.0 Predict:0.047252834
Actual:1.0 Predict:0.8242609
Actual:0.0 Predict:0.0059460304
Actual:1.0 Predict:0.014710011
Actual:1.0 Predict:0.2986962
Actual:1.0 Predict:0.69626415
Actual:1.0 Predict:0.1277843
Actual:0.0 Predict:0.0018891313
Actual:1.0 Predict:0.06032025
Actual:1.0 Predict:0.48407716
Actual:1.0 Predict:0.5788336
Actual:0.0 Predict:0.0018214632
Actual:0.0 Predict:0.007875008
Actual:1.0 Predict:0.38009217
Actual:1.0 Predict:0.3480705
Actual:1.0 Predict:0.2141388
Actual:0.0 Predict:0.0049188123
Actual:1.0 Predict:0.4797042
Actual:0.0 Predict:0.009467098
Actual:0.0 Predict:6.76526E-4