📄 instances.java
字号:
if ((position < 0) || (position >= m_Attributes.size())) {
throw new IllegalArgumentException("Index out of range");
}
if (position == m_ClassIndex) {
throw new IllegalArgumentException("Can't delete class attribute");
}
freshAttributeInfo();
if (m_ClassIndex > position) {
m_ClassIndex--;
}
m_Attributes.removeElementAt(position);
for (int i = position; i < m_Attributes.size(); i++) {
Attribute current = (Attribute)m_Attributes.elementAt(i);
current.setIndex(current.index() - 1);
}
for (int i = 0; i < numInstances(); i++) {
instance(i).forceDeleteAttributeAt(position);
}
}
/**
* Deletes all string attributes in the dataset. A deep copy of the attribute
* information is performed before an attribute is deleted.
*
* @exception IllegalArgumentException if string attribute couldn't be
* successfully deleted (probably because it is the class attribute).
*/
public void deleteStringAttributes() {
int i = 0;
while (i < m_Attributes.size()) {
if (attribute(i).isString()) {
deleteAttributeAt(i);
} else {
i++;
}
}
}
/**
* Removes all instances with missing values for a particular
* attribute from the dataset.
*
* @param attIndex the attribute's index
*/
public final void deleteWithMissing(int attIndex) {
FastVector newInstances = new FastVector(numInstances());
for (int i = 0; i < numInstances(); i++) {
if (!instance(i).isMissing(attIndex)) {
newInstances.addElement(instance(i));
}
}
m_Instances = newInstances;
}
/**
* Removes all instances with missing values for a particular
* attribute from the dataset.
*
* @param att the attribute
*/
public final void deleteWithMissing(Attribute att) {
deleteWithMissing(att.index());
}
/**
* Removes all instances with a missing class value
* from the dataset.
*
* @exception UnassignedClassException if class is not set
*/
public final void deleteWithMissingClass() {
if (m_ClassIndex < 0) {
throw new UnassignedClassException("Class index is negative (not set)!");
}
deleteWithMissing(m_ClassIndex);
}
/**
* Returns an enumeration of all the attributes.
*
* @return enumeration of all the attributes.
*/
public Enumeration emerateAttributes() {
return m_Attributes.elements(m_ClassIndex);
}
/**
* Returns an enumeration of all instances in the dataset.
*
* @return enumeration of all instances in the dataset
*/
public final Enumeration emerateInstances() {
return m_Instances.elements();
}
/**
* Checks if two headers are equivalent.
*
* @param dataset another dataset
* @return true if the header of the given dataset is equivalent
* to this header
*/
public final boolean equalHeaders(Instances dataset){
// Check class and all attributes
if (m_ClassIndex != dataset.m_ClassIndex) {
return false;
}
if (m_Attributes.size() != dataset.m_Attributes.size()) {
return false;
}
for (int i = 0; i < m_Attributes.size(); i++) {
if (!(attribute(i).equals(dataset.attribute(i)))) {
return false;
}
}
return true;
}
/**
* Returns the first instance in the set.
*
* @return the first instance in the set
*/
public final Instance firstInstance() {
return (Instance)m_Instances.firstElement();
}
/**
* Returns a random number generator. The initial seed of the random
* number generator depends on the given seed and the hash code of
* a string representation of a instances chosen based on the given
* seed.
*
* @param seed the given seed
* @return the random number generator
*/
public Random getRandomNumberGenerator(long seed) {
Random r = new Random(seed);
r.setSeed(instance(r.nextInt(numInstances())).toString().hashCode() + seed);
return r;
}
/**
* Inserts an attribute at the given position (0 to
* numAttributes()) and sets all values to be missing.
* Shallow copies the attribute before it is inserted, and performs
* a deep copy of the existing attribute information.
*
* @param att the attribute to be inserted
* @param pos the attribute's position
* @exception IllegalArgumentException if the given index is out of range
*/
public void insertAttributeAt(Attribute att, int position) {
if ((position < 0) ||
(position > m_Attributes.size())) {
throw new IllegalArgumentException("Index out of range");
}
att = (Attribute)att.copy();
freshAttributeInfo();
att.setIndex(position);
m_Attributes.insertElementAt(att, position);
for (int i = position + 1; i < m_Attributes.size(); i++) {
Attribute current = (Attribute)m_Attributes.elementAt(i);
current.setIndex(current.index() + 1);
}
for (int i = 0; i < numInstances(); i++) {
instance(i).forceInsertAttributeAt(position);
}
if (m_ClassIndex >= position) {
m_ClassIndex++;
}
}
/**
* Returns the instance at the given position.
*
* @param index the instance's index
* @return the instance at the given position
*/
public final Instance instance(int index) {
return (Instance)m_Instances.elementAt(index);
}
/**
* Returns the last instance in the set.
*
* @return the last instance in the set
*/
public final Instance lastInstance() {
return (Instance)m_Instances.lastElement();
}
/**
* Returns the mean (mode) for a numeric (nominal) attribute as
* a floating-point value. Returns 0 if the attribute is neither nominal nor
* numeric. If all values are missing it returns zero.
*
* @param attIndex the attribute's index
* @return the mean or the mode
*/
public final double meanOrMode(int attIndex) {
double result, found;
int [] counts;
if (attribute(attIndex).isNumeric()) {
result = found = 0;
for (int j = 0; j < numInstances(); j++) {
if (!instance(j).isMissing(attIndex)) {
found += instance(j).weight();
result += instance(j).weight()*instance(j).value(attIndex);
}
}
if (found <= 0) {
return 0;
} else {
return result / found;
}
} else if (attribute(attIndex).isNominal()) {
counts = new int[attribute(attIndex).numValues()];
for (int j = 0; j < numInstances(); j++) {
if (!instance(j).isMissing(attIndex)) {
counts[(int) instance(j).value(attIndex)] += instance(j).weight();
}
}
return (double)Utils.maxIndex(counts);
} else {
return 0;
}
}
/**
* Returns the mean (mode) for a numeric (nominal) attribute as a
* floating-point value. Returns 0 if the attribute is neither
* nominal nor numeric. If all values are missing it returns zero.
*
* @param att the attribute
* @return the mean or the mode
*/
public final double meanOrMode(Attribute att) {
return meanOrMode(att.index());
}
/**
* Returns the number of attributes.
*
* @return the number of attributes as an integer
*/
public final int numAttributes() {
return m_Attributes.size();
}
/**
* Returns the number of class labels.
*
* @return the number of class labels as an integer if the class
* attribute is nominal, 1 otherwise.
* @exception UnassignedClassException if the class is not set
*/
public final int numClasses() {
if (m_ClassIndex < 0) {
throw new UnassignedClassException("Class index is negative (not set)!");
}
if (!classAttribute().isNominal()) {
return 1;
} else {
return classAttribute().numValues();
}
}
/**
* Returns the number of distinct values of a given attribute.
* Returns the number of instances if the attribute is a
* string attribute. The value 'missing' is not counted.
*
* @param attIndex the attribute
* @return the number of distinct values of a given attribute
*/
public final int numDistinctValues(int attIndex) {
if (attribute(attIndex).isNumeric()) {
double [] attVals = attributeToDoubleArray(attIndex);
int [] sorted = Utils.sort(attVals);
double prev = 0;
int counter = 0;
for (int i = 0; i < sorted.length; i++) {
Instance current = instance(sorted[i]);
if (current.isMissing(attIndex)) {
break;
}
if ((i == 0) ||
(current.value(attIndex) > prev)) {
prev = current.value(attIndex);
counter++;
}
}
return counter;
} else {
return attribute(attIndex).numValues();
}
}
/**
* Returns the number of distinct values of a given attribute.
* Returns the number of instances if the attribute is a
* string attribute. The value 'missing' is not counted.
*
* @param att the attribute
* @return the number of distinct values of a given attribute
*/
public final int numDistinctValues(Attribute att) {
return numDistinctValues(att.index());
}
/**
* Returns the number of instances in the dataset.
*
* @return the number of instances in the dataset as an integer
*/
public final int numInstances() {
return m_Instances.size();
}
/**
* Shuffles the instances in the set so that they are ordered
* randomly.
*
* @param random a random number generator
*/
public final void randomize(Random random) {
for (int j = numInstances() - 1; j > 0; j--)
swap(j, random.nextInt(j+1));
}
/**
* Reads a single instance from the reader and appends it
* to the dataset. Automatically expands the dataset if it
* is not large enough to hold the instance. This method does
* not check for carriage return at the end of the line.
*
* @param reader the reader
* @return false if end of file has been reached
* @exception IOException if the information is not read
* successfully
*/
public final boolean readInstance(Reader reader)
throws IOException {
StreamTokenizer tokenizer = new StreamTokenizer(reader);
initTokenizer(tokenizer);
return getInstance(tokenizer, false);
}
/**
* Returns the relation's name.
*
* @return the relation's name as a string
*/
public final String relationName() {
return m_RelationName;
}
/**
* Renames an attribute. This change only affects this
* dataset.
*
* @param att the attribute's index
* @param name the new name
*/
public final void renameAttribute(int att, String name) {
Attribute newAtt = attribute(att).copy(name);
FastVector newVec = new FastVector(numAttributes());
for (int i = 0; i < numAttributes(); i++) {
if (i == att) {
newVec.addElement(newAtt);
} else {
newVec.addElement(attribute(i));
}
}
m_Attributes = newVec;
}
/**
* Renames an attribute. This change only affects this
* dataset.
*
* @param att the attribute
* @param name the new name
*/
public final void renameAttribute(Attribute att, String name) {
renameAttribute(att.index(), name);
}
/**
* Renames the value of a nominal (or string) attribute value. This
* change only affects this dataset.
*
* @param att the attribute's index
* @param val the value's index
* @param name the new name
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -