/* * Copyright 2004-2010 Information & Software Engineering Group (188/1) * Institute of Software Technology and Interactive Systems * Vienna University of Technology, Austria * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.tuwien.ifs.somtoolbox.apps.helper; import java.awt.geom.Point2D; import java.util.Vector; import org.apache.commons.math.random.RandomDataImpl; /** * Utility class to generate a two-dimensional data-set distributed in various different classes. * * @author Michael Dittenbach * @author Rudolf Mayer * @version $Id: DataSetGenerator.java 3888 2010-11-02 17:42:53Z frank $ */ public class DataSetGenerator { private static final String CLASS_1 = "Class 1"; private static final String CLASS_2 = "Class 2"; private static final String CLASS_3 = "Class 3"; private static final String CLASS_4 = "Class 4"; private static final String CLASS_5 = "Class 5"; private static final String CLASS_6 = "Class 6"; public static final String[] CLASS_NAMES = { CLASS_1, CLASS_2, CLASS_3, CLASS_4, CLASS_5, CLASS_6 }; public class DataPoint { private String name = null; private Point2D point = null; public DataPoint(String c, double x, double y) { name = c; point = new Point2D.Double(x, y); } public double getX() { return point.getX(); } public double getY() { return point.getY(); } public void setLocation(double x, double y) { point.setLocation(x, y); } public String getName() { return name; } } static private RandomDataImpl rand = new RandomDataImpl(); Vector<DataPoint> allPoints = new Vector<DataPoint>(); Vector<DataPoint>[] classPoints; @SuppressWarnings("unchecked") public DataSetGenerator() { rand = new RandomDataImpl(); classPoints = new Vector[CLASS_NAMES.length]; for (int i = 0; i < classPoints.length; i++) { classPoints[i] = new Vector<DataPoint>(); } int i = 0; classPoints[i].addAll(generatePoints(CLASS_1 + "_1", 50, 5, 3, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_2", 50, 11, 3, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_3", 50, 5, 6, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_4", 50, 11, 6, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_5", 50, 5, 9, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_6", 50, 11, 9, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_7", 50, 5, 12, 1, 0.5)); classPoints[i].addAll(generatePoints(CLASS_1 + "_8", 50, 11, 12, 1, 0.5)); i++; classPoints[i].addAll(generatePoints(CLASS_2 + "_1", 50, 19, 7.5, 0.5, 2.75)); classPoints[i].addAll(generatePoints(CLASS_2 + "_2", 50, 23, 7.5, 0.5, 2.75)); classPoints[i].addAll(generatePoints(CLASS_2 + "_3", 50, 27, 7.5, 0.5, 2.75)); i++; classPoints[i].addAll(generatePoints(CLASS_3 + "_1_1", 50, 4, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_2", 50, 5.5, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_3", 50, 7, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_4", 50, 8.5, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_5", 50, 10, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_6", 50, 11.5, 18, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_7", 50, 4, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_8", 50, 5.5, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_9", 50, 7, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_10", 50, 8.5, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_11", 50, 10, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_12", 50, 11.5, 19.5, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_13", 50, 4, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_14", 50, 5.5, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_15", 50, 7, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_16", 50, 8.5, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_17", 50, 10, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_1_18", 50, 11.5, 21, 0.25, 0.25)); classPoints[i].addAll(generatePoints(CLASS_3 + "_2", 50, 8, 24.5, 2.5, 1.25)); i++; classPoints[i].addAll(generatePoints(CLASS_4 + "_1_1", 50, 19, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_2", 50, 20, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_3", 50, 21, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_4", 50, 22, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_5", 50, 23, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_6", 50, 24, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_7", 50, 25, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_8", 50, 26, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_9", 50, 27, 18, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_10", 50, 19, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_11", 50, 20, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_12", 50, 21, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_13", 50, 22, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_14", 50, 23, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_15", 50, 24, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_16", 50, 25, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_17", 50, 26, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_1_18", 50, 27, 19, 0.125, 0.125)); classPoints[i].addAll(generatePoints(CLASS_4 + "_2", 50, 20, 22.5, 1, 0.75)); classPoints[i].addAll(generatePoints(CLASS_4 + "_3", 50, 26, 22.5, 1, 0.75)); classPoints[i].addAll(generatePoints(CLASS_4 + "_4", 50, 23, 26.5, 2.5, 0.75)); i++; classPoints[i].addAll(generatePoints(CLASS_5 + "_1", 50, 8, 33, 2.5, 0.5)); classPoints[i].addAll(generatePoints(CLASS_5 + "_2", 50, 8, 36, 2.5, 0.5)); classPoints[i].addAll(generatePoints(CLASS_5 + "_3", 50, 8, 39, 2.5, 0.5)); classPoints[i].addAll(generatePoints(CLASS_5 + "_4", 50, 8, 42, 2.5, 0.5)); i++; classPoints[i].addAll(generatePoints(CLASS_6 + "_1", 50, 20, 33.5, 1, 0.75)); classPoints[i].addAll(generatePoints(CLASS_6 + "_2", 50, 26, 33.5, 1, 0.75)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_1", 50, 19, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_2", 50, 20.5, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_3", 50, 22, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_4", 50, 23.5, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_5", 50, 25, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_3_6", 50, 26.5, 37.5, 0.25, 0.5)); classPoints[i].addAll(generatePoints(CLASS_6 + "_4", 50, 20, 41.5, 1, 0.75)); classPoints[i].addAll(generatePoints(CLASS_6 + "_5", 50, 26, 41.5, 1, 0.75)); for (Vector<DataPoint> classPoint : classPoints) { allPoints.addAll(classPoints[i]); } // wenn alle generiert +minval damit alle positiv sind makeNonNegative(allPoints); } public void printDataSet() { System.out.println(getDataSetAsString()); } public String getDataSetAsString() { StringBuffer sb = new StringBuffer(); sb.append("$TYPE vec\n"); sb.append("$XDIM " + allPoints.size() + "\n"); sb.append("$YDIM 1\n"); sb.append("$VEC_DIM 2\n"); // somlib format for (int i = 0; i < allPoints.size(); i++) { DataPoint d = allPoints.elementAt(i); sb.append(d.getX() + " " + d.getY() + " " + d.getName() + "\n"); } sb.append("\n"); // for matlab sb.append("X = ["); for (int i = 0; i < allPoints.size(); i++) { DataPoint d = allPoints.elementAt(i); sb.append(d.getX() + " "); } sb.append("]\n"); sb.append("Y = ["); for (int i = 0; i < allPoints.size(); i++) { DataPoint d = allPoints.elementAt(i); sb.append(d.getY() + " "); } sb.append("]\n"); return sb.toString(); } /** * @param points vector of dataPoints */ private void makeNonNegative(Vector<DataPoint> points) { double minXValue = Double.MAX_VALUE; double minYValue = Double.MAX_VALUE; for (DataPoint d : points) { if (d.getX() < minXValue) { minXValue = d.getX(); } if (d.getY() < minYValue) { minYValue = d.getY(); } } double xoff = 0, yoff = 0; if (minXValue < 0) { xoff = Math.abs(minXValue); } if (minYValue < 0) { yoff = Math.abs(minYValue); } for (int i = 0; i < points.size(); i++) { DataPoint d = points.elementAt(i); d.setLocation(d.getX() + xoff, d.getY() + yoff); } } public static void main(String[] args) { new DataSetGenerator(); } private Vector<DataPoint> generatePoints(String name, int num, double x, double y, double sigmaX, double sigmaY) { Vector<DataPoint> res = new Vector<DataPoint>(num); for (int i = 0; i < num; i++) { res.addElement(new DataPoint(name + "-" + (i + 1), rand.nextGaussian(x, sigmaX), rand.nextGaussian(y, sigmaY))); } return res; } public DataPoint[] getPoints() { return allPoints.toArray(new DataPoint[allPoints.size()]); } public double[][] getPointsAsDoubles() { double[][] result = new double[allPoints.size()][2]; for (int i = 0; i < allPoints.size(); i++) { result[i][0] = allPoints.elementAt(i).getX(); result[i][1] = allPoints.elementAt(i).getY(); } return result; } public double[][] get3DPointsAsDoubles() { double[][] result = new double[allPoints.size()][3]; for (int i = 0; i < allPoints.size(); i++) { result[i][0] = allPoints.elementAt(i).getX(); result[i][1] = allPoints.elementAt(i).getY(); result[i][2] = allPoints.elementAt(i).getY() * allPoints.elementAt(i).getX() / 2; } return result; } public float[][] getPointsAsFloats() { return doublesToFloats(getPointsAsDoubles()); } public float[][] get3DPointsAsFloats() { return doublesToFloats(get3DPointsAsDoubles()); } private float[][] doublesToFloats(double[][] doubles) { float[][] floats = new float[doubles.length][doubles[0].length]; for (int i = 0; i < doubles.length; i++) { for (int j = 0; j < doubles[i].length; j++) { floats[i][j] = (float) doubles[i][j]; } } return floats; } public double[][][] getData() { double[][][] data = new double[CLASS_NAMES.length][][]; for (int i = 0; i < data.length; i++) { data[i] = new double[classPoints[i].size()][2]; for (int j = 0; j < classPoints[i].size(); j++) { data[i][j][0] = classPoints[i].elementAt(j).getX(); data[i][j][1] = classPoints[i].elementAt(j).getY(); } } return data; } public double[][][] getData3D() { double[][][] data = new double[CLASS_NAMES.length][][]; for (int i = 0; i < data.length; i++) { data[i] = new double[classPoints[i].size()][2]; for (int j = 0; j < classPoints[i].size(); j++) { data[i][j][0] = classPoints[i].elementAt(j).getX(); data[i][j][1] = classPoints[i].elementAt(j).getY(); data[i][i][2] = classPoints[i].elementAt(i).getY() * allPoints.elementAt(i).getX() / 2; } } return data; } }