📄 predictionappender.java
字号:
makeDataSetProbabilities(testSet, classifier,relationNameModifier); notifyDataSetAvailable(new DataSetEvent(this, new Instances(newInstances,0))); if (e.getTestSet().isStructureOnly()) { m_format = newInstances; } // fill in predicted probabilities for (int i = 0; i < testSet.numInstances(); i++) { double [] preds = classifier. distributionForInstance(testSet.instance(i)); for (int j = 0; j < testSet.classAttribute().numValues(); j++) { newInstances.instance(i).setValue(testSet.numAttributes()+j, preds[j]); } } // notify listeners notifyDataSetAvailable(new DataSetEvent(this, newInstances)); } catch (Exception ex) { ex.printStackTrace(); } } } } /** * Accept and process a batch classifier event * * @param e a <code>BatchClassifierEvent</code> value */ public void acceptClusterer(BatchClustererEvent e) { if (m_dataSourceListeners.size() > 0) { if(e.getTestSet().isStructureOnly()) return; Instances testSet = e.getTestSet().getDataSet(); weka.clusterers.Clusterer clusterer = e.getClusterer(); String test; if(e.getTestOrTrain()==0) test = "test"; else test = "training"; String relationNameModifier = "_"+test+"_"+e.getSetNumber()+"_of_" +e.getMaxSetNumber(); if (!m_appendProbabilities || !(clusterer instanceof DensityBasedClusterer)) { if(m_appendProbabilities && !(clusterer instanceof DensityBasedClusterer)){ System.err.println("Only density based clusterers can append probabilities. Instead cluster will be assigned for each instance."); if (m_logger != null) { m_logger.logMessage("Only density based clusterers can append probabilities. Instead cluster will be assigned for each instance."); } } try { Instances newInstances = makeClusterDataSetClass(testSet, clusterer, relationNameModifier); notifyDataSetAvailable(new DataSetEvent(this, new Instances(newInstances,0))); // fill in predicted values for (int i = 0; i < testSet.numInstances(); i++) { double predCluster = clusterer.clusterInstance(testSet.instance(i)); newInstances.instance(i).setValue(newInstances.numAttributes()-1, predCluster); } // notify listeners notifyDataSetAvailable(new DataSetEvent(this, newInstances)); return; } catch (Exception ex) { ex.printStackTrace(); } } else{ try { Instances newInstances = makeClusterDataSetProbabilities(testSet, clusterer,relationNameModifier); notifyDataSetAvailable(new DataSetEvent(this, new Instances(newInstances,0))); // fill in predicted probabilities for (int i = 0; i < testSet.numInstances(); i++) { double [] probs = clusterer. distributionForInstance(testSet.instance(i)); for (int j = 0; j < clusterer.numberOfClusters(); j++) { newInstances.instance(i).setValue(testSet.numAttributes()+j, probs[j]); } } // notify listeners notifyDataSetAvailable(new DataSetEvent(this, newInstances)); } catch (Exception ex) { ex.printStackTrace(); } } } } private Instances makeDataSetProbabilities(Instances format, weka.classifiers.Classifier classifier, String relationNameModifier) throws Exception { int numOrigAtts = format.numAttributes(); Instances newInstances = new Instances(format); for (int i = 0; i < format.classAttribute().numValues(); i++) { weka.filters.unsupervised.attribute.Add addF = new weka.filters.unsupervised.attribute.Add(); addF.setAttributeIndex("last"); addF.setAttributeName("prob_"+format.classAttribute().value(i)); addF.setInputFormat(newInstances); newInstances = weka.filters.Filter.useFilter(newInstances, addF); } newInstances.setRelationName(format.relationName()+relationNameModifier); return newInstances; } private Instances makeDataSetClass(Instances format, weka.classifiers.Classifier classifier, String relationNameModifier) throws Exception { weka.filters.unsupervised.attribute.Add addF = new weka.filters.unsupervised.attribute.Add(); addF.setAttributeIndex("last"); String classifierName = classifier.getClass().getName(); classifierName = classifierName. substring(classifierName.lastIndexOf('.')+1, classifierName.length()); addF.setAttributeName("class_predicted_by: "+classifierName); if (format.classAttribute().isNominal()) { String classLabels = ""; Enumeration enu = format.classAttribute().enumerateValues(); classLabels += (String)enu.nextElement(); while (enu.hasMoreElements()) { classLabels += ","+(String)enu.nextElement(); } addF.setNominalLabels(classLabels); } addF.setInputFormat(format); Instances newInstances = weka.filters.Filter.useFilter(format, addF); newInstances.setRelationName(format.relationName()+relationNameModifier); return newInstances; } private Instances makeClusterDataSetProbabilities(Instances format, weka.clusterers.Clusterer clusterer, String relationNameModifier) throws Exception { int numOrigAtts = format.numAttributes(); Instances newInstances = new Instances(format); for (int i = 0; i < clusterer.numberOfClusters(); i++) { weka.filters.unsupervised.attribute.Add addF = new weka.filters.unsupervised.attribute.Add(); addF.setAttributeIndex("last"); addF.setAttributeName("prob_cluster"+i); addF.setInputFormat(newInstances); newInstances = weka.filters.Filter.useFilter(newInstances, addF); } newInstances.setRelationName(format.relationName()+relationNameModifier); return newInstances; } private Instances makeClusterDataSetClass(Instances format, weka.clusterers.Clusterer clusterer, String relationNameModifier) throws Exception { weka.filters.unsupervised.attribute.Add addF = new weka.filters.unsupervised.attribute.Add(); addF.setAttributeIndex("last"); String clustererName = clusterer.getClass().getName(); clustererName = clustererName. substring(clustererName.lastIndexOf('.')+1, clustererName.length()); addF.setAttributeName("assigned_cluster: "+clustererName); //if (format.classAttribute().isNominal()) { String clusterLabels = "0"; /*Enumeration enu = format.classAttribute().enumerateValues(); clusterLabels += (String)enu.nextElement(); while (enu.hasMoreElements()) { clusterLabels += ","+(String)enu.nextElement(); }*/ for(int i = 1; i <= clusterer.numberOfClusters()-1; i++) clusterLabels += ","+i; addF.setNominalLabels(clusterLabels); //} addF.setInputFormat(format); Instances newInstances = weka.filters.Filter.useFilter(format, addF); newInstances.setRelationName(format.relationName()+relationNameModifier); return newInstances; } /** * Notify all instance listeners that an instance is available * * @param e an <code>InstanceEvent</code> value */ protected void notifyInstanceAvailable(InstanceEvent e) { Vector l; synchronized (this) { l = (Vector)m_instanceListeners.clone(); } if (l.size() > 0) { for(int i = 0; i < l.size(); i++) { ((InstanceListener)l.elementAt(i)).acceptInstance(e); } } } /** * Notify all Data source listeners that a data set is available * * @param e a <code>DataSetEvent</code> value */ protected void notifyDataSetAvailable(DataSetEvent e) { Vector l; synchronized (this) { l = (Vector)m_dataSourceListeners.clone(); } if (l.size() > 0) { for(int i = 0; i < l.size(); i++) { ((DataSourceListener)l.elementAt(i)).acceptDataSet(e); } } } /** * Set a logger * * @param logger a <code>weka.gui.Logger</code> value */ public void setLog(weka.gui.Logger logger) { m_logger = logger; } public void stop() { // cant really do anything meaningful here } /** * Returns true if, at this time, * the object will accept a connection according to the supplied * event name * * @param eventName the event * @return true if the object will accept a connection */ public boolean connectionAllowed(String eventName) { return (m_listenee == null); } /** * Returns true if, at this time, * the object will accept a connection according to the supplied * EventSetDescriptor * * @param esd the EventSetDescriptor * @return true if the object will accept a connection */ public boolean connectionAllowed(EventSetDescriptor esd) { return connectionAllowed(esd.getName()); } /** * Notify this object that it has been registered as a listener with * a source with respect to the supplied event name * * @param eventName * @param source the source with which this object has been registered as * a listener */ public synchronized void connectionNotification(String eventName, Object source) { if (connectionAllowed(eventName)) { m_listenee = source; } } /** * Notify this object that it has been deregistered as a listener with * a source with respect to the supplied event name * * @param eventName the event name * @param source the source with which this object has been registered as * a listener */ public synchronized void disconnectionNotification(String eventName, Object source) { if (m_listenee == source) { m_listenee = null; m_format = null; // assume any calculated instance format if now invalid } } /** * Returns true, if at the current time, the named event could * be generated. Assumes that supplied event names are names of * events that could be generated by this bean. * * @param eventName the name of the event in question * @return true if the named event could be generated at this point in * time */ public boolean eventGeneratable(String eventName) { if (m_listenee == null) { return false; } if (m_listenee instanceof EventConstraints) { if (eventName.equals("instance")) { if (!((EventConstraints)m_listenee). eventGeneratable("incrementalClassifier")) { return false; } } if (eventName.equals("dataSet")) { if (!((EventConstraints)m_listenee). eventGeneratable("batchClassifier") && !((EventConstraints)m_listenee). eventGeneratable("batchClusterer")) { return false; } } } return true; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -