added my octave stuff
added my octave stuff
This commit is contained in:
26
franke/octave/functions.m
Normal file
26
franke/octave/functions.m
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
display("functions")
|
||||||
|
|
||||||
|
function win = window(vec, pos)
|
||||||
|
pos = pos / 10;
|
||||||
|
win = vec(pos-50:pos+50-1,:);
|
||||||
|
end
|
||||||
|
|
||||||
|
function flat = flatten(win)
|
||||||
|
flat = reshape(win, rows(win)*columns(win), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
# extract several (windowed) samples from the given input vector
|
||||||
|
function wins = getSamples(Gyro, Accel, Magnet, start, percent)
|
||||||
|
wins = {};
|
||||||
|
lengthMS = length(Magnet) * 10;
|
||||||
|
pEnd = lengthMS * percent;
|
||||||
|
for i = start:150:pEnd
|
||||||
|
winGyro = window(Gyro, i);
|
||||||
|
winAccel = window(Accel, i);
|
||||||
|
winMagnet = window(Magnet, i);
|
||||||
|
win = [winGyro winAccel];
|
||||||
|
win = flatten(win);
|
||||||
|
wins = [wins win];
|
||||||
|
end
|
||||||
|
end
|
||||||
111
franke/octave/helper.m
Normal file
111
franke/octave/helper.m
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
|
||||||
|
clear
|
||||||
|
|
||||||
|
# load data
|
||||||
|
|
||||||
|
#run /mnt/firma/kunden/HandyGames/daten/forwardbend/forwardbend_gl_3_subject_1_left.txt.m
|
||||||
|
|
||||||
|
|
||||||
|
#run /mnt/firma/kunden/HandyGames/daten/kneebend/kneebend_gl_0_subject_0_right.txt.m
|
||||||
|
|
||||||
|
|
||||||
|
function win = window(vec, pos)
|
||||||
|
pos = pos / 10;
|
||||||
|
win = vec(pos-25:pos+25-1,:);
|
||||||
|
end
|
||||||
|
|
||||||
|
function flat = flatten(win)
|
||||||
|
flat = reshape(win, rows(win)*columns(win), 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
function Q = getQ(gyro)
|
||||||
|
|
||||||
|
R = zeros(150,150);
|
||||||
|
m = zeros(150, 1);
|
||||||
|
cnt = 0;
|
||||||
|
|
||||||
|
for i = 1500:50:15000
|
||||||
|
win = window(gyro, i);
|
||||||
|
win = flatten(win);
|
||||||
|
R += win*win';
|
||||||
|
m += win;
|
||||||
|
cnt = cnt + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
R = R / cnt;
|
||||||
|
m = m / cnt;
|
||||||
|
Q = R - m * m';
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function C = getC(A, gyro)
|
||||||
|
C = [];
|
||||||
|
for i = 1500:100:6000
|
||||||
|
win = window(gyro, i);
|
||||||
|
win = flatten(win);
|
||||||
|
c = A * win;
|
||||||
|
C = [c C];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/forwardbend/forwardbend_gl_3_subject_1_left.txt.m
|
||||||
|
Qforward = getQ(Gyro);
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/kneebend/kneebend_gl_0_subject_0_right.txt.m
|
||||||
|
Qkneebend = getQ(Gyro);
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/pushups/pushups_gl_8_subject_4_right.txt.m
|
||||||
|
Qpushups = getQ(Gyro);
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/situps/situps_gl_12_subject_1_left.txt.m
|
||||||
|
Qsitups = getQ(Gyro);
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/jumpingjack/jumpingjack_gl_5_subject_3_left.txt.m
|
||||||
|
Qjumpingjack = getQ(Gyro);
|
||||||
|
|
||||||
|
Q = (Qforward + Qkneebend + Qpushups + Qsitups + Qjumpingjack) / 5;
|
||||||
|
|
||||||
|
|
||||||
|
[eVec, eVal] = eigs(Q,2,'sm');
|
||||||
|
A = eVec';
|
||||||
|
|
||||||
|
#function [P2,D2] = sortEig(P, D, mode)
|
||||||
|
# D2 = diag(sort(diag(D), mode));
|
||||||
|
# [c,ind] = sort(diag(D), mode);
|
||||||
|
# P2=P(:,ind);
|
||||||
|
#end
|
||||||
|
|
||||||
|
#[eVec, eVal] = eig(Q);
|
||||||
|
#[eVec, eVal] = sortEig(eVec, eVal, 'descend');
|
||||||
|
#A = eVec';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
hold on;
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/forwardbend/forwardbend_gl_3_subject_1_left.txt.m
|
||||||
|
C = getC(A, Gyro);
|
||||||
|
plot(C(1,:)',C(2,:)', "+1")
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/kneebend/kneebend_gl_0_subject_0_right.txt.m
|
||||||
|
C = getC(A, Gyro);
|
||||||
|
plot(C(1,:)',C(2,:)', ".2")
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/pushups/pushups_gl_8_subject_4_right.txt.m;
|
||||||
|
C = getC(A, Gyro);
|
||||||
|
plot(C(1,:)',C(2,:)', ".3")
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/situps/situps_gl_12_subject_1_left.txt.m
|
||||||
|
C = getC(A, Gyro);
|
||||||
|
plot(C(1,:)',C(2,:)', ".4")
|
||||||
|
|
||||||
|
run /mnt/firma/kunden/HandyGames/daten/jumpingjack/jumpingjack_gl_5_subject_3_left.txt.m
|
||||||
|
C = getC(A, Gyro);
|
||||||
|
plot(C(1,:)',C(2,:)', ".5")
|
||||||
|
|
||||||
|
hold off;
|
||||||
208
franke/octave/helper2.m
Normal file
208
franke/octave/helper2.m
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
|
||||||
|
clear
|
||||||
|
|
||||||
|
source("training.m");
|
||||||
|
|
||||||
|
# load data
|
||||||
|
|
||||||
|
#run /mnt/firma/kunden/HandyGames/daten/forwardbend/forwardbend_gl_3_subject_1_left.txt.m
|
||||||
|
|
||||||
|
|
||||||
|
#run /mnt/firma/kunden/HandyGames/daten/kneebend/kneebend_gl_0_subject_0_right.txt.m
|
||||||
|
|
||||||
|
|
||||||
|
function C = getC(A, sensor)
|
||||||
|
C = [];
|
||||||
|
for i = 1:numel(sensor)
|
||||||
|
c = A * (sensor{i});
|
||||||
|
C = [c C];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#function C = getC(A, gyro)
|
||||||
|
# C = [];
|
||||||
|
# for i = 1500:50:8000
|
||||||
|
# win = window(gyro, i);
|
||||||
|
# win = flatten(win);
|
||||||
|
# c = A * win;
|
||||||
|
# C = [c C];
|
||||||
|
# end
|
||||||
|
#end
|
||||||
|
|
||||||
|
function cls = getClass(name)
|
||||||
|
cls = {};
|
||||||
|
cls.name = name;
|
||||||
|
cls.samples = {};
|
||||||
|
end
|
||||||
|
|
||||||
|
function m = getM(samples)
|
||||||
|
size = length(samples{1}); # length of the first entry(all have the same size)
|
||||||
|
m = zeros(size,1); # allocate memory
|
||||||
|
for i = 1 : length(samples)
|
||||||
|
m += samples{i};
|
||||||
|
end
|
||||||
|
m /= length(samples);
|
||||||
|
end
|
||||||
|
|
||||||
|
function R = getR(samples)
|
||||||
|
size = length(samples{1}); # length of the first entry(all have the same size)
|
||||||
|
R = zeros(size,size); # allocate memory
|
||||||
|
for i = 1 : length(samples)
|
||||||
|
R += samples{i} * samples{i}';
|
||||||
|
end
|
||||||
|
R /= length(samples);
|
||||||
|
end
|
||||||
|
|
||||||
|
function Q = getQ1(classes)
|
||||||
|
samples = {}
|
||||||
|
for i = 1 : length(classes)
|
||||||
|
samples = [samples classes{i}.samples];
|
||||||
|
end
|
||||||
|
m = getM(samples);
|
||||||
|
R = getR(samples);
|
||||||
|
Q = R - m*m';
|
||||||
|
end
|
||||||
|
|
||||||
|
function Q = getQ3(classes)
|
||||||
|
size = length(classes{1}.samples{1});
|
||||||
|
Q = zeros(size,size);
|
||||||
|
for i = 1 : length(classes)
|
||||||
|
m = getM(classes{i}.samples);
|
||||||
|
R = getR(classes{i}.samples);
|
||||||
|
Q += ( R - m*m' );
|
||||||
|
end
|
||||||
|
Q /= length(classes);
|
||||||
|
end
|
||||||
|
|
||||||
|
function Q = getQ2(classes)
|
||||||
|
|
||||||
|
numClasses = length(classes);
|
||||||
|
size = length(classes{1}.samples{1});
|
||||||
|
|
||||||
|
sumR = zeros(size, size);
|
||||||
|
sumM = zeros(size, size);
|
||||||
|
|
||||||
|
for k = 1 : numClasses
|
||||||
|
R = getR(classes{k}.samples);
|
||||||
|
sumR += R;
|
||||||
|
end
|
||||||
|
|
||||||
|
for k = 2 : numClasses
|
||||||
|
for l = 1 : k-1
|
||||||
|
mk = getM(classes{k}.samples);
|
||||||
|
ml = getM(classes{l}.samples);
|
||||||
|
sumM += (mk*ml') + (ml*mk');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sumM / (numClasses*(numClasses-1))
|
||||||
|
|
||||||
|
Q = (sumR / numClasses) - (sumM / (numClasses*(numClasses-1)));
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function plotC(C, args)
|
||||||
|
plot3(C(1,:)', C(2,:)', C(3,:)', args);
|
||||||
|
end
|
||||||
|
|
||||||
|
function show(A)
|
||||||
|
|
||||||
|
hold on;
|
||||||
|
samples = 6;
|
||||||
|
|
||||||
|
data = getSamplesForClass("forwardbend", samples, 1050, 0.8);
|
||||||
|
C = getC(A, data);
|
||||||
|
plotC(C, "-1");
|
||||||
|
|
||||||
|
data = getSamplesForClass("kneebend", samples, 1050, 0.8);
|
||||||
|
C = getC(A, data);
|
||||||
|
plotC(C, "-2");
|
||||||
|
|
||||||
|
data = getSamplesForClass("pushups", samples, 1050, 0.8);
|
||||||
|
C = getC(A, data);
|
||||||
|
plotC(C, "-3");
|
||||||
|
|
||||||
|
data = getSamplesForClass("situps", samples, 1050, 0.8);
|
||||||
|
C = getC(A, data);
|
||||||
|
plotC(C, "-4");
|
||||||
|
|
||||||
|
data = getSamplesForClass("jumpingjack", samples, 1050, 0.8);
|
||||||
|
C = getC(A, data);
|
||||||
|
plotC(C, "-5");
|
||||||
|
|
||||||
|
hold off;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function avg = getAvg(classes)
|
||||||
|
|
||||||
|
size = length(classes{1}.samples{1});
|
||||||
|
avg = zeros(size,1);
|
||||||
|
cnt = 0;
|
||||||
|
|
||||||
|
for i = 1:numel(classes)
|
||||||
|
for j = 1:numel(classes{i}.samples)
|
||||||
|
avg += classes{i}.samples{j};
|
||||||
|
++cnt;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
avg /= cnt;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function res = removeAvg(classes)
|
||||||
|
|
||||||
|
size = length(classes{1}.samples{1});
|
||||||
|
avg = getAvg(classes);
|
||||||
|
|
||||||
|
for i = 1:numel(classes)
|
||||||
|
for j = 1:numel(classes{i}.samples)
|
||||||
|
classes{i}.samples{j} = classes{i}.samples{j} - avg;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
res = classes;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
classes = {};
|
||||||
|
classes{1}.samples = {};
|
||||||
|
classes{2}.samples = {};
|
||||||
|
classes{3}.samples = {};
|
||||||
|
|
||||||
|
classes{1}.samples = [classes{1}.samples [1;2;3;4]];
|
||||||
|
classes{1}.samples = [classes{1}.samples [1;2;4;5]];
|
||||||
|
|
||||||
|
classes{2}.samples = [classes{2}.samples [3;8;9;0]];
|
||||||
|
classes{2}.samples = [classes{2}.samples [3;7;5;0]];
|
||||||
|
|
||||||
|
classes{3}.samples = [classes{3}.samples [9;1;3;2]];
|
||||||
|
classes{3}.samples = [classes{3}.samples [7;3;3;2]];
|
||||||
|
|
||||||
|
Q1 = getQ1(classes);
|
||||||
|
Q2 = getQ2(classes);
|
||||||
|
Q3 = getQ3(classes);
|
||||||
|
|
||||||
|
Q1
|
||||||
|
Q2
|
||||||
|
Q3
|
||||||
|
|
||||||
|
# get training dataset
|
||||||
|
#classes = getTrainData();
|
||||||
|
#classes = removeAvg(classes);
|
||||||
|
|
||||||
|
#Q1 = getQ1(classes);
|
||||||
|
#[eVec, eVal] = eigs(Q1, 3, 'lm');
|
||||||
|
|
||||||
|
#Q2 = getQ2(classes);
|
||||||
|
#[eVec, eVal] = eigs(Q2, 3, 'lm');
|
||||||
|
|
||||||
|
#Q3 = getQ1(classes);
|
||||||
|
#[eVec, eVal] = eigs(Q3, 3, 'sm');
|
||||||
|
|
||||||
|
#avg = getAvg(classes);
|
||||||
|
|
||||||
|
#A = eVec';
|
||||||
|
#show(A, avg);
|
||||||
|
|
||||||
5
franke/octave/settings.m
Normal file
5
franke/octave/settings.m
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
display("settings")
|
||||||
|
|
||||||
|
global setTrainRuns = 6;
|
||||||
|
global setDataDir = "/mnt/firma/kunden/HandyGames/daten/";
|
||||||
51
franke/octave/training.m
Normal file
51
franke/octave/training.m
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
display("training");
|
||||||
|
source("settings.m");
|
||||||
|
source("functions.m");
|
||||||
|
|
||||||
|
|
||||||
|
function files = getDataFiles(clsName, numPerClass)
|
||||||
|
|
||||||
|
global setDataDir;
|
||||||
|
global setTrainRuns;
|
||||||
|
|
||||||
|
dir = strcat(setDataDir, clsName, "/");
|
||||||
|
lst = readdir(dir);
|
||||||
|
files = {};
|
||||||
|
cnt = 0;
|
||||||
|
for i = 1:numel(lst)
|
||||||
|
filename = lst{i};
|
||||||
|
if (regexp(filename, ".m$")) # use only files ending with .m
|
||||||
|
file = strcat(dir, filename);
|
||||||
|
files = [files file];
|
||||||
|
++cnt;
|
||||||
|
if (cnt >= numPerClass) # use only x input files
|
||||||
|
break;
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function samples = getSamplesForClass(clsName, numPerClass, start, percent)
|
||||||
|
files = getDataFiles(clsName, numPerClass);
|
||||||
|
samples = {};
|
||||||
|
for i = 1 : numel(files)
|
||||||
|
source(files{i});
|
||||||
|
samples = [samples getSamples(Gyro, Accel, Magnet, start, percent)]; # use gyro-sensor readings
|
||||||
|
end
|
||||||
|
display(strcat("training data for '", clsName, "': ", num2str(length(samples)), " samples"));
|
||||||
|
end
|
||||||
|
|
||||||
|
function data = getTrainData()
|
||||||
|
global setTrainRuns;
|
||||||
|
numPerClass = setTrainRuns;
|
||||||
|
data = {};
|
||||||
|
data{1}.samples = getSamplesForClass("forwardbend", numPerClass, 1500, 0.5);
|
||||||
|
data{2}.samples = getSamplesForClass("kneebend", numPerClass, 1500, 0.5);
|
||||||
|
data{3}.samples = getSamplesForClass("pushups", numPerClass, 1500, 0.5);
|
||||||
|
data{4}.samples = getSamplesForClass("situps", numPerClass, 1500, 0.5);
|
||||||
|
data{5}.samples = getSamplesForClass("jumpingjack", numPerClass, 1500, 0.5);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user