📄 leastmedsq.java
字号:
*/
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
* @exception 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).
*
* @param options the list of options as an array of strings
* @exception 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 n
* @return the combination
* @exception 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 + -