Skip to content

Commit

Permalink
v0.3.9c:
Browse files Browse the repository at this point in the history
- Fixed a wide number of bugs in importing multivariate data
- Fixed the saving of PCAFaces datasets (really wonder how it was working before that)
- Added the Projected flag to data in the DatasetManager class to know whether the data is original or coming from a projection
  • Loading branch information
Basilio authored and Basilio committed Oct 15, 2011
1 parent 3aaf747 commit fd991b4
Show file tree
Hide file tree
Showing 37 changed files with 1,263 additions and 375 deletions.
514 changes: 257 additions & 257 deletions Core/basicMath.h

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Core/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ void Canvas::PaintMultivariate(QPainter &painter, int type)
bitmap.clear();
maps.samples.setMask(bitmap);
maps.samples.fill(Qt::transparent);
Expose::DrawData(maps.samples, data->GetSamples(), data->GetLabels(), type);
Expose::DrawData(maps.samples, data->GetSamples(), data->GetLabels(), type, data->bProjected);
}
painter.setBackgroundMode(Qt::TransparentMode);
painter.drawPixmap(geometry(), maps.samples);
Expand Down
2 changes: 2 additions & 0 deletions Core/datasetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ u32 DatasetManager::IDCount = 0;
DatasetManager::DatasetManager(int dimension)
: size(dimension)
{
bProjected = false;
ID = IDCount++;
perm = NULL;
}
Expand All @@ -47,6 +48,7 @@ DatasetManager::~DatasetManager()

void DatasetManager::Clear()
{
bProjected = false;
samples.clear();
obstacles.clear();
flags.clear();
Expand Down
3 changes: 3 additions & 0 deletions Core/datasetManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ class DatasetManager

u32 *perm;

public:
bool bProjected;

public:
DatasetManager(int dimension = 2);
~DatasetManager();
Expand Down
62 changes: 40 additions & 22 deletions Core/expose.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "expose.h"
#include "ui_expose.h"
#include <QClipboard>
#include <QDebug>

using namespace std;

Expand All @@ -22,7 +23,7 @@ Expose::~Expose()
delete ui;
}

void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, int type)
void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, int type, bool bProjected)
{
if(!samples.size()) return;
int w = pixmap.width(), h = pixmap.height();
Expand All @@ -31,15 +32,20 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
int gridX = dim;
int gridY = dim;

fvec mins(dim, FLT_MAX), maxes(dim, -FLT_MIN);
fvec mins(dim, FLT_MAX), maxes(dim, -FLT_MIN), diffs(dim, 0);
FOR(d, dim)
{
FOR(i, samples.size())
{
mins[d] = min(mins[d], samples[i][d]);
maxes[d] = max(maxes[d], samples[i][d]);
}
}
}
FOR(d, dim)
{
diffs[d] = maxes[d] - mins[d];
qDebug() << d << diffs[d];
}

int pad = 20;
int mapW = w - pad*2, mapH = h - pad*2;
Expand All @@ -57,28 +63,33 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
FOR(index0, dim)
{
FOR(index1, dim)
{
{
QPixmap map(mapW + 2*pad,mapH + 2*pad);
int smallW = map.width() - 2*pad, smallH = map.height() - 2*pad;
map.fill(Qt::white);
QPainter painter(&map);
painter.setRenderHint(QPainter::Antialiasing);

FOR(i, samples.size())
{
float x = samples[i][index0];
float y = samples[i][index1];
x = (x-mins[index0])/(maxes[index0] - mins[index0]);
y = (y-mins[index1])/(maxes[index1] - mins[index1]);
QPointF point(y*smallW + pad, x*smallH + pad);
float radius = 5;
Canvas::drawSample(painter, point, radius, labels[i]);
}
if(diffs[index0] != 0.f && diffs[index1] != 0.f)
{
FOR(i, samples.size())
{
float x = samples[i][index0];
float y = samples[i][index1];
x = (x-mins[index0])/diffs[index0];
y = (y-mins[index1])/diffs[index1];
QPointF point(y*smallW + pad, x*smallH + pad);
float radius = 5;
Canvas::drawSample(painter, point, radius, labels[i]);
}
}
painter.setBrush(Qt::NoBrush);
painter.setPen(Qt::black);
painter.setRenderHint(QPainter::Antialiasing, false);
painter.drawRect(pad/2,pad/2,smallW+pad, smallH+pad);
painter.drawText(pad/2+1, map.height()-pad/2-1, QString("x%1 x%2").arg(index1+1).arg(index0+1));
QString text = QString("x%1 x%2").arg(index1+1).arg(index0+1);
if(bProjected) text = QString("e%1 e%2").arg(index1+1).arg(index0+1);
painter.drawText(pad/2+1, map.height()-pad/2-1,text);
maps.push_back(map);
}
}
Expand All @@ -99,16 +110,19 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
float x = d*mapW/(float)(dim-1) + pad;
painter.setPen(Qt::black);
painter.drawLine(x, pad, x, mapH+pad);
painter.drawText(x-10, mapH+2*pad-4, QString("x%1").arg(d+1));
QString text = QString("x%1").arg(d+1);
if(bProjected) text = QString("e%1").arg(d+1);
painter.drawText(x-10, mapH+2*pad-4, text);
}

painter.setRenderHint(QPainter::Antialiasing);
FOR(i, samples.size())
{
QPointF old;
FOR(d, dim)
FOR(d, dim)
{
float x = d*mapW/(float)(dim-1) + pad;
if(diffs[d] == 0.f) continue;
float x = d*mapW/(float)(dim-1) + pad;
float y = samples[i][d];
y = (y-mins[d])/(maxes[d] - mins[d]);
QPointF point(x,pad + y*mapH);
Expand All @@ -131,10 +145,12 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
painter.setPen(Qt::black);
FOR(d, dim)
{
float theta = d/(float)(dim)*2*M_PI;
float theta = d/(float)(dim)*2*M_PI;
QPointF point = QPointF(cos(theta), sin(theta))*radius;
if(d) painter.drawLine(center + point, center + old);
painter.drawText(center + point*1.1, QString("x%1").arg(d+1));
QString text = QString("x%1").arg(d+1);
if(bProjected) text = QString("e%1").arg(d+1);
painter.drawText(center + point*1.1, text);
old = point;
}
painter.drawLine(center + QPointF(1.f, 0.f)*radius, center + old);
Expand All @@ -145,7 +161,8 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
float dimSum = 0;
FOR(d, dim)
{
float theta = d/(float)(dim)*2*M_PI;
if(diffs[d] == 0.f) continue;
float theta = d/(float)(dim)*2*M_PI;
QPointF point = QPointF(cos(theta), sin(theta))*radius;
float value = (samples[i][d]-mins[d])/(maxes[d]-mins[d]);
samplePoint += point*value;
Expand Down Expand Up @@ -179,7 +196,8 @@ void Expose::DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, i
float value = 0;
FOR(d, dim)
{
float v = (samples[i][d]-mins[d])/(maxes[d]-mins[d]);
if(diffs[d] == 0.f) continue;
float v = (samples[i][d]-mins[d])/(maxes[d]-mins[d]);
if(!d) value += v*sqrtf(2.f);
else
{
Expand Down
2 changes: 1 addition & 1 deletion Core/expose.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class Expose : public QWidget
explicit Expose(Canvas *canvas, QWidget *parent = 0);
~Expose();

static void DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, int type);
static void DrawData(QPixmap& pixmap, std::vector<fvec> samples, ivec labels, int type, bool bProjected=false);

protected:
void paintEvent(QPaintEvent *event);
Expand Down
2 changes: 1 addition & 1 deletion Core/widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ IplImage *QNamedWindow::toImage( QImage image )
*/

QNamedWindow::QNamedWindow(QString name, bool bResizable, QWidget *parent)
: QWidget(parent), name(name)
: QWidget(parent), name(name)
{
qRegisterMetaType<QImage>("QImage");

Expand Down
Binary file added MLDemos/icons/algorithms.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 6 additions & 2 deletions MLDemos/mldemos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ void MLDemos::AddPlugin(InputOutputInterface *iIO)
inputoutputs.push_back(iIO);
bInputRunning.push_back(false);
connect(this, SIGNAL(SendResults(std::vector<fvec>)), iIO->object(), iIO->FetchResultsSlot());
connect(iIO->object(), iIO->SetDataSignal(), this, SLOT(SetData(std::vector<fvec>, ivec, std::vector<ipair>)));
connect(iIO->object(), iIO->SetDataSignal(), this, SLOT(SetData(std::vector<fvec>, ivec, std::vector<ipair>, bool)));
connect(iIO->object(), iIO->SetTimeseriesSignal(), this, SLOT(SetTimeseries(std::vector<TimeSerie>)));
connect(iIO->object(), iIO->QueryClassifierSignal(), this, SLOT(QueryClassifier(std::vector<fvec>)));
connect(iIO->object(), iIO->QueryRegressorSignal(), this, SLOT(QueryRegressor(std::vector<fvec>)));
Expand Down Expand Up @@ -2331,16 +2331,20 @@ void MLDemos::DisactivateIO(QObject *io)
}
}

void MLDemos::SetData(std::vector<fvec> samples, ivec labels, std::vector<ipair> trajectories)
void MLDemos::SetData(std::vector<fvec> samples, ivec labels, std::vector<ipair> trajectories, bool bProjected)
{
canvas->data->Clear();
canvas->data->AddSamples(samples, labels);
canvas->data->bProjected = bProjected;
if(bProjected) ui.status->setText("Projected Data (PCA, etc.)");
else ui.status->setText("Raw Data");
if(trajectories.size())
{
canvas->data->AddSequences(trajectories);
}
FitToData();
ResetPositiveClass();
CanvasZoomChanged();
canvas->ResetSamples();
canvas->repaint();
}
Expand Down
2 changes: 1 addition & 1 deletion MLDemos/mldemos.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class MLDemos : public QMainWindow
signals:
void SendResults(std::vector<fvec> results);
public slots:
void SetData(std::vector<fvec> samples, ivec labels, std::vector<ipair> trajectories);
void SetData(std::vector<fvec> samples, ivec labels, std::vector<ipair> trajectories, bool bProjected);
void SetTimeseries(std::vector<TimeSerie> timeseries);
void QueryClassifier(std::vector<fvec> samples);
void QueryRegressor(std::vector<fvec> samples);
Expand Down
14 changes: 4 additions & 10 deletions MLDemos/mldemos.ui
Original file line number Diff line number Diff line change
Expand Up @@ -127,17 +127,11 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QLabel" name="status">
<property name="text">
<string> </string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</widget>
</item>
</layout>
</widget>
Expand Down
1 change: 0 additions & 1 deletion _3rdParty/MathLib/Matrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -793,7 +793,6 @@ class Matrix
return *this;
}


inline virtual Matrix& operator = (const Matrix &matrix)
{
return Set(matrix);
Expand Down
2 changes: 1 addition & 1 deletion _AlgorithmsPlugins/Projections/classifierLinear.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ void ClassifierLinear::TrainICA(std::vector< fvec > samples, const ivec &labels
}
meanAll /= samples.size();

const int nbsensors = samples[0].size();
const int nbsensors = dim;
const int nbsamples = samples.size();

if(!Transf)
Expand Down
56 changes: 42 additions & 14 deletions _AlgorithmsPlugins/Projections/interfaceProjections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,8 @@ void ClassProjections::ShowProjection()
}
if(classifierType == 3) // ICA
{
fvec meanAll; meanAll.resize(samples[0].size(), 0);
int dim = samples[0].size();
fvec meanAll; meanAll.resize(dim, 0);
FOR(i, samples.size())
{
meanAll += samples[i];
Expand All @@ -241,29 +242,56 @@ void ClassProjections::ShowProjection()
vector<fvec> projected(samples.size());
FOR(i, samples.size()) projected[i] = ((ClassifierLinear *)classifier)->Project(samples[i]);
// draw lines
vector<QPointF> points(samples.size());
vector<QPointF> originals(samples.size());
QPointF pointsMean(0,0), originalsMean(0,0);
fvec mins(2, FLT_MAX), maxes(2, -FLT_MAX);
FOR(i, samples.size())
{
fvec& sample = samples[i];
int& label = labels[i];
fvec& newSample = projected[i];

QPointF point = canvas->toCanvasCoords(newSample)/canvas->width()*w*0.5 + QPointF(w*0.5, 0);
QPointF original = canvas->toCanvasCoords(samples[i]-meanAll)/canvas->width()*w*0.5;
QPointF point = canvas->toCanvasCoords(newSample);
point = QPointF(point.x()/canvas->width(), point.y()/canvas->height());
mins[0] = min(mins[0], (float)point.x());
maxes[0] = max(maxes[0], (float)point.x());
mins[1] = min(mins[1], (float)point.y());
maxes[1] = max(maxes[1], (float)point.y());
QPointF original = canvas->toCanvasCoords(sample-meanAll);
original = QPointF(original.x()/canvas->width(), original.y()/canvas->height());
points[i] = point;
originals[i] = original;
pointsMean += point;
originalsMean += original;
}
pointsMean /= samples.size();
originalsMean /= samples.size();
qDebug() << "means" << pointsMean << originalsMean;
FOR(i, samples.size())
{
QPointF original = originals[i] - originalsMean;
original.setX(original.x()*w*0.5 + w*0.25);
original.setY(original.y()*h + h*0.5);
QPointF point = points[i];
point = QPointF((point.x()-mins[0])/(maxes[0]-mins[0]) - 0.5f, (point.y()-mins[1])/(maxes[1]-mins[1]) - 0.5f);
point.setX(point.x()*w*0.4 + w*0.75);
point.setY(point.y()*h*0.8 + h*0.5);
if(original.x() > w/2) continue;
painter.setPen(QPen(QColor(0,0,0,40), 0.2));
painter.drawLine(original, point);
}

// draw samples
FOR(i, samples.size())
{
fvec sample = samples[i];
int label = labels[i];
fvec newSample = projected[i];

QPointF point = canvas->toCanvasCoords(newSample)/canvas->width()*w*0.5 + QPointF(w*0.5, 0);
QPointF original = canvas->toCanvasCoords(samples[i]-meanAll)/canvas->width()*w*0.5;
Canvas::drawSample(painter, point, 6, label);
Canvas::drawSample(painter, original, 6, label);
QPointF original = originals[i] - originalsMean;
original.setX(original.x()*w*0.5 + w*0.25);
original.setY(original.y()*h + h*0.5);
QPointF point = points[i];
point = QPointF((point.x()-mins[0])/(maxes[0]-mins[0]) - 0.5f, (point.y()-mins[1])/(maxes[1]-mins[1]) - 0.5f);
point.setX(point.x()*w*0.4 + w*0.75);
point.setY(point.y()*h*0.8 + h*0.5);
Canvas::drawSample(painter, point, 6, labels[i]);
if(original.x() > w/2) continue;
Canvas::drawSample(painter, original, 6, labels[i]);
}

painter.setPen(QPen(Qt::black, 2.f));
Expand Down
Loading

0 comments on commit fd991b4

Please # to comment.