import java.io.*;
class pro{
int s,sx,sxs,datanumber,wordnumber;
String[] data=new String[10000];
String[] dic=new String[10000];
int[][] sdata=new int[500][10000];
int[] p=new int[101];
int[] y=new int[500];
int[][] xx=new int[500][56];
double[][] x=new double[500][56];
double[] a=new double[56];
double[] v=new double[56];
double[] vec=new double[56];
double b;
int m,n,sumx,point;
double q,e,delta;
int t1;
double f1,f2;
public static void main(String args[]){
pro test=new pro();
}
pro(){
readfile("dic.txt");
for(s=1;s<datanumber+1;s++){
String[] z2=data[s].split(",");
if(z2.length>1)dic[s]=z2[1];
}
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);
p[1]=799;
p[2]=251;
p[3]=174;
p[4]=307;
p[5]=35;
p[6]=213;
p[7]=455;
p[8]=446;
p[9]=197;
p[10]=849;
p[11]=614;
p[12]=667;
p[13]=537;
p[14]=945;
p[15]=1035;
p[16]=506;
p[17]=526;
p[18]=641;
p[19]=554;
p[20]=1891;
p[21]=306;
p[22]=45;
p[23]=1050;
p[24]=1819;
p[25]=229;
p[26]=666;
p[27]=579;
p[28]=536;
p[29]=523;
p[30]=558;
p[31]=1834;
p[32]=65;
p[33]=2713;
p[34]=2158;
p[35]=2276;
p[36]=1820;
p[37]=557;
p[38]=239;
p[39]=1010;
p[40]=1046;
p[41]=2132;
p[42]=660;
p[43]=1208;
p[44]=217;
p[45]=993;
p[46]=1062;
p[47]=979;
p[48]=1213;
p[49]=3517;
p[50]=2296;
p[51]=622;
p[52]=631;
p[53]=851;
p[54]=661;
p[55]=264;
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++){
for(sx=1;sx<56;sx++){
sxs=p[sx];
xx[s][sx]=sdata[s][sxs];
}
}
for(s=1;s<datanumber+1;s++){
sumx=0;
for(sx=1;sx<56;sx++){
sumx=sumx+xx[s][sx];
}
for(sx=1;sx<56;sx++){
x[s][sx]=(double)xx[s][sx]/sumx;
}
}
for(sx=1;sx<56;sx++){
a[sx]=1;
}
b=1;
f2=-99999;
t1=0;
while(t1<10000){
point=makepoint();
q=-0.05;
for(sx=1;sx<56;sx++){
v[sx]=df(point,sx)+q*dp(sx);
}
e=0;
for(sx=1;sx<56;sx++){
e=e+v[sx]*v[sx];
}
e=Math.pow(e,0.5);
for(sx=1;sx<56;sx++){
vec[sx]=v[sx]/e;
}
delta=0.01;
for(sx=1;sx<56;sx++){
a[sx]=a[sx]+vec[sx]*delta;
}
f1=f()+q*pen();
t1=t1+1;
}
System.out.println(f1);
for(sx=1;sx<56;sx++){
s=p[sx];
System.out.println(dic[s]);
System.out.println(a[sx]);
}
}
double f(){
int m,h;
double d1,mind;
mind=9999;
for(m=1;m<datanumber+1;m++){
d1=9999;
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 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 df(int m,int n){
double delta,m1,m2;
double[] alpha=new double[56];
int mx;
delta=0.01;
for(mx=1;mx<56;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;
}
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 met(double[] a,double b,int m,double[][] x){
double m1,m2,t,mt;
int mx;
m1=0;
for(mx=1;mx<56;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;
}
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;
}
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日 20:15