Я работаю над набором данных 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 измерениях. В чем может быть проблема с моим применением двух алгоритмов?