diff --git a/franke/octave/functions.m b/franke/octave/functions.m new file mode 100644 index 0000000..f5e1379 --- /dev/null +++ b/franke/octave/functions.m @@ -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 \ No newline at end of file diff --git a/franke/octave/helper.m b/franke/octave/helper.m new file mode 100644 index 0000000..573e78f --- /dev/null +++ b/franke/octave/helper.m @@ -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; \ No newline at end of file diff --git a/franke/octave/helper2.m b/franke/octave/helper2.m new file mode 100644 index 0000000..d802420 --- /dev/null +++ b/franke/octave/helper2.m @@ -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); + diff --git a/franke/octave/settings.m b/franke/octave/settings.m new file mode 100644 index 0000000..b20189f --- /dev/null +++ b/franke/octave/settings.m @@ -0,0 +1,5 @@ + +display("settings") + +global setTrainRuns = 6; +global setDataDir = "/mnt/firma/kunden/HandyGames/daten/"; diff --git a/franke/octave/training.m b/franke/octave/training.m new file mode 100644 index 0000000..346ca2d --- /dev/null +++ b/franke/octave/training.m @@ -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 + +