import java.io.*;
class pro{
String[] data=new String[50000];
int s,sx,datanumber,wordnumber;
int[][] sdata=new int[500][10000];
int[][] xx=new int[500][10000];
int[] y=new int[500];
int xp,tr;
double[][] x=new double[500][10000];
double[] a=new double[21];
double b,q;
double[] v=new double[22];
int point;
double[] vec=new double[21];
double e,delta;
public static void main(String args[]){
pro test=new pro();
}
pro(){
readfile("svm.txt");
for(s=1;s<datanumber+1;s++){
String[] z=data[s].split(",");
wordnumber=z.length;
for(sx=0;sx<z.length;sx++){
sdata[s][sx+1]=Integer.parseInt(z[sx]);
}
}
System.out.println(datanumber);
System.out.println(wordnumber);
for(s=1;s<datanumber+1;s++){
xx[s][1]=sdata[s][35];
xx[s][2]=sdata[s][455];
xx[s][3]=sdata[s][446];
xx[s][4]=sdata[s][197];
xx[s][5]=sdata[s][849];
xx[s][6]=sdata[s][799];
xx[s][7]=sdata[s][251];
xx[s][8]=sdata[s][127];
xx[s][9]=sdata[s][174];
xx[s][10]=sdata[s][304];
xx[s][11]=sdata[s][614];
xx[s][12]=sdata[s][667];
xx[s][13]=sdata[s][537];
xx[s][14]=sdata[s][945];
xx[s][15]=sdata[s][1035];
xx[s][16]=sdata[s][1809];
xx[s][17]=sdata[s][1689];
xx[s][18]=sdata[s][1678];
xx[s][19]=sdata[s][1630];
xx[s][20]=sdata[s][306];
}
for(s=1;s<8;s++){
y[s]=1;
}
for(s=8;s<datanumber+1;s++){
y[s]=-1;
}
for(s=1;s<datanumber+1;s++){
xp=0;
for(sx=1;sx<21;sx++){
xp=xp+xx[s][sx];
}
for(sx=1;sx<21;sx++){
x[s][sx]=(double)xx[s][sx]/xp;
}
}
for(sx=1;sx<21;sx++){
a[sx]=1;
}
b=1;
for(tr=1;tr<5000;tr++){
point=makepoint();
q=-0.05;
for(sx=1;sx<21;sx++){
v[sx]=df(point,sx)+q*dp(sx);
}
e=0;
for(sx=1;sx<21;sx++){
e=e+v[sx]*v[sx];
}
e=Math.pow(e,0.5);
for(sx=1;sx<21;sx++){
vec[sx]=v[sx]/e;
}
delta=0.01;
for(sx=1;sx<21;sx++){
a[sx]=a[sx]+vec[sx]*delta;
}
System.out.println(f()+q*pen());
}
for(s=1;s<21;s++){
System.out.println(a[s]);
}
}
double pen(){
int m,h;
double d1;
d1=0;
for(m=1;m<datanumber+1;m++){
h=0;
if(g(a,b,m,x)>0)h=h+1;
if(y[m]<0)h=h+1;
if(h==2)d1=d1+g(a,b,m,x);
h=0;
if(g(a,b,m,x)<0)h=h+1;
if(y[m]>0)h=h+1;
if(h==2)d1=d1-g(a,b,m,x);
}
return d1;
}
double dp(int n){
int m,h;
double d1;
d1=0;
for(m=1;m<datanumber+1;m++){
h=0;
if(g(a,b,m,x)>0)h=h+1;
if(y[m]<0)h=h+1;
if(h==2)d1=d1+x[m][n];
h=0;
if(g(a,b,m,x)<0)h=h+1;
if(y[m]>0)h=h+1;
if(h==2)d1=d1-x[m][n];
}
return d1;
}
double f(){
int m,h;
double d1,mind;
mind=9999;
for(m=1;m<datanumber+1;m++){
d1=999;
h=0;
if(g(a,b,m,x)>0)h=h+1;
if(y[m]>0)h=h+1;
if(h==2)d1=met(a,b,m,x);
h=0;
if(g(a,b,m,x)<0)h=h+1;
if(y[m]<0)h=h+1;
if(h==2)d1=met(a,b,m,x);
if(d1<mind)mind=d1;
}
if(mind>9000)mind=0;
return mind;
}
double df(int m,int n){
double delta,m1,m2;
double[] alpha=new double[21];
int mx;
delta=0.01;
for(mx=1;mx<21;mx++){
alpha[mx]=a[mx];
}
alpha[n]=alpha[n]+delta;
m1=met(a,b,m,x);
m2=met(alpha,b,m,x);
return (m2-m1)/delta;
}
int makepoint(){
double f1,minf;
int m,h,mx;
minf=999;
mx=0;
for(m=1;m<datanumber+1;m++){
f1=9999;
h=0;
if(g(a,b,m,x)>0)h=h+1;
if(y[m]>0)h=h+1;
if(h==2)f1=met(a,b,m,x);
h=0;
if(g(a,b,m,x)<0)h=h+1;
if(y[m]<0)h=h+1;
if(h==2)f1=met(a,b,m,x);
if(f1<minf)mx=m;
if(f1<minf)minf=f1;
}
return mx;
}
double met(double[] a,double b,int m,double[][] x){
double m1,m2,t,mt;
int mx;
m1=b;
for(mx=1;mx<21;mx++){
m1=m1+a[mx]*a[mx];
}
m2=-g(a,b,m,x);
t=m2/m1;
mt=t*t*m1;
mt=Math.pow(mt,0.5);
return mt;
}
void readfile(String file){
String str;
BufferedReader br;
int s;
s=0;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"SJIS"));
while((str = br.readLine()) != null) {
s=s+1;
data[s]=str;
}
br.close();
} catch (IOException e) {System.out.println(e);}
datanumber=s;
}
double g(double[] a,double b,int m,double[][] x){
double g1;
int mx;
g1=b;
for (mx=1;mx<21;mx++){
g1=g1+a[mx]*x[m][mx];
}
return g1;
}
}
最終更新:2011年06月04日 11:32