📄 randomsearch.java
字号:
if (m_verbose) {
options[current++] = "-V";
}
if (!(getStartSet().equals(""))) {
options[current++] = "-P";
options[current++] = ""+startSetToString();
}
options[current++] = "-F";
options[current++] = "" + m_searchSize;
while (current < options.length) {
options[current++] = "";
}
return options;
}
/**
* converts the array of starting attributes to a string. This is
* used by getOptions to return the actual attributes specified
* as the starting set. This is better than using m_startRanges.getRanges()
* as the same start set can be specified in different ways from the
* command line---eg 1,2,3 == 1-3. This is to ensure that stuff that
* is stored in a database is comparable.
* @return a comma seperated list of individual attribute numbers as a String
*/
private String startSetToString() {
StringBuffer FString = new StringBuffer();
boolean didPrint;
if (m_starting == null) {
return getStartSet();
}
for (int i = 0; i < m_starting.length; i++) {
didPrint = false;
if ((m_hasClass == false) ||
(m_hasClass == true && i != m_classIndex)) {
FString.append((m_starting[i] + 1));
didPrint = true;
}
if (i == (m_starting.length - 1)) {
FString.append("");
}
else {
if (didPrint) {
FString.append(",");
}
}
}
return FString.toString();
}
/**
* prints a description of the search
* @return a description of the search as a string
*/
public String toString() {
StringBuffer text = new StringBuffer();
text.append("\tRandom search.\n\tStart set: ");
if (m_starting == null) {
text.append("no attributes\n");
}
else {
text.append(startSetToString()+"\n");
}
text.append("\tNumber of iterations: "+m_iterations+" ("
+(m_searchSize * 100.0)+"% of the search space)\n");
text.append("\tMerit of best subset found: "
+Utils.doubleToString(Math.abs(m_bestMerit),8,3)+"\n");
return text.toString();
}
/**
* Searches the attribute subset space randomly.
*
* @param ASEvaluator the attribute evaluator to guide the search
* @param data the training instances.
* @return an array (not necessarily ordered) of selected attribute indexes
* @exception Exception if the search can't be completed
*/
public int[] search (ASEvaluation ASEval, Instances data)
throws Exception {
double best_merit;
int sizeOfBest = m_numAttribs;
BitSet temp;
m_bestGroup = new BitSet(m_numAttribs);
m_onlyConsiderBetterAndSmaller = false;
if (!(ASEval instanceof SubsetEvaluator)) {
throw new Exception(ASEval.getClass().getName()
+ " is not a "
+ "Subset evaluator!");
}
m_random = new Random(m_seed);
if (ASEval instanceof UnsupervisedSubsetEvaluator) {
m_hasClass = false;
}
else {
m_hasClass = true;
m_classIndex = data.classIndex();
}
SubsetEvaluator ASEvaluator = (SubsetEvaluator)ASEval;
m_numAttribs = data.numAttributes();
m_startRange.setUpper(m_numAttribs-1);
if (!(getStartSet().equals(""))) {
m_starting = m_startRange.getSelection();
}
// If a starting subset has been supplied, then initialise the bitset
if (m_starting != null) {
for (int i = 0; i < m_starting.length; i++) {
if ((m_starting[i]) != m_classIndex) {
m_bestGroup.set(m_starting[i]);
}
}
m_onlyConsiderBetterAndSmaller = true;
best_merit = ASEvaluator.evaluateSubset(m_bestGroup);
sizeOfBest = countFeatures(m_bestGroup);
} else {
// do initial random subset
m_bestGroup = generateRandomSubset();
best_merit = ASEvaluator.evaluateSubset(m_bestGroup);
}
if (m_verbose) {
System.out.println("Initial subset ("
+Utils.doubleToString(Math.
abs(best_merit),8,5)
+"): "+printSubset(m_bestGroup));
}
int i;
if (m_hasClass) {
i = m_numAttribs -1;
} else {
i = m_numAttribs;
}
m_iterations = (int)((m_searchSize * Math.pow(2, i)));
int tempSize;
double tempMerit;
// main loop
for (i=0;i<m_iterations;i++) {
temp = generateRandomSubset();
if (m_onlyConsiderBetterAndSmaller) {
tempSize = countFeatures(temp);
if (tempSize <= sizeOfBest) {
tempMerit = ASEvaluator.evaluateSubset(temp);
if (tempMerit >= best_merit) {
sizeOfBest = tempSize;
m_bestGroup = temp;
best_merit = tempMerit;
if (m_verbose) {
System.out.print("New best subset ("
+Utils.doubleToString(Math.
abs(best_merit),8,5)
+"): "+printSubset(m_bestGroup) + " :");
System.out.println(Utils.
doubleToString((((double)i)/
((double)m_iterations)*
100.0),5,1)
+"% done");
}
}
}
} else {
tempMerit = ASEvaluator.evaluateSubset(temp);
if (tempMerit > best_merit) {
m_bestGroup = temp;
best_merit = tempMerit;
if (m_verbose) {
System.out.print("New best subset ("
+Utils.doubleToString(Math.abs(best_merit),8,5)
+"): "+printSubset(m_bestGroup) + " :");
System.out.println(Utils.
doubleToString((((double)i)/
((double)m_iterations)
*100.0),5,1)
+"% done");
}
}
}
}
m_bestMerit = best_merit;
return attributeList(m_bestGroup);
}
/**
* prints a subset as a series of attribute numbers
* @param temp the subset to print
* @return a subset as a String of attribute numbers
*/
private String printSubset(BitSet temp) {
StringBuffer text = new StringBuffer();
for (int j=0;j<m_numAttribs;j++) {
if (temp.get(j)) {
text.append((j+1)+" ");
}
}
return text.toString();
}
/**
* converts a BitSet into a list of attribute indexes
* @param group the BitSet to convert
* @return an array of attribute indexes
**/
private int[] attributeList (BitSet group) {
int count = 0;
// count how many were selected
for (int i = 0; i < m_numAttribs; i++) {
if (group.get(i)) {
count++;
}
}
int[] list = new int[count];
count = 0;
for (int i = 0; i < m_numAttribs; i++) {
if (group.get(i)) {
list[count++] = i;
}
}
return list;
}
/**
* generates a random subset
* @return a random subset as a BitSet
*/
private BitSet generateRandomSubset() {
BitSet temp = new BitSet(m_numAttribs);
double r;
for (int i=0;i<m_numAttribs;i++) {
r = m_random.nextDouble();
if (r <= 0.5) {
if (m_hasClass && i == m_classIndex) {
} else {
temp.set(i);
}
}
}
return temp;
}
/**
* counts the number of features in a subset
* @param featureSet the feature set for which to count the features
* @return the number of features in the subset
*/
private int countFeatures(BitSet featureSet) {
int count = 0;
for (int i=0;i<m_numAttribs;i++) {
if (featureSet.get(i)) {
count++;
}
}
return count;
}
/**
* resets to defaults
*/
private void resetOptions() {
m_starting = null;
m_startRange = new Range();
m_searchSize = 0.25;
m_seed = 1;
m_onlyConsiderBetterAndSmaller = false;
m_verbose = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -