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

📄 tobinaryplugin.java

📁 一个纯java写的神经网络源代码
💻 JAVA
字号:
/* * ToBinaryPlugin.java * * Created on September 24, 2004, 2:36 PM */package org.joone.util;import java.util.*;import org.joone.engine.*;import org.joone.log.*;/** * This plug-in converts 10-base data to binary format. The plug-in ingnores  * the broken part (the part after the . ) for non-integer numbers. It works  * correct for positive as well as for negative numbers. *  * @author Boris Jansen */public class ToBinaryPlugin extends ConverterPlugIn {        /** The logger for this class. */    private static final ILogger log = LoggerFactory.getLogger(ToBinaryPlugin.class);            /** The sizes of the (binary) arrays of converted series. This way we are able     * to find the correct position of serie we have to convert related taking into     * account any previous converted series. */    private List theConvertedSeries = new ArrayList();        /** The value for the upper bit. */    private double upperBit = 1.0; // default        /** The value for the lower bit. */    private double lowerBit = 0.0; // default        /** Creates a new instance of ToBinaryPlugin */    public ToBinaryPlugin() {    }        /**      * Creates a new instance of ToBinaryPlugin      *     * @param anAdvancedSerieSelector the advanced serie selector to use.     * @see setAdvancedSerieSelector()     */    public ToBinaryPlugin(String anAdvancedSerieSelector) {        super(anAdvancedSerieSelector);    }        protected boolean convert(int serie) {        boolean retValue = false;        int mySerie = serie, mySignBitLenght;        boolean myHasPositiveValues = false;        boolean myHasNegativeValues = false;        for(int i = 0; i < theConvertedSeries.size(); i++) {            // get the correct serie, taking into account any previous converted            // series, by which the serie changes (from integer to binary results            // in more columns)            if(((int[])theConvertedSeries.get(i))[0] < serie) {                mySerie += ((int[])theConvertedSeries.get(i))[1];            }        }                int mySize = 0; // the (largest) size of the converted values = binary arrays (#bits)        double[] myArray;        double[][] myBinaries = new double[getInputVector().size()][];        for(int i = 0; i < getInputVector().size(); i++) {            myArray = ((Pattern)getInputVector().get(i)).getArray();                        myBinaries[i] = getBinary(myArray[mySerie]);            if(myBinaries[i].length > mySize) {                mySize = myBinaries[i].length;            }            if(myArray[mySerie] > 0) {                myHasPositiveValues = true;            } else if(myArray[mySerie] < 0) {                myHasNegativeValues = true;            }        }                // if there are positive as well as negative values we should include a sign bit        mySignBitLenght = (myHasPositiveValues && myHasNegativeValues) ? 1 : 0;                for(int i = 0; i < getInputVector().size(); i++) {            myArray = ((Pattern)getInputVector().get(i)).getArray();            // if we have positive and negative numbers we add an extra bit (the sign bit)            double[] myNewArray = new double[myArray.length -1 + mySize + mySignBitLenght];            for(int j = 0; j < myArray.length; j++) {                // copy myArray into myNewArray, but skip the part where we                // will place the converted (binary) myArray[mySerie]                if(j < mySerie) {                    myNewArray[j] = myArray[j];                } else if(j > mySerie) {                    myNewArray[j + mySize + mySignBitLenght - 1] = myArray[j]; // -1 added by yccheok                }            }            for(int j = 0; j < mySize + mySignBitLenght; j++) {                // now we will copy the binary part to the array                if(j >= myBinaries[i].length) {                    myNewArray[mySerie + j] = getLowerBit();                     // if it is the sign bit and the/ value is negative we will update it                    if(j == mySize) {                        // this is only possible when mySignBitLenght == 1, else always j < mySize                        if(myArray[mySerie] < 0) {                            myNewArray[mySerie + j] = getUpperBit();                        }                    }                } else {                    myNewArray[mySerie + j] = myBinaries[i][j];                }            }            ((Pattern)getInputVector().get(i)).setArray(myNewArray);            retValue = true;                        // debugging (print the original input array and the converted array            /* debug            String myTemp = "";            for(int j = 0; j < myArray.length; j++) {                myTemp += (int)myArray[j] + " ";            }            log.debug(myTemp + " <- original array");                        myTemp = "";            for(int j = 0; j < myNewArray.length; j++) {                myTemp += myNewArray[j] + " ";            }            log.debug(myTemp + " <- converted (including binary part) array");            end debug */        }        // we have converted a serie -> so the positions change, to find the original        // position of a serie we save the amount of bits changed        theConvertedSeries.add(new int[] {serie, mySize + mySignBitLenght -1});        return retValue;    }        protected boolean apply() {        // new convertion ->        theConvertedSeries = new ArrayList();                return super.apply();    }        /**     * Converts a number to a binary number (the part after the . (like 348      * in 321.348) is ignored).     *     * @param aNumber the number to convert.     * @return the converted number as an array in binary form.     */    protected double[] getBinary(double aNumber) {        aNumber = Math.floor(aNumber); // throw away the part after the .        aNumber = Math.abs(aNumber); // here we ignore the sign part (we deal with this                                     // in the convert() method)                double myTemp = aNumber;        int mySize = 0;                while(myTemp > 0) {            mySize++;            myTemp /= 2;            myTemp = Math.floor(myTemp);        }                double[] myBinary = new double[mySize];        for(int i = 0; i < mySize; i++) {           myTemp = aNumber / 2;           aNumber = Math.floor(myTemp);                      if(myTemp > aNumber) {               myBinary[i] = getUpperBit();           } else {               myBinary[i] = getLowerBit();           }        }        return myBinary;    }        /**     * Sets the value for the upper bit. In binary problems it is often better to use 0.3 and 0.7     * or -0.7 and 0.7 as target instead of 0 and 1 or -1 and 1, because the asymptotes (0 and 1)     * tend to take a long time to train, worsen generalization and drive the weights to very     * large values.      * By using this function you can set a different value for the upper bit.     *     * @param aValue the value to use for the upper bit.     */    public void setUpperBit(double aValue) {        upperBit = aValue;    }        /**     * Gets the value used for the upper bit.     *     * @returns the value used for the upper bit.     */    public double getUpperBit() {        return upperBit;    }        /**     * Sets the value for the lower bit.      *     * @param aValue the value to use for the lower bit.     */    public void setLowerBit(double aValue) {        lowerBit = aValue;    }        /**     * Gets the value used for the lower bit.     *     * @returns the value used for the lower bit.     */    public double getLowerBit() {        return lowerBit;    }}

⌨️ 快捷键说明

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