diff --git a/HW_2_sp23_EE374N-385J_Neural_Eng_EMGanalysis/HW2_EMG_Analysis.ipynb b/HW_2_sp23_EE374N-385J_Neural_Eng_EMGanalysis/HW2_EMG_Analysis.ipynb index 93a27ce..a42126d 100644 --- a/HW_2_sp23_EE374N-385J_Neural_Eng_EMGanalysis/HW2_EMG_Analysis.ipynb +++ b/HW_2_sp23_EE374N-385J_Neural_Eng_EMGanalysis/HW2_EMG_Analysis.ipynb @@ -1730,6 +1730,63 @@ "print(f\" Train S2 → Test S1 Run 6 : {acc_s2_to_s1:.4f} ({acc_s2_to_s1*100:.1f}%) [+{(acc_s2_to_s1 - chance)*100:.1f} pp above chance]\")\n", "print(f\" Mean transfer accuracy : {(acc_s1_to_s2 + acc_s2_to_s1) / 2:.4f} ({(acc_s1_to_s2 + acc_s2_to_s1) / 2 * 100:.1f}%)\")" ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "── Cross-Subject CNN Transfer Decoding ─────────────────────────────────\n", + " Window: 250 ms (128 samples) | Overlap: 75%\n", + " Chance level : 33.3%\n", + "\n", + " Train S1 → Test S2 Run 6 : 0.4396 (44.0%) [+10.6 pp above chance]\n", + " Train S2 → Test S1 Run 6 : 0.4189 (41.9%) [+8.6 pp above chance]\n", + " Mean transfer accuracy : 0.4293 (42.9%)\n" + ] + } + ], + "source": [ + "# ── Cross-subject transfer decoding: CNN trained on one subject, tested on the other ──\n", + "\n", + "WIN_TEST = 250 # ms (best window for Subject 1 in Part B CV)\n", + "OVL_TEST = 0.75\n", + "\n", + "s1_runs = filtered_data[0]\n", + "s2_runs = filtered_data[1]\n", + "\n", + "# ── Build raw training/test sets for each subject ──────────────────────────────\n", + "run_raw1 = [extract_run_Xy(r, WIN_TEST, OVL_TEST, raw=True) for r in s1_runs[:5]]\n", + "X_train1_raw = np.vstack([xy[0] for xy in run_raw1])\n", + "y_train1_raw = np.concatenate([xy[1] for xy in run_raw1])\n", + "\n", + "run_raw2 = [extract_run_Xy(r, WIN_TEST, OVL_TEST, raw=True) for r in s2_runs[:5]]\n", + "X_train2_raw = np.vstack([xy[0] for xy in run_raw2])\n", + "y_train2_raw = np.concatenate([xy[1] for xy in run_raw2])\n", + "\n", + "X_test1_raw, y_test1_raw = extract_run_Xy(s1_runs[5], WIN_TEST, OVL_TEST, raw=True)\n", + "X_test2_raw, y_test2_raw = extract_run_Xy(s2_runs[5], WIN_TEST, OVL_TEST, raw=True)\n", + "\n", + "# ── Train S1 → Test S2 ────────────────────────────────────────────────────────\n", + "acc_s1_to_s2 = train_cnn_raw(X_train1_raw, y_train1_raw, X_test2_raw, y_test2_raw)\n", + "\n", + "# ── Train S2 → Test S1 ────────────────────────────────────────────────────────\n", + "acc_s2_to_s1 = train_cnn_raw(X_train2_raw, y_train2_raw, X_test1_raw, y_test1_raw)\n", + "\n", + "chance = 1 / 3\n", + "\n", + "print(\"── Cross-Subject CNN Transfer Decoding ─────────────────────────────────\")\n", + "print(f\" Window: {WIN_TEST} ms ({ms_to_samples(WIN_TEST)} samples) | Overlap: {OVL_TEST:.0%}\")\n", + "print(f\" Chance level : {chance:.1%}\")\n", + "print()\n", + "print(f\" Train S1 → Test S2 Run 6 : {acc_s1_to_s2:.4f} ({acc_s1_to_s2*100:.1f}%) [+{(acc_s1_to_s2 - chance)*100:.1f} pp above chance]\")\n", + "print(f\" Train S2 → Test S1 Run 6 : {acc_s2_to_s1:.4f} ({acc_s2_to_s1*100:.1f}%) [+{(acc_s2_to_s1 - chance)*100:.1f} pp above chance]\")\n", + "print(f\" Mean transfer accuracy : {(acc_s1_to_s2 + acc_s2_to_s1) / 2:.4f} ({(acc_s1_to_s2 + acc_s2_to_s1) / 2 * 100:.1f}%)\")" + ] } ], "metadata": {