⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 network.java

📁 This program demonstrates some function approximation capabilities of a Radial Basis Function Networ
💻 JAVA
字号:
// Decompiled by JAD v1.5.4.3. Copyright 1997-98 Pavel Kouznetsov.// JAD Home Page:      http://web.unicom.com.cy/~kpd/jad.html// Decompiler options: packimports(3) // Source File Name:   RBFunction.java// Decompiled by S.Baehni in order to be compliant with Java1.2import java.awt.Color;class Network{    public double[] trainnet(GaussCenter agausscenter[], DataPoints datapoints)    {        double ad[] = new double[agausscenter.length];        if(datapoints.count == 0 || datapoints.count < agausscenter.length)        {            RBFunction.statusMesg("Please add more training points (atleast as many as number of centers).");            ad[0] = -1000D;            return ad;        }        double ad1[][] = new double[datapoints.count][agausscenter.length];        for(int i = 0; i < datapoints.count; i++)        {            for(int j = 0; j < agausscenter.length; j++)                ad1[i][j] = agausscenter[j].eval(datapoints.data[i][0]);        }        double ad2[] = new double[datapoints.data.length];        for(int k = 0; k < datapoints.data.length; k++)            ad2[k] = datapoints.data[k][1];        ad = pinvsoln(ad1, ad2);        return ad;    }    public void plotoutput(double ad[], GaussCenter agausscenter[], DataDisp datadisp, double ad1[])    {        double ad2[][] = new double[ad1.length][2];        for(int i = 0; i < ad1.length; i++)        {            ad2[i][0] = ad1[i];            ad2[i][1] = 0.0D;        }        double ad4[][] = new double[ad1.length][2];        for(int j = 0; j < agausscenter.length; j++)        {            double ad3[] = agausscenter[j].eval(ad1);            for(int k = 0; k < ad1.length; k++)            {                ad2[k][1] += ad[j] * ad3[k];                ad4[k][0] = ad1[k];                ad4[k][1] = ad[j] * ad3[k];            }            datadisp.drawcurve(ad4, Color.green);        }        datadisp.drawcurve(ad2, Color.red);    }    private double[] pinvsoln(double ad[][], double ad1[])    {        double ad2[] = new double[ad.length + 1];        double ad3[][] = mattonr(ad);        double ad4[] = vectonr(ad1);        double ad5[][] = new double[ad[0].length + 1][ad[0].length + 1];        double ad6[] = new double[ad[0].length + 1];        svdcmp(ad3, ad.length, ad[0].length, ad6, ad5);        svbksb(ad3, ad6, ad5, ad.length, ad[0].length, ad4, ad2);        return vecfromnr(ad2);    }    private double[] vectonr(double ad[])    {        double ad1[] = new double[ad.length + 1];        for(int i = 0; i < ad.length; i++)            ad1[i + 1] = ad[i];        return ad1;    }    private double[] vecfromnr(double ad[])    {        double ad1[] = new double[ad.length - 1];        for(int i = 0; i < ad.length - 1; i++)            ad1[i] = ad[i + 1];        return ad1;    }    private double[][] mattonr(double ad[][])    {        double ad1[][] = new double[ad.length + 1][ad[0].length + 1];        for(int i = 0; i < ad.length; i++)        {            for(int j = 0; j < ad[0].length; j++)                ad1[i + 1][j + 1] = ad[i][j];        }        return ad1;    }    private double[][] matfromnr(double ad[][])    {        double ad1[][] = new double[ad.length - 1][ad[0].length - 1];        for(int i = 0; i < ad.length - 1; i++)        {            for(int j = 0; j < ad[0].length - 1; j++)                ad1[i][j] = ad[i + 1][j + 1];        }        return ad1;    }    private void svdcmp(double ad[][], int i, int j, double ad1[], double ad2[][])    {        int k9 = 1;        int j10 = 1;        double ad3[] = new double[j + 1];        double d;        double d25;        double d9 = d25 = d = 0.0D;        for(int k = 1; k <= j; k++)        {            k9 = k + 1;            ad3[k] = d25 * d9;            double d19;            d9 = d19 = d25 = 0.0D;            if(k <= i)            {                for(int k5 = k; k5 <= i; k5++)                    d25 += Math.abs(ad[k5][k]);                if(d25 != 0.0D)                {                    for(int l5 = k; l5 <= i; l5++)                    {                        ad[l5][k] /= d25;                        d19 += ad[l5][k] * ad[l5][k];                    }                    double d3 = ad[k][k];                    d9 = -sign(Math.sqrt(d19), d3);                    double d14 = d3 * d9 - d19;                    ad[k][k] = d3 - d9;                    for(int i2 = k9; i2 <= j; i2++)                    {                        d19 = 0.0D;                        for(int i6 = k; i6 <= i; i6++)                            d19 += ad[i6][k] * ad[i6][i2];                        double d4 = d19 / d14;                        for(int j6 = k; j6 <= i; j6++)                            ad[j6][i2] += d4 * ad[j6][k];                    }                    for(int k6 = k; k6 <= i; k6++)                        ad[k6][k] *= d25;                }            }            ad1[k] = d25 * d9;            d9 = d19 = d25 = 0.0D;            if(k <= i && k != j)            {                for(int l6 = k9; l6 <= j; l6++)                    d25 += Math.abs(ad[k][l6]);                if(d25 != 0.0D)                {                    for(int i7 = k9; i7 <= j; i7++)                    {                        ad[k][i7] /= d25;                        d19 += ad[k][i7] * ad[k][i7];                    }                    double d5 = ad[k][k9];                    d9 = -sign(Math.sqrt(d19), d5);                    double d15 = d5 * d9 - d19;                    ad[k][k9] = d5 - d9;                    for(int j7 = k9; j7 <= j; j7++)                        ad3[j7] = ad[k][j7] / d15;                    for(int j2 = k9; j2 <= i; j2++)                    {                        double d20 = 0.0D;                        for(int k7 = k9; k7 <= j; k7++)                            d20 += ad[j2][k7] * ad[k][k7];                        for(int l7 = k9; l7 <= j; l7++)                            ad[j2][l7] += d20 * ad3[l7];                    }                    for(int i8 = k9; i8 <= j; i8++)                        ad[k][i8] *= d25;                }            }            d = Math.max(d, Math.abs(ad1[k]) + Math.abs(ad3[k]));        }        for(int l = j; l >= 1; l--)        {            if(l < j)            {                if(d9 != 0.0D)                {                    for(int k2 = k9; k2 <= j; k2++)                        ad2[k2][l] = ad[l][k2] / ad[l][k9] / d9;                    for(int l2 = k9; l2 <= j; l2++)                    {                        double d21 = 0.0D;                        for(int j8 = k9; j8 <= j; j8++)                            d21 += ad[l][j8] * ad2[j8][l2];                        for(int k8 = k9; k8 <= j; k8++)                            ad2[k8][l2] += d21 * ad2[k8][l];                    }                }                for(int i3 = k9; i3 <= j; i3++)                    ad2[l][i3] = ad2[i3][l] = 0.0D;            }            ad2[l][l] = 1.0D;            d9 = ad3[l];            k9 = l;        }        for(int i1 = Math.min(i, j); i1 >= 1; i1--)        {            int l9 = i1 + 1;            double d10 = ad1[i1];            for(int j3 = l9; j3 <= j; j3++)                ad[i1][j3] = 0.0D;            if(d10 != 0.0D)            {                d10 = 1.0D / d10;                for(int k3 = l9; k3 <= j; k3++)                {                    double d22 = 0.0D;                    for(int l8 = l9; l8 <= i; l8++)                        d22 += ad[l8][i1] * ad[l8][k3];                    double d6 = (d22 / ad[i1][i1]) * d10;                    for(int i9 = i1; i9 <= i; i9++)                        ad[i9][k3] += d6 * ad[i9][i1];                }                for(int l3 = i1; l3 <= i; l3++)                    ad[l3][i1] *= d10;            }            else            {                for(int i4 = i1; i4 <= i; i4++)                    ad[i4][i1] = 0.0D;            }            ad[i1][i1]++;        }        for(int j9 = j; j9 >= 1; j9--)        {            for(int l1 = 1; l1 <= 30; l1++)            {                boolean flag = true;                int i10;                for(i10 = j9; i10 >= 1; i10--)                {                    j10 = i10 - 1;                    if(Math.abs(ad3[i10]) + d == d)                    {                        flag = false;                        break;                    }                    if(Math.abs(ad1[j10]) + d == d)                        break;                }                if(flag)                {                    double d1 = 0.0D;                    double d23 = 1.0D;                    for(int j1 = i10; j1 <= j9; j1++)                    {                        double d7 = d23 * ad3[j1];                        ad3[j1] = d1 * ad3[j1];                        if(Math.abs(d7) + d == d)                            break;                        double d11 = ad1[j1];                        double d16 = pythag(d7, d11);                        ad1[j1] = d16;                        d16 = 1.0D / d16;                        d1 = d11 * d16;                        d23 = -d7 * d16;                        for(int j4 = 1; j4 <= i; j4++)                        {                            double d27 = ad[j4][j10];                            double d31 = ad[j4][j1];                            ad[j4][j10] = d27 * d1 + d31 * d23;                            ad[j4][j1] = d31 * d1 - d27 * d23;                        }                    }                }                double d32 = ad1[j9];                if(i10 == j9)                {                    if(d32 < 0.0D)                    {                        ad1[j9] = -d32;                        for(int k4 = 1; k4 <= j; k4++)                            ad2[k4][j9] = -ad2[k4][j9];                    }                    break;                }                if(l1 == 30)                    RBFunction.statusMesg("Singular Value Decomposition for the pseudo-inverse has not converged in 30 iterations.");                double d26 = ad1[i10];                j10 = j9 - 1;                double d28 = ad1[j10];                double d12 = ad3[j10];                double d17 = ad3[j9];                double d8 = ((d28 - d32) * (d28 + d32) + (d12 - d17) * (d12 + d17)) / (2D * d17 * d28);                d12 = pythag(d8, 1.0D);                d8 = ((d26 - d32) * (d26 + d32) + d17 * (d28 / (d8 + sign(d12, d8)) - d17)) / d26;                double d24;                double d2 = d24 = 1.0D;                for(int l4 = i10; l4 <= j10; l4++)                {                    int k1 = l4 + 1;                    double d13 = ad3[k1];                    double d29 = ad1[k1];                    double d18 = d24 * d13;                    d13 = d2 * d13;                    double d33 = pythag(d8, d18);                    ad3[l4] = d33;                    d2 = d8 / d33;                    d24 = d18 / d33;                    d8 = d26 * d2 + d13 * d24;                    d13 = d13 * d2 - d26 * d24;                    d18 = d29 * d24;                    d29 *= d2;                    for(int i5 = 1; i5 <= j; i5++)                    {                        d26 = ad2[i5][l4];                        d33 = ad2[i5][k1];                        ad2[i5][l4] = d26 * d2 + d33 * d24;                        ad2[i5][k1] = d33 * d2 - d26 * d24;                    }                    d33 = pythag(d8, d18);                    ad1[l4] = d33;                    if(d33 != 0.0D)                    {                        d33 = 1.0D / d33;                        d2 = d8 * d33;                        d24 = d18 * d33;                    }                    d8 = d2 * d13 + d24 * d29;                    d26 = d2 * d29 - d24 * d13;                    for(int j5 = 1; j5 <= i; j5++)                    {                        double d30 = ad[j5][l4];                        double d34 = ad[j5][k1];                        ad[j5][l4] = d30 * d2 + d34 * d24;                        ad[j5][k1] = d34 * d2 - d30 * d24;                    }                }                ad3[i10] = 0.0D;                ad3[j9] = d8;                ad1[j9] = d26;            }        }    }    private void svbksb(double ad[][], double ad1[], double ad2[][], int i, int j, double ad3[], double ad4[])    {        double ad5[] = new double[j + 1];        for(int l = 1; l <= j; l++)        {            double d = 0.0D;            if(ad1[l] != 0.0D)            {                for(int j1 = 1; j1 <= i; j1++)                    d += ad[j1][l] * ad3[j1];                d /= ad1[l];            }            ad5[l] = d;        }        for(int i1 = 1; i1 <= j; i1++)        {            double d1 = 0.0D;            for(int k = 1; k <= j; k++)                d1 += ad2[i1][k] * ad5[k];            ad4[i1] = d1;        }    }    private double pythag(double d, double d1)    {        double d2 = Math.abs(d);        double d3 = Math.abs(d1);        if(d2 > d3)            return d2 * Math.sqrt(1.0D + sqr(d3 / d2));        if(d3 == 0.0D)            return 0.0D;        else            return d3 * Math.sqrt(1.0D + sqr(d2 / d3));    }    private double sqr(double d)    {        if(d == 0.0D)            return 0.0D;        else            return d * d;    }    private double sign(double d, double d1)    {        if(d1 >= 0.0D)            return Math.abs(d);        else            return -Math.abs(d);    }    Network()    {    }    public static final double BADDATA = -1000D;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -