📄 leastmedsq.java
字号:
* Returns a string representing the best * LinearRegression classifier found. * * @return String representing the regression */ public String toString(){ if( m_ls == null){ return "model has not been built"; } return m_ls.toString(); } /** * Builds a weight function removing instances with an * abnormally high scaled residual * * @throws Exception if weight building fails */ private void buildWeight()throws Exception{ findResiduals(); m_scalefactor = 1.4826 * ( 1 + 5 / (m_Data.numInstances() - m_Data.numAttributes())) * Math.sqrt(m_bestMedian); m_weight = new double[m_Residuals.length]; for (int i = 0; i < m_Residuals.length; i++) m_weight[i] = ((Math.sqrt(m_Residuals[i])/m_scalefactor < 2.5)?1.0:0.0); } /** * Builds a new LinearRegression without the 'bad' data * found by buildWeight * * @throws if building fails */ private void buildRLSRegression()throws Exception{ buildWeight(); m_RLSData = new Instances(m_Data); int x = 0; int y = 0; int n = m_RLSData.numInstances(); while(y < n){ if (m_weight[x] == 0){ m_RLSData.delete(y); n = m_RLSData.numInstances(); y--; } x++; y++; } if ( m_RLSData.numInstances() == 0){ System.err.println("rls regression unbuilt"); m_ls = m_currentRegression; }else{ m_ls = new LinearRegression(); m_ls.setOptions(new String[]{"-S", "1"}); m_ls.buildClassifier(m_RLSData); m_currentRegression = m_ls; } } /** * Finds the kth number in an array * * @param a an array of numbers * @param l left pointer * @param r right pointer * @param k position of number to be found */ private static void select( double [] a, int l, int r, int k){ if (r <=l) return; int i = partition( a, l, r); if (i > k) select(a, l, i-1, k); if (i < k) select(a, i+1, r, k); } /** * Partitions an array of numbers such that all numbers * less than that at index r, between indexes l and r * will have a smaller index and all numbers greater than * will have a larger index * * @param a an array of numbers * @param l left pointer * @param r right pointer * @return final index of number originally at r */ private static int partition( double [] a, int l, int r ){ int i = l-1, j = r; double v = a[r], temp; while(true){ while(a[++i] < v); while(v < a[--j]) if(j == l) break; if(i >= j) break; temp = a[i]; a[i] = a[j]; a[j] = temp; } temp = a[i]; a[i] = a[r]; a[r] = temp; return i; } /** * Produces a random sample from m_Data * in m_SubSample * * @param data data from which to take sample * @throws Exception if an error occurs */ private void selectSubSample(Instances data)throws Exception{ m_SplitFilter = new RemoveRange(); m_SplitFilter.setInvertSelection(true); m_SubSample = data; m_SplitFilter.setInputFormat(m_SubSample); m_SplitFilter.setInstancesIndices(selectIndices(m_SubSample)); m_SubSample = Filter.useFilter(m_SubSample, m_SplitFilter); } /** * Returns a string suitable for passing to RemoveRange consisting * of m_samplesize indices. * * @param data dataset from which to take indicese * @return string of indices suitable for passing to RemoveRange */ private String selectIndices(Instances data){ StringBuffer text = new StringBuffer(); for(int i = 0, x = 0; i < m_samplesize; i++){ do{x = (int) (m_random.nextDouble() * data.numInstances());} while(x==0); text.append(Integer.toString(x)); if(i < m_samplesize - 1) text.append(","); else text.append("\n"); } return text.toString(); } /** * Returns the tip text for this property * @return tip text for this property suitable for * displaying in the explorer/experimenter gui */ public String sampleSizeTipText() { return "Set the size of the random samples used to generate the least sqaured " +"regression functions."; } /** * sets number of samples * * @param samplesize value */ public void setSampleSize(int samplesize){ m_samplesize = samplesize; } /** * gets number of samples * * @return value */ public int getSampleSize(){ return m_samplesize; } /** * Returns the tip text for this property * @return tip text for this property suitable for * displaying in the explorer/experimenter gui */ public String randomSeedTipText() { return "Set the seed for selecting random subsamples of the training data."; } /** * Set the seed for the random number generator * * @param randomseed the seed */ public void setRandomSeed(long randomseed){ m_randomseed = randomseed; } /** * get the seed for the random number generator * * @return the seed value */ public long getRandomSeed(){ return m_randomseed; } /** * sets whether or not debugging output shouild be printed * * @param debug true if debugging output selected */ public void setDebug(boolean debug){ m_debug = debug; } /** * Returns whether or not debugging output shouild be printed * * @return true if debuging output selected */ public boolean getDebug(){ return m_debug; } /** * Returns an enumeration of all the available options.. * * @return an enumeration of all available options. */ public Enumeration listOptions(){ Vector newVector = new Vector(1); newVector.addElement(new Option("\tSet sample size\n" + "\t(default: 4)\n", "S", 4, "-S <sample size>")); newVector.addElement(new Option("\tSet the seed used to generate samples\n" + "\t(default: 0)\n", "G", 0, "-G <seed>")); newVector.addElement(new Option("\tProduce debugging output\n" + "\t(default no debugging output)\n", "D", 0, "-D")); return newVector.elements(); } /** * Sets the OptionHandler's options using the given list. All options * will be set (or reset) during this call (i.e. incremental setting * of options is not possible). * <!-- options-start --> * Valid options are: <p/> * * <pre> -S <sample size> * Set sample size * (default: 4) * </pre> * * <pre> -G <seed> * Set the seed used to generate samples * (default: 0) * </pre> * * <pre> -D * Produce debugging output * (default no debugging output) * </pre> * <!-- options-end --> * * @param options the list of options as an array of strings * @throws Exception if an option is not supported */ public void setOptions(String[] options) throws Exception { String curropt = Utils.getOption('S', options); if ( curropt.length() != 0){ setSampleSize(Integer.parseInt(curropt)); } else setSampleSize(4); curropt = Utils.getOption('G', options); if ( curropt.length() != 0){ setRandomSeed(Long.parseLong(curropt)); } else { setRandomSeed(0); } setDebug(Utils.getFlag('D', options)); } /** * Gets the current option settings for the OptionHandler. * * @return the list of current option settings as an array of strings */ public String[] getOptions(){ String options[] = new String[9]; int current = 0; options[current++] = "-S"; options[current++] = "" + getSampleSize(); options[current++] = "-G"; options[current++] = "" + getRandomSeed(); if (getDebug()) { options[current++] = "-D"; } while (current < options.length) { options[current++] = ""; } return options; } /** * Produces the combination nCr * * @param n * @param r * @return the combination * @throws Exception if r is greater than n */ public static int combinations (int n, int r)throws Exception { int c = 1, denom = 1, num = 1, i,orig=r; if (r > n) throw new Exception("r must be less that or equal to n."); r = Math.min( r , n - r); for (i = 1 ; i <= r; i++){ num *= n-i+1; denom *= i; } c = num / denom; if(false) System.out.println( "n: "+n+" r: "+orig+" num: "+num+ " denom: "+denom+" c: "+c); return c; } /** * generate a Linear regression predictor for testing * * @param argv options */ public static void main(String [] argv){ try{ System.out.println(Evaluation.evaluateModel(new LeastMedSq(), argv)); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } // main} // lmr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -