2016-08-16 7 views
0

[Обновить] Я новичок в weka. Я хочу добавить свой номер double[] array к моему weka Instances dataRaw, но я понятия не имею, как это сделать. Это мой код:Добавить двойной массив [] в примеры weka

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import weka.core.DenseInstance; 
import weka.core.Instances; 

public class SVMTest 
{ 
    private Connection connect; 

    public SVMTest() throws Exception 
    { 
     try 
     { 
     String jdbcDriver ="org.gjt.mm.mysql.Driver"; 
     String jdbcURL = "jdbc:mysql://localhost:3306/xign?"; 
     Class.forName("com.mysql.jdbc.Driver"); 
     connect = DriverManager 
       .getConnection("jdbc:mysql://localhost:3306/myDB?" 
         + "user=" + "root" + "&password=" + 
         "xxx###111"); 

     } catch (ClassNotFoundException ex) 
     { 
     Logger.getLogger(SVMTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public ArrayList<Double[]> loadValues(String generatedString) throws SQLException 
    { 
     ArrayList<Double[]> pictures = new ArrayList<>(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     Double picture[] = new Double[3]; 

    try 
    { 
     ps = connect.prepareStatement("SELECT X, Y, Z FROM myDB.Sensor WHERE key = ?"); 
     ps.setString(1, generatedString); 

     rs = ps.executeQuery(); 
     while(rs.next()) 
     { 
      picture[0] = (rs.getDouble("X") * 100000); 
      picture[1] = (rs.getDouble("Y") * 100000); 
      picture[2] = (rs.getDouble("Z") * 100000); 
      pictures.add(picture); 
      picture = new Long[3]; 
     } 
    } 
    catch (SQLException ex) 
    { 
     Logger.getLogger(SVMTest.class.getName()).log(Level.SEVERE, null, ex);   
    } 
    finally 
    { 
     if(rs != null) 
      try{ rs.close(); } 
      catch(SQLException ex) { ex.printStackTrace(); } 
     if(ps != null) 
      try{ ps.close(); } 
      catch(SQLException ex) { ex.printStackTrace(); } 
    } 
    return pictures; 
    } 

    public double [] toRawArray(Double[] array) 
    { 
     double[] out = new double[array.length]; 
     for(int i = 0; i < array.length; i++) 
     { 
     out[i] = array[i]; 
     } 
     return out; 
    } 

    public static void main(String[] args) throws Exception 
    { 
    SVMTest svm = new SVMTest(); 
    ArrayList<Double[]> myValues = svm.loadValues("123456ASDF"); 

    //at this point I want to add ArrayList<Double[]> myValues to 
    //weka Instances to classify the data but I don't really have 
    //an idea 

    Instances dataRaw = new Instances(?????); <--Error  

    for(Double[] a : myValues) 
    { 
     DenseInstance myDense = new DenseInstance(1.0, toRawArray(a)); 
     dataRaw.add((Instance)myDense.dataset()); 
    } 
    } 
} 

Double[] a выглядит следующим образом:

for(Double[] a : alValues) 
    { 
     for(Double b : a)) 
     { 
      System.out.print("[" + b + "]"); 
     } 
     System.out.println(); 
    } 
//Output: 
//[-1198.54][8534.44][4293.29] 
//[-994.13][8812.43][3534.66] 
//[-818.84][9026.96][2915.99] 
//[-670.76][9186.82][2436.73] 
+0

Хотите добавить экземпляры существующих экземпляров? Как вы создаете свой набор данных? Обновите вопрос, определяющий структуру экземпляра. – Ravikumar

+0

Я не создал DataSet, потому что, хотя я могу получить его с помощью 'myDense.dataSet()' – Bob

+0

Ошибка «Экземпляры не могут быть преобразованы в экземпляр» Является ли это ошибкой компиляции или ошибкой выполнения? И на какой линии вы получаете? – Ravikumar

ответ

1

Просто основное объяснение: - Во-первых, для классификации вам нужна модель и получить необходимую вам модель для обучения алгоритм на данные с атрибутами и classIndex.

Атрибуты «Тип данных», если у вас есть данные о сотрудниках, тогда имя, desgination, age, зарплата и т. Д. Являются атрибутами или простыми именами столбцов в csv-файле.

Тип данных может быть числовым (целым или реальным) или номинальным значением нормальной строки.

Classindex - это индекс атрибута/столбца, который вы хотите, чтобы ваш алгоритм прогнозировал/классифицировал на основе учебных экземпляров. Например, вы можете прогнозировать зарплату, используя возраст и обозначение.

После того, как модель сгенерирована, на этой модели вы можете выполнить классификацию (предсказание), отправив данные в таком же формате, что и экземпляр, созданный с одинаковыми атрибутами и classindex.

Вы должны быть уверены, какой алгоритм вы хотите запустить и какой индекс атрибута/столбца вы хотите предсказать.

[Примечание: - Существуют алгоритмы, которые работают только с числовыми данными, а некоторые другие алгоритмы работают только с Номинальными данными, и некоторый алгоритм будет работать на обоих типах данных. Поэтому вы должны выбрать алгоритм в зависимости от типа данных. Есть другие вещи, которые вы должны проверить перед выбором алгоритма, но базовый - это тип данных.]

Предлагаю вам пройти через machine learning и weka, прежде чем пытаться запустить алгоритм.

Пример кода, который вы можете попробовать и я предполагаю, что ваш classindex быть z: -

ArrayList<Attribute> attributes = new ArrayList<Attribute>(); 
attributes.add(new Attribute("x")); 
attributes.add(new Attribute("y")); 
attributes.add(new Attribute("z")); 

Instances dataRaw = new Instances("TestInstances", attributes , 0); 
dataRaw.setClassIndex(dataRaw.numAttributes() - 1); // Assuming z (z on lastindex) as classindex 

for (Double[] a: myValues) { 
    dataRaw.add(new DenseInstance(1.0, a)); 
} 

// Then train or build the algorithm/model on instances (dataRaw) created above. 

MultilayerPerceptron mlp = new MultilayerPerceptron(); // Sample algorithm, go through about neural networks to use this or replace with appropriate algorithm. 
mlp.buildClassifier(dataRaw); 

// Create a test instance,I think you can create testinstance without 
// classindex value but cross check in weka as I forgot about it. 

double[] values = new double[]{-818.84, 9186.82, 2436.73}; // sample values 
DenseInstance testInstance = new DenseInstance(1.0, values); 
testInstance.setDataset(dataRaw); // To associate with instances object 

// now you can clasify 
double classify = mlp.classifyInstance(testInstance); 

Для получения дополнительной информации: - How to use weka programmatically

 Смежные вопросы

  • Нет связанных вопросов^_^