📄 naivebayes.java
字号:
}
attIndex++;
}
m_ClassDistribution.addValue(instance.classValue(),
instance.weight());
}
}
/**
* Calculates the class membership probabilities for the given test
* instance.
*
* @param instance the instance to be classified
* @return predicted class probability distribution
* @exception Exception if there is a problem generating the prediction
*/
public double [] distributionForInstance(Instance instance)
throws Exception {
if (m_UseDiscretization) {
m_Disc.input(instance);
instance = m_Disc.output();
}
double [] probs = new double[m_NumClasses];
for (int j = 0; j < m_NumClasses; j++) {
probs[j] = m_ClassDistribution.getProbability(j);
}
Enumeration emAtts = instance.emerateAttributes();
int attIndex = 0;
while (emAtts.hasMoreElements()) {
Attribute attribute = (Attribute) emAtts.nextElement();
if (!instance.isMissing(attribute)) {
double temp, max = 0;
for (int j = 0; j < m_NumClasses; j++) {
temp = Math.max(1e-75, m_Distributions[attIndex][j].
getProbability(instance.value(attribute)));
probs[j] *= temp;
if (probs[j] > max) {
max = probs[j];
}
if (Double.isNaN(probs[j])) {
throw new Exception("NaN returned from estimator for attribute "
+ attribute.name() + ":\n"
+ m_Distributions[attIndex][j].toString());
}
}
if ((max > 0) && (max < 1e-75)) { // Danger of probability underflow
for (int j = 0; j < m_NumClasses; j++) {
probs[j] *= 1e75;
}
}
}
attIndex++;
}
// Display probabilities
Utils.normalize(probs);
return probs;
}
/**
* Returns an enumeration describing the available options.
*
* @return an enumeration of all the available options.
*/
public Enumeration<Option> listOptions() {
Vector<Option> newVector = new Vector<Option>(2);
newVector.addElement(
new Option("\tUse kernel density estimator rather than normal\n"
+"\tdistribution for numeric attributes",
"K", 0,"-K"));
newVector.addElement(
new Option("\tUse supervised discretization to process numeric attributes\n",
"D", 0,"-D"));
return newVector.elements();
}
/**
* Parses a given list of options. Valid options are:<p>
*
* -K <br>
* Use kernel estimation for modelling numeric attributes rather than
* a single normal distribution.<p>
*
* -D <br>
* Use supervised discretization to process numeric attributes.
*
* @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 {
boolean k = Utils.getFlag('K', options);
boolean d = Utils.getFlag('D', options);
if (k && d) {
throw new IllegalArgumentException("Can't use both kernel density " +
"estimation and discretization!");
}
setUseSupervisedDiscretization(d);
setUseKernelEstimator(k);
Utils.checkForRemainingOptions(options);
}
/**
* Gets the current settings of the classifier.
*
* @return an array of strings suitable for passing to setOptions
*/
public String [] getOptions() {
String [] options = new String [2];
int current = 0;
if (m_UseKernelEstimator) {
options[current++] = "-K";
}
if (m_UseDiscretization) {
options[current++] = "-D";
}
while (current < options.length) {
options[current++] = "";
}
return options;
}
/**
* Returns a description of the classifier.
*
* @return a description of the classifier as a string.
*/
public String toString() {
StringBuffer text = new StringBuffer();
text.append("Naive Bayes Classifier");
if (m_Instances == null) {
text.append(": No model built yet.");
} else {
try {
for (int i = 0; i < m_Distributions[0].length; i++) {
text.append("\n\nClass " + m_Instances.classAttribute().value(i) +
": Prior probability = " + Utils.
doubleToString(m_ClassDistribution.getProbability(i),
4, 2) + "\n\n");
Enumeration emAtts = m_Instances.emerateAttributes();
int attIndex = 0;
while (emAtts.hasMoreElements()) {
Attribute attribute = (Attribute) emAtts.nextElement();
text.append(attribute.name() + ": "
+ m_Distributions[attIndex][i]);
attIndex++;
}
}
} catch (Exception ex) {
text.append(ex.getMessage());
}
}
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 useKernelEstimatorTipText() {
return "Use a kernel estimator for numeric attributes rather than a "
+"normal distribution.";
}
/**
* Gets if kernel estimator is being used.
*
* @return Value of m_UseKernelEstimatory.
*/
public boolean getUseKernelEstimator() {
return m_UseKernelEstimator;
}
/**
* Sets if kernel estimator is to be used.
*
* @param v Value to assign to m_UseKernelEstimatory.
*/
public void setUseKernelEstimator(boolean v) {
m_UseKernelEstimator = v;
if (v) {
setUseSupervisedDiscretization(false);
}
}
/**
* Returns the tip text for this property
* @return tip text for this property suitable for
* displaying in the explorer/experimenter gui
*/
public String useSupervisedDiscretizationTipText() {
return "Use supervised discretization to convert numeric attributes to nominal "
+"ones.";
}
/**
* Get whether supervised discretization is to be used.
*
* @return true if supervised discretization is to be used.
*/
public boolean getUseSupervisedDiscretization() {
return m_UseDiscretization;
}
/**
* Set whether supervised discretization is to be used.
*
* @param newblah true if supervised discretization is to be used.
*/
public void setUseSupervisedDiscretization(boolean newblah) {
m_UseDiscretization = newblah;
if (newblah) {
setUseKernelEstimator(false);
}
}
/**
* Main method for testing this class.
*
* @param argv the options
*/
public static void main(String [] argv) {
try {
System.out.println(Evaluation.evaluateModel(new NaiveBayes(), argv));
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getMessage());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -