Как обнаружить ошибки в моем алгоритме извлечения функций? - PullRequest
0 голосов
/ 12 октября 2019

Я работаю над набором данных sEMG. Набор данных состоит из 38 предметов, каждый предмет имеет 30 примеров из 5 движений. Каждое движение записывается с использованием 8 электродов, поэтому на вход подается 8 сигналов SEMG для каждого движения. Я пытаюсь извлечь функции и визуализировать их с помощью PCA, используя два разных алгоритма извлечения функций. Первый алгоритм использует Windowing на каждом канале из 8 каналов. размер окна 500 с перекрытием 50%. Затем я извлекаю 7 элементов из каждого окна - изменения знака наклона, среднеквадратичное отклонение, VAR, MAV, пересечение нуля, длину волны и SKEWNESS. Затем объекты помещаются в вектор.

channels = {}

for i in range(8):
channels["channel{}".format(i)] = np.loadtxt("channel {}.txt".format(i))
channels["channel{}".format(i)] = np.delete(channels["channel{}".format(i)], np.s_[10000:15000], axis=1)
channels["channel{}".format(i)] = channels["channel{}".format(i)] * 14000
print(channels["channel0"][1])
featureMatrix = np.zeros((1110, 1))
for i in range(8):
    winStart = 0
    winFinish = 500
    while winFinish <= 10000:
        featureMatrix = np.column_stack((featureMatrix, zerocrossings(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, mavfinder(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, rmsfinder(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, slopesign(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, WLcalculator(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, Skewcalculator(channels["channel{}".format(i)][:, winStart:winFinish])))
        featureMatrix = np.column_stack((featureMatrix, VARcalculator(channels["channel{}".format(i)][:, winStart:winFinish])))
        winStart += 250
        winFinish += 250

Второй Алгоритм I использовал разложение вейвлет-пакета с 4 слоями, затем вычислял энергию в каждом узле в 4-м слое (16 узлов) и получал общую длину 16 * 8 векторов признаков.

channels = {}
featureMatrix = np.zeros((1110, 128))
wp = {}
for i in range(8):
    channels["channel{}".format(i)] = np.loadtxt("channel {}.txt".format(i))
    channels["channel{}".format(i)] = np.delete(channels["channel{}".format(i)], np.s_[10000:15000], axis=1)
    channels["channel{}".format(i)] = channels["channel{}".format(i)]


for i in range(8):
    energy1 = 0
    energy2 = 0
    energy3 = 0
    energy4 = 0
    energy5 = 0
    energy6 = 0
    energy7 = 0
    energy8 = 0
    energy9 = 0
    energy10 = 0
    energy11 = 0
    energy12 = 0
    energy13 = 0
    energy14 = 0
    energy15 = 0
    energy16 = 0
    data = [0] * 10000
    for j in range(1110):
        for k in range(10000):
            data[k] = channels["channel{}".format(i)][j, k]
        wp = pywt.WaveletPacket(data=data, wavelet='db5', mode='symmetric')
        for val in wp['aaaa'].data:
            energy1 += pow(val, 2)
        featureMatrix[j, i * 16] = energy1

        for val in wp['aaad'].data:
            energy2 += pow(val, 2)
        featureMatrix[j, 1 + (i * 16)] = energy2

        for val in wp['aada'].data:
            energy3 += pow(val, 2)
        featureMatrix[j, 2 + (i * 16)] = energy3

        for val in wp['aadd'].data:
            energy4 += pow(val, 2)
        featureMatrix[j, 3 + (i * 16)] = energy4

        for val in wp['adaa'].data:
            energy5 += pow(val, 2)
        featureMatrix[j, 4 + (i * 16)] = energy5

        for val in wp['adad'].data:
        energy6 += pow(val, 2)
        featureMatrix[j, 5 + (i * 16)] = energy6

        for val in wp['adda'].data:
            energy7 += pow(val, 2)
        featureMatrix[j, 6 + (i * 16)] = energy7

        for val in wp['addd'].data:
            energy8 += pow(val, 2)
        featureMatrix[j, 7 + (i * 16)] = energy8

        for val in wp['daaa'].data:
            energy9 += pow(val, 2)
        featureMatrix[j, 8 + (i * 16)] = energy9

        for val in wp['daad'].data:
            energy10 += pow(val, 2)
        featureMatrix[j, 9 + (i * 16)] = energy10

        for val in wp['dada'].data:
            energy11 += pow(val, 2)
        featureMatrix[j, 10 + (i * 16)] = energy11

        for val in wp['dadd'].data:
            energy12 += pow(val, 2)
        featureMatrix[j, 11 + (i * 16)] = energy12

        for val in wp['ddaa'].data:
            energy13 += pow(val, 2)
        featureMatrix[j, 12 + (i * 16)] = energy13

        for val in wp['ddad'].data:
            energy14 += pow(val, 2)
        featureMatrix[j, 13 + (i * 16)] = energy14

        for val in wp['ddda'].data:
            energy15 += pow(val, 2)
        featureMatrix[j, 14 + (i * 16)] = energy15

        for val in wp['dddd'].data:
            energy16 += pow(val, 2)
        featureMatrix[j, 15 + (i * 16)] = energy16

Проблема заключается в использовании PCA для визуализации двух алгоритмов. PCA возвращает странную заштрихованную линию в трехмерном пространстве.

Визуализация PCA Алгоритма 2 Визуализация PCA Алгоритма 1 Я использовал встроенную функцию pca из scikitи спроектировал особенности в 3 измерениях. В чем может быть проблема с моим применением двух алгоритмов?

...