<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何從智能手機數據模擬人類活動 > 原文: [https://machinelearningmastery.com/how-to-model-human-activity-from-smartphone-data/](https://machinelearningmastery.com/how-to-model-human-activity-from-smartphone-data/) 人類活動識別是將由專用線束或智能電話記錄的加速度計數據序列分類為已知的明確定義的運動的問題。 鑒于每秒產生大量觀測結果,觀測的時間性質以及缺乏將加速度計數據與已知運動聯系起來的明確方法,這是一個具有挑戰性的問題。 該問題的經典方法涉及基于固定大小的窗口和訓練機器學習模型(例如決策樹的集合)的時間序列數據中的手工制作特征。困難在于此功能工程需要該領域的深厚專業知識。 最近,諸如循環神經網絡和一維卷積神經網絡(CNN)之類的深度學習方法已經被證明在很少或沒有數據特征工程的情況下提供具有挑戰性的活動識別任務的最新結果。 在本教程中,您將發現用于時間序列分類的'_ 活動識別使用智能手機 _'數據集,以及如何加載和探索數據集以使其為預測建模做好準備。 完成本教程后,您將了解: * 如何下載數據集并將其加載到內存中。 * 如何使用線圖,直方圖和箱線圖來更好地理解運動數據的結構。 * 如何建模問題,包括框架,數據準備,建模和評估。 讓我們開始吧。 ![How to Model Human Activity From Smartphone Data](https://img.kancloud.cn/bc/9d/bc9ddedebd3a1adb593f0e39293128ce_640x419.jpg) 如何從智能手機數據模擬人類活動 照片由[攝影師](https://www.flickr.com/photos/corker888/23930933844/),保留一些權利。 ## 教程概述 本教程分為 10 個部分;他們是: 1. 人類活動識別 2. 使用智能手機數據集進行活動識別 3. 下載數據集 4. 加載數據 5. 活動類平衡 6. 繪制一個主題的時間序列數據 7. 繪制每個主題的直方圖 8. 繪制每個活動的直方圖 9. 繪制活動持續時間箱圖 10. 建模方法 ## 1.人類活動識別 [人類活動識別](https://en.wikipedia.org/wiki/Activity_recognition),或簡稱為 HAR,是基于使用傳感器的移動痕跡來預測人正在做什么的問題。 運動通常是正常的室內活動,例如站立,坐著,跳躍和上樓梯。 傳感器通常位于主體上,例如智能手機或背心,并且經常以三維(x,y,z)記錄加速度計數據。 > 人類活動識別(HAR)旨在識別由一個人對他/她自己和周圍環境進行一組觀察所執行的動作。識別可以通過利用從各種來源(例如環境或身體佩戴的傳感器)檢索的信息來實現。 - [使用智能手機進行人類活動識別的公共領域數據集](https://upcommons.upc.edu/handle/2117/20897),2013 年。 這個想法是,一旦主體的活動被識別和知道,智能計算機系統就可以提供幫助。 這是一個具有挑戰性的問題,因為沒有明確的分析方法將傳感器數據與一般方式的特定動作聯系起來。由于收集了大量的傳感器數據(例如,每秒數十或數百次觀察),并且在開發預測模型時從這些數據中經典使用手工制作的特征和啟發式,因此在技術上具有挑戰性。 最近,深度學習方法已經成功地證明了 HAR 問題,因為它們能夠自動學習更高階的特征。 > 基于傳感器的活動識別從大量低水平傳感器讀數中尋找關于人類活動的深刻的高級知識。傳統的模式識別方法在過去幾年中取得了巨大的進步。然而,這些方法通常嚴重依賴于啟發式手工特征提取,這可能會妨礙它們的泛化表現。 [...]最近,深度學習的最新進展使得可以執行自動高級特征提取,從而在許多領域實現了有希望的表現。 - [基于傳感器的活動識別深度學習:調查](https://arxiv.org/abs/1707.03502) ## 2.使用智能手機數據集識別活動 標準人類活動識別數據集是 2012 年提供的“_ 活動識別使用智能手機 _”數據集。 它由 Davide Anguita 等人準備并提供。來自意大利熱那亞大學的 2013 年論文“[使用智能手機進行人類活動識別的公共領域數據集](https://upcommons.upc.edu/handle/2117/20897)”中對該數據集進行了全面描述。該數據集在他們的 2012 年論文中用機器學習算法建模,標題為“[使用多類硬件友好支持向量機](https://link.springer.com/chapter/10.1007/978-3-642-35395-6_30)在智能手機上進行人類活動識別。“ 數據集可用,可以從 UCI 機器學習庫免費下載: * [使用智能手機數據集進行人類活動識別](https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones) 該數據來自 30 名年齡在 19 至 48 歲之間的受試者,他們進行 6 項標準活動中的一項,同時佩戴記錄運動數據的腰部智能手機。記錄執行活動的每個受試者的視頻,并從這些視頻手動標記移動數據。 以下是在記錄其移動數據的同時執行活動的主體的示例視頻。 &lt;iframe allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="375" src="https://www.youtube.com/embed/XOEN9W05_4A?feature=oembed" width="500"&gt;&lt;/iframe&gt; 進行的六項活動如下: 1. 步行 2. 走上樓 3. 走樓下 4. 坐在 5. 常設 6. 鋪設 記錄的運動數據是來自智能手機的 x,y 和 z 加速度計數據(線性加速度)和陀螺儀數據(角速度),特別是[三星 Galaxy S II](https://en.wikipedia.org/wiki/Samsung_Galaxy_S_II) 。 以 50Hz(即每秒 50 個數據點)記錄觀察結果。每個受試者進行兩次活動,一次是左側設備,另一次是右側設備。 > 選擇了一組 30 名志愿者,年齡從 19 歲到 48 歲不等。每個人都被要求遵循活動協議,同時佩戴腰部安裝的三星 Galaxy S II 智能手機。六個選定的 ADL 是站立,坐下,放下,走路,走樓下和樓上。每個受試者執行兩次協議:在第一次試驗中,智能手機固定在皮帶的左側,而第二次試驗由用戶自己放置為首選 - [使用智能手機進行人類活動識別的公共領域數據集](https://upcommons.upc.edu/handle/2117/20897),2013。 原始數據不可用。相反,可以使用預處理版本的數據集。 預處理步驟包括: * 使用噪聲濾波器預處理加速度計和陀螺儀。 * 將數據拆分為 2.56 秒(128 個數據點)的固定窗口,重疊率為 50%。 * 將加速度計數據分割為重力(總)和身體運動分量。 > 使用中值濾波器和具有 20Hz 截止頻率的 3 階低通巴特沃斯濾波器對這些信號進行預處理以降低噪聲。 [...]加速度信號,具有重力和身體運動成分,使用另一個巴特沃斯低通濾波器分離成身體加速度和重力。 - [使用智能手機進行人類活動識別的公共領域數據集](https://upcommons.upc.edu/handle/2117/20897),2013 年。 特征工程應用于窗口數據,并且提供具有這些工程特征的數據的副本。 從每個窗口提取在人類活動識別領域中常用的許多時間和頻率特征。結果是 561 元素的特征向量。 根據受試者的數據,將數據集分成訓練(70%)和測試(30%)組。訓練 21 個,測試 9 個。 這表明問題的框架,其中一系列運動活動被用作輸入來預測當前正在進行的活動的部分(2.56 秒),其中使用已知受試者訓練的模型來預測新受試者的運動活動。 。 使用旨在用于智能手機的支持向量機(例如定點算術)的早期實驗結果導致測試數據集的預測準確度為 89%,實現與未修改的 SVM 實現類似的結果。 > 該方法適用于標準支持向量機(SVM)并利用定點算法來降低計算成本。與傳統 SVM 的比較表明,計算成本方面有顯著改善,同時保持了相似的精度[...] - [智能手機上的人類活動識別使用多類硬件友好支持向量機](https://link.springer.com/chapter/10.1007/978-3-642-35395-6_30),2012。 現在我們已經熟悉了預測問題,我們將看看加載和探索這個數據集。 ## 3.下載數據集 該數據集是免費提供的,可以從 UCI 機器學習庫下載。 數據以單個 zip 文件的形式提供,大小約為 58 兆字節。此下載的直接鏈接如下: * [UCI HAR Dataset.zip](https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%20HAR%20Dataset.zip) 下載數據集并將所有文件解壓縮到當前工作目錄中名為“ _HARDataset_ ”的新目錄中。 檢查解壓縮的內容,您會注意到以下幾點: * 存在“ _train_ ”和“ _test_ ”文件夾,其包含用于建模的數據的分割部分(例如,70%/ 30%)。 * 有一個“ _README.txt_ ”文件,其中包含數據集的詳細技術說明和解壓縮文件的內容。 * 有一個“ _features.txt_ ”文件,其中包含工程特性的技術說明。 “ _train_ ”和“ _test_ ”文件夾的內容類似(例如文件夾和文件名),盡管它們包含的特定數據存在差異。 檢查“train”文件夾顯示了一些重要元素: * 包含預處理數據的“ _Inertial Signals_ ”文件夾。 * “ _X_train.txt_ ”文件,包含用于擬合模型的工程特征。 * “ _y_train.txt_ ”包含每個觀察的類標簽(1-6)。 * “ _subject_train.txt_ ”文件,其中包含數據文件中每一行的映射及其主題標識符(1-30)。 每個文件中的行數匹配,表示每行是每個數據文件中的一個記錄。 “ _Inertial Signals_ ”目錄包含 9 個文件。 * _x,y 和 z 軸的重力加速度 _ 數據文件: _total_acc_x_train.txt_ , _total_acc_y_train.txt_ , _total_acc_z_train.txt_ 。 * _x,y 和 z 軸的身體加速度 _ 數據文件: _body_acc_x_train.txt_ , _body_acc_y_train.txt_ ,body_acc_z_train.txt。 * _x,y 和 z 軸的體陀螺 _ 數據文件: _body_gyro_x_train.txt_ , _body_gyro_y_train.txt_ , _body_gyro_z_train.txt_ 。 該結構在“ _test_ ”目錄中進行鏡像。 我們將把注意力集中在“_ 慣性信號 _”中的數據,因為這是開發可以學習合適表示的機器學習模型中最有趣的,而不是使用特定于域的特征工程。 檢查數據文件顯示列由空格分隔,值顯示為縮放到-1,1。此縮放可以通過數據集隨附的 _README.txt_ 文件中的注釋確認。 現在我們知道了我們擁有的數據,我們可以弄清楚如何將其加載到內存中。 ## 4.加載數據 在本節中,我們將開發一些代碼來將數據集加載到內存中。 首先,我們需要加載一個文件。 我們可以使用 [read_csv()Pandas 函數](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)來加載單個數據文件,并指定該文件沒有標題并使用空格分隔列。 ```py dataframe = read_csv(filepath, header=None, delim_whitespace=True) ``` 我們可以將它包裝在名為 _load_file()_ 的函數中。下面列出了此功能的完整示例。 ```py # load dataset from pandas import read_csv # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values data = load_file('HARDataset/train/Inertial Signals/total_acc_y_train.txt') print(data.shape) ``` 運行該示例加載文件' _total_acc_y_train.txt_ ',返回 NumPy 數組,并打印數組的形狀。 我們可以看到訓練數據由 7,352 行或數據窗口組成,其中每個窗口有 128 個觀察值。 ```py (7352, 128) ``` 接下來,將一組文件(例如所有身體加速度數據文件)作為單個組加載將是有用的。 理想情況下,在處理多變量時間序列數據時,以下列格式構建數據非常有用: ```py [samples, timesteps, features] ``` 這有助于分析,并且是對諸如卷積神經網絡和循環神經網絡的深度學習模型的期望。 我們可以通過多次調用上面的 _load_file()_ 函數來實現這一點,對于組中的每個文件一次。 一旦我們將每個文件作為 NumPy 數組加載,我們就可以將所有三個數組組合或堆疊在一起。我們可以使用 [dstack()NumPy 函數](https://www.numpy.org/devdocs/reference/generated/numpy.dstack.html)來確保每個數組的堆疊方式使得要素在第三維中分離,正如我們所希望的那樣。 函數 _load_group()_ 對文件名列表實現此行為,如下所示。 ```py # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded ``` 我們可以通過加載所有總加速文件來演示此功能。 下面列出了完整的示例。 ```py # load dataset from numpy import dstack from pandas import read_csv # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load the total acc data filenames = ['total_acc_x_train.txt', 'total_acc_y_train.txt', 'total_acc_z_train.txt'] total_acc = load_group(filenames, prefix='HARDataset/train/Inertial Signals/') print(total_acc.shape) ``` 運行該示例將打印返回的 NumPy 數組的形狀,顯示數據集的三個要素 x,y 和 z 的預期樣本數和時間步長。 ```py (7352, 128, 3) ``` 最后,我們可以使用到目前為止開發的兩個函數來加載訓練和測試數據集的所有數據。 給定訓練和測試文件夾中的并行結構,我們可以開發一個新函數來加載給定文件夾的所有輸入和輸出數據。該函數可以構建要加載的所有 9 個數據文件的列表,將它們作為一個具有 9 個特征的 NumPy 數組加載,然后加載包含輸出類的數據文件。 下面的 _load_dataset()_ 函數實現了這種行為。它可以被稱為“ _train_ ”組或“ _test_ ”組,作為字符串參數傳遞。 ```py # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y ``` 下面列出了完整的示例。 ```py # load dataset from numpy import dstack from pandas import read_csv # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y # load all train trainX, trainy = load_dataset('train', 'HARDataset/') print(trainX.shape, trainy.shape) # load all test testX, testy = load_dataset('test', 'HARDataset/') print(testX.shape, testy.shape) ``` 運行該示例將加載訓練和測試數據集。 我們可以看到測試數據集有 2,947 行窗口數據。正如預期的那樣,我們可以看到訓練和測試裝置中的窗口大小匹配,并且每個訓練和測試用例中的輸出(y)大小與樣本數量相匹配。 ```py (7352, 128, 9) (7352, 1) (2947, 128, 9) (2947, 1) ``` 既然我們知道如何加載數據,我們就可以開始探索它了。 ## 5.活動類平衡 對數據進行良好的首次檢查是調查每項活動的平衡。 我們相信,30 個科目中的每一個都進行了六項活動。 確認此期望將檢查數據是否確實平衡,使模型更容易,并確認我們正確加載和解釋數據集。 我們可以開發一個函數來總結輸出變量的細分,例如: y 變量。 下面的函數 _class_breakdown()_ 實現了這種行為,首先將提供的 NumPy 數組包裝在 DataFrame 中,按類值對行進行分組,并計算每個組的大小(行數)。然后總結結果,包括計數和百分比。 ```py # summarize the balance of classes in an output variable column def class_breakdown(data): # convert the numpy array into a dataframe df = DataFrame(data) # group data by the class value and calculate the number of rows counts = df.groupby(0).size() # retrieve raw rows counts = counts.values # summarize for i in range(len(counts)): percent = counts[i] / len(df) * 100 print('Class=%d, total=%d, percentage=%.3f' % (i+1, counts[i], percent)) ``` 總結訓練和測試數據集中類的細分以確保它們具有類似的細分可能是有用的,然后將結果與組合數據集的細分進行比較。 下面列出了完整的示例。 ```py # summarize class balance from numpy import array from numpy import vstack from pandas import read_csv from pandas import DataFrame # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # summarize the balance of classes in an output variable column def class_breakdown(data): # convert the numpy array into a dataframe df = DataFrame(data) # group data by the class value and calculate the number of rows counts = df.groupby(0).size() # retrieve raw rows counts = counts.values # summarize for i in range(len(counts)): percent = counts[i] / len(df) * 100 print('Class=%d, total=%d, percentage=%.3f' % (i+1, counts[i], percent)) # load train file trainy = load_file('HARDataset/train/y_train.txt') # summarize class breakdown print('Train Dataset') class_breakdown(trainy) # load test file testy = load_file('HARDataset/test/y_test.txt') # summarize class breakdown print('Test Dataset') class_breakdown(testy) # summarize combined class breakdown print('Both') combined = vstack((trainy, testy)) class_breakdown(combined) ``` 首先運行該示例總結了訓練集的細分。我們可以看到每個類的非常相似的分布在數據集的 13%到 19%之間徘徊。 測試集和兩個數據集上的結果看起來非常相似。 使用數據集可能是安全的,假設每個訓練和測試集以及每個主題可以平衡類的分布。 ```py Train Dataset Class=1, total=1226, percentage=16.676 Class=2, total=1073, percentage=14.595 Class=3, total=986, percentage=13.411 Class=4, total=1286, percentage=17.492 Class=5, total=1374, percentage=18.689 Class=6, total=1407, percentage=19.138 Test Dataset Class=1, total=496, percentage=16.831 Class=2, total=471, percentage=15.982 Class=3, total=420, percentage=14.252 Class=4, total=491, percentage=16.661 Class=5, total=532, percentage=18.052 Class=6, total=537, percentage=18.222 Both Class=1, total=1722, percentage=16.720 Class=2, total=1544, percentage=14.992 Class=3, total=1406, percentage=13.652 Class=4, total=1777, percentage=17.254 Class=5, total=1906, percentage=18.507 Class=6, total=1944, percentage=18.876 ``` ## 6.繪制一個主題的時間序列數據 我們正在處理時間序列數據,因此導入檢查是創建原始數據的線圖。 原始數據由每個變量的時間序列數據窗口組成,窗口確實有 50%的重疊。這表明我們可能會在觀察中看到一些重復作為線圖,除非重疊被刪除。 我們可以從使用上面開發的函數加載訓練數據集開始。 ```py # load data trainX, trainy = load_dataset('train', 'HARDataset/') ``` 接下來,我們可以在' _train_ '目錄中加載' _subject_train.txt_ ',該目錄提供行到它所屬主題的映射。 我們可以使用 _load_file()_ 函數加載這個文件。加載后,我們還可以使用 _unique()_ NumPy 函數來檢索訓練數據集中的唯一主題列表。 ```py sub_map = load_file('HARDataset/train/subject_train.txt') train_subjects = unique(sub_map) print(train_subjects) ``` 接下來,我們需要一種方法來檢索單個主題的所有行,例如科目編號 1。 我們可以通過查找屬于給定主題的所有行號并使用這些行號從訓練數據集中加載的 X 和 y 數據中選擇樣本來完成此操作。 下面的 _data_for_subject()_ 函數實現了這種行為。它將獲取加載的訓練數據,行號到主題的加載映射,以及我們感興趣的主題的主題標識號,并將返回 _X_ 和 _y_ 僅針對該主題的數據。 ```py # get all data for one subject def data_for_subject(X, y, sub_map, sub_id): # get row indexes for the subject id ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id] # return the selected samples return X[ix, :, :], y[ix] ``` 現在我們有一個主題的數據,我們可以繪制它。 數據由具有重疊的窗口組成。我們可以編寫一個函數來消除這種重疊,并將窗口向下擠壓給定變量,將其壓縮成一個可以直接繪制為線圖的長序列。 下面的 _to_series()_ 函數對給定變量實現此行為,例如窗戶陣列。 ```py # convert a series of windows to a 1D list def to_series(windows): series = list() for window in windows: # remove the overlap from the window half = int(len(window) / 2) - 1 for value in window[-half:]: series.append(value) return series ``` 最后,我們有足夠的情節來繪制數據。我們可以依次繪制主題的九個變量中的每一個,以及活動水平的最終圖。 每個系列將具有相同數量的時間步長(x 軸的長度),因此,為每個變量創建一個子圖并垂直對齊所有圖可能很有用,這樣我們就可以比較每個變量的運動。 下面的 _plot_subject()_ 函數為單個主題的 _X_ 和 _y_ 數據實現此行為。該函數采用與 _load_dataset()_ 函數中加載的變量(第 3 軸)相同的順序。每個情節都會添加粗略的標題,因此我們不會輕易混淆我們正在看的內容。 ```py # plot the data for one subject def plot_subject(X, y): pyplot.figure() # determine the total number of plots n, off = X.shape[2] + 1, 0 # plot total acc for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('total acc '+str(i), y=0, loc='left') off += 1 # plot body acc for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('body acc '+str(i), y=0, loc='left') off += 1 # plot body gyro for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('body gyro '+str(i), y=0, loc='left') off += 1 # plot activities pyplot.subplot(n, 1, n) pyplot.plot(y) pyplot.title('activity', y=0, loc='left') pyplot.show() ``` 下面列出了完整的示例。 ```py # plot all vars for one subject from numpy import array from numpy import dstack from numpy import unique from pandas import read_csv from matplotlib import pyplot # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y # get all data for one subject def data_for_subject(X, y, sub_map, sub_id): # get row indexes for the subject id ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id] # return the selected samples return X[ix, :, :], y[ix] # convert a series of windows to a 1D list def to_series(windows): series = list() for window in windows: # remove the overlap from the window half = int(len(window) / 2) - 1 for value in window[-half:]: series.append(value) return series # plot the data for one subject def plot_subject(X, y): pyplot.figure() # determine the total number of plots n, off = X.shape[2] + 1, 0 # plot total acc for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('total acc '+str(i), y=0, loc='left') off += 1 # plot body acc for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('body acc '+str(i), y=0, loc='left') off += 1 # plot body gyro for i in range(3): pyplot.subplot(n, 1, off+1) pyplot.plot(to_series(X[:, :, off])) pyplot.title('body gyro '+str(i), y=0, loc='left') off += 1 # plot activities pyplot.subplot(n, 1, n) pyplot.plot(y) pyplot.title('activity', y=0, loc='left') pyplot.show() # load data trainX, trainy = load_dataset('train', 'HARDataset/') # load mapping of rows to subjects sub_map = load_file('HARDataset/train/subject_train.txt') train_subjects = unique(sub_map) print(train_subjects) # get the data for one subject sub_id = train_subjects[0] subX, suby = data_for_subject(trainX, trainy, sub_map, sub_id) print(subX.shape, suby.shape) # plot data for subject plot_subject(subX, suby) ``` 運行該示例將打印訓練數據集中的唯一主題,第一個主題的數據樣本,并創建一個包含 10 個圖的圖形,每個圖形對應九個輸入變量和輸出類別。 ```py [ 1 3 5 6 7 8 11 14 15 16 17 19 21 22 23 25 26 27 28 29 30] (341, 128, 9) (341, 1) ``` 在圖中,我們可以看到與活動 1,2 和 3 相對應的大運動周期:步行活動。對于編號較高的活動,4,5 和 6(坐,站立和鋪設),我們還可以看到更少的活動(即相對直線)。 這是我們正確加載解釋原始數據集的確認。 我們可以看到這個主題已經執行了兩次相同的一般活動順序,并且一些活動執行了兩次以上。這表明,對于特定主題,我們不應假設可能已執行的活動或其順序。 我們還可以看到一些固定活動的相對較大的運動,例如鋪設。這些可能是異常值或與活動轉換相關。可以將這些觀察結果平滑或移除為異常值。 最后,我們在九個變量中看到了很多共性。很可能只需要這些跡線的一部分來開發預測模型。 ![Line plot for all variables for a single subject](https://img.kancloud.cn/93/6d/936df54a91205d79b08be6187b9924e9_1280x960.jpg) 單個主題的所有變量的線圖 我們可以通過做一個小的改動來重新運行另一個主題的例子,例如:選擇訓練數據集中第二個主題的標識符。 ```py # get the data for one subject sub_id = train_subjects[1] ``` 第二個主題的情節顯示出類似的行為,沒有任何意外。 活動的雙重序列確實比第一個主題更加規律。 ![Line plot for all variables for a second single subject](https://img.kancloud.cn/41/03/41030e033081c6248d7d158d91125c29_1280x960.jpg) 第二個單個主題的所有變量的線圖 ## 7.繪制每個受試者的直方圖 由于問題是框架,我們有興趣使用一些科目的運動數據來預測其他科目的運動活動。 這表明跨學科的運動數據必須有規律性。我們知道數據已經在-1 和 1 之間縮放,可能是每個受試者,這表明檢測到的運動的幅度將是相似的。 我們還期望運動數據的分布在不同主題之間是相似的,因為它們執行相同的動作。 我們可以通過繪制和比較受試者的運動數據的直方圖來檢查這一點。一種有用的方法是為每個受試者創建一個圖并繪制給定數據的所有三個軸(例如總加速度),然后對多個受試者重復此操作。可以修改繪圖以使用相同的軸并水平對齊,以便可以比較跨主題的每個變量的分布。 下面的 _plot_subject_histograms()_ 函數實現了這種行為。該函數采用加載的數據集和行到主題的映射以及要繪制的最大主題數,默認情況下固定為 10。 為每個主題創建一個繪圖,并將一個數據類型的三個變量繪制為具有 100 個二進制位的直方圖,以幫助使分布明顯。每個圖共享相同的軸,該軸固定在-1 和 1 的邊界。 ```py # plot histograms for multiple subjects def plot_subject_histograms(X, y, sub_map, n=10): pyplot.figure() # get unique subjects subject_ids = unique(sub_map[:,0]) # enumerate subjects xaxis = None for k in range(n): sub_id = subject_ids[k] # get data for one subject subX, _ = data_for_subject(X, y, sub_map, sub_id) # total acc for i in range(3): ax = pyplot.subplot(n, 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(subX[:,:,i]), bins=100) pyplot.show() ``` 下面列出了完整的示例。 ```py # plot histograms for multiple subjects from numpy import array from numpy import unique from numpy import dstack from pandas import read_csv from matplotlib import pyplot # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y # get all data for one subject def data_for_subject(X, y, sub_map, sub_id): # get row indexes for the subject id ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id] # return the selected samples return X[ix, :, :], y[ix] # convert a series of windows to a 1D list def to_series(windows): series = list() for window in windows: # remove the overlap from the window half = int(len(window) / 2) - 1 for value in window[-half:]: series.append(value) return series # plot histograms for multiple subjects def plot_subject_histograms(X, y, sub_map, n=10): pyplot.figure() # get unique subjects subject_ids = unique(sub_map[:,0]) # enumerate subjects xaxis = None for k in range(n): sub_id = subject_ids[k] # get data for one subject subX, _ = data_for_subject(X, y, sub_map, sub_id) # total acc for i in range(3): ax = pyplot.subplot(n, 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(subX[:,:,i]), bins=100) pyplot.show() # load training dataset X, y = load_dataset('train', 'HARDataset/') # load mapping of rows to subjects sub_map = load_file('HARDataset/train/subject_train.txt') # plot histograms for subjects plot_subject_histograms(X, y, sub_map) ``` 運行該示例將創建一個包含 10 個繪圖的單個圖形,其中包含總加速度數據的三個軸的直方圖。 給定圖上的三個軸中的每一個具有不同的顏色,具體地,x,y 和 z 分別是藍色,橙色和綠色。 我們可以看到給定軸的分布確實看起來是高斯分布的,具有大的獨立數據組。 我們可以看到一些分布對齊(例如,中間的主要組大約為 0.0),這表明對象之間的運動數據可能存在一些連續性,至少對于這些數據而言。 ![Histograms of the total acceleration data for 10 subjects](https://img.kancloud.cn/7f/10/7f10db6a5107dad13f20e9fa104c46d5_1280x960.jpg) 10 個受試者的總加速度數據的直方圖 我們可以更新 _plot_subject_histograms()_ 函數,接下來繪制身體加速度的分布。更新的功能如下所示。 ```py # plot histograms for multiple subjects def plot_subject_histograms(X, y, sub_map, n=10): pyplot.figure() # get unique subjects subject_ids = unique(sub_map[:,0]) # enumerate subjects xaxis = None for k in range(n): sub_id = subject_ids[k] # get data for one subject subX, _ = data_for_subject(X, y, sub_map, sub_id) # body acc for i in range(3): ax = pyplot.subplot(n, 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(subX[:,:,3+i]), bins=100) pyplot.show() ``` 運行更新的示例會創建具有非常不同結果的相同圖表。 在這里,我們可以看到所有數據聚集在一個主題內和主題之間的軸上。這表明數據可能是中心的(零均值)。跨受試者的這種強一致性可能有助于建模,并且可能表明總加速度數據中受試者之間的差異可能不那么有用。 ![Histograms of the body acceleration data for 10 subjects](https://img.kancloud.cn/bc/88/bc88d44f509f53f500781007f720cb61_1280x960.jpg) 10 名受試者的身體加速度數據的直方圖 最后,我們可以為陀螺儀數據生成一個最終圖。 更新的功能如下所示。 ```py # plot histograms for multiple subjects def plot_subject_histograms(X, y, sub_map, n=10): pyplot.figure() # get unique subjects subject_ids = unique(sub_map[:,0]) # enumerate subjects xaxis = None for k in range(n): sub_id = subject_ids[k] # get data for one subject subX, _ = data_for_subject(X, y, sub_map, sub_id) # body acc for i in range(3): ax = pyplot.subplot(n, 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(subX[:,:,6+i]), bins=100) pyplot.show() ``` 運行該示例顯示與身體加速度數據非常相似的結果。 我們看到每個軸上的每個軸的高斯分布的可能性很高,以 0.0 為中心。分布更寬一些,顯示更加豐富的尾巴,但這對于跨主題的運動數據建模是一個令人鼓舞的發現。 ![Histograms of the body gyroscope data for 10 subjects](https://img.kancloud.cn/2f/c5/2fc58620b376af31993781639f098b57_1280x960.jpg) 10 名受試者的身體陀螺儀數據的直方圖 ## 8.繪制每個活動的直方圖 我們有興趣根據活動數據區分活動。 最簡單的情況是區分單個主題的活動。調查此問題的一種方法是按活動審查主題的移動數據分布。我們希望看到單個主題的不同活動的運動數據之間的分布存在一些差異。 我們可以通過創建每個活動的直方圖來檢查這一點,每個圖上給定數據類型的三個軸。同樣,可以水平排列圖以比較每個數據軸的活動分布。我們希望看到各地活動的分布存在差異。 首先,我們必須按活動對主題的跟蹤進行分組。下面的 _data_by_activity()_ 函數實現了這種行為。 ```py # group data by activity def data_by_activity(X, y, activities): # group windows by activity return {a:X[y[:,0]==a, :, :] for a in activities} ``` 我們現在可以為給定主題的每個活動創建繪圖。 下面的 _plot_activity_histograms()_ 函數為給定主題的跟蹤數據實現此功能。 首先,按活動對數據進行分組,然后為每個活動創建一個子圖,并將數據類型的每個軸添加為直方圖。該函數僅枚舉數據的前三個特征,即總加速度變量。 ```py # plot histograms for each activity for a subject def plot_activity_histograms(X, y): # get a list of unique activities for the subject activity_ids = unique(y[:,0]) # group windows by activity grouped = data_by_activity(X, y, activity_ids) # plot per activity, histograms for each axis pyplot.figure() xaxis = None for k in range(len(activity_ids)): act_id = activity_ids[k] # total acceleration for i in range(3): ax = pyplot.subplot(len(activity_ids), 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(grouped[act_id][:,:,i]), bins=100) pyplot.title('activity '+str(act_id), y=0, loc='left') pyplot.show() ``` 下面列出了完整的示例。 ```py # plot histograms per activity for a subject from numpy import array from numpy import dstack from numpy import unique from pandas import read_csv from matplotlib import pyplot # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y # get all data for one subject def data_for_subject(X, y, sub_map, sub_id): # get row indexes for the subject id ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id] # return the selected samples return X[ix, :, :], y[ix] # convert a series of windows to a 1D list def to_series(windows): series = list() for window in windows: # remove the overlap from the window half = int(len(window) / 2) - 1 for value in window[-half:]: series.append(value) return series # group data by activity def data_by_activity(X, y, activities): # group windows by activity return {a:X[y[:,0]==a, :, :] for a in activities} # plot histograms for each activity for a subject def plot_activity_histograms(X, y): # get a list of unique activities for the subject activity_ids = unique(y[:,0]) # group windows by activity grouped = data_by_activity(X, y, activity_ids) # plot per activity, histograms for each axis pyplot.figure() xaxis = None for k in range(len(activity_ids)): act_id = activity_ids[k] # total acceleration for i in range(3): ax = pyplot.subplot(len(activity_ids), 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(grouped[act_id][:,:,i]), bins=100) pyplot.title('activity '+str(act_id), y=0, loc='left') pyplot.show() # load data trainX, trainy = load_dataset('train', 'HARDataset/') # load mapping of rows to subjects sub_map = load_file('HARDataset/train/subject_train.txt') train_subjects = unique(sub_map) # get the data for one subject sub_id = train_subjects[0] subX, suby = data_for_subject(trainX, trainy, sub_map, sub_id) # plot data for subject plot_activity_histograms(subX, suby) ``` 運行該示例將創建包含六個子圖的圖,每個子圖用于訓練數據集中第一個主題的每個活動。總加速度數據的 x,y 和 z 軸中的每一個分別具有藍色,橙色和綠色直方圖。 我們可以看到每個活動都有不同的數據分布,大運動(前三個活動)與固定活動(最后三個活動)之間存在顯著差異。前三個活動的數據分布看起來是高斯的,可能有不同的均值和標準偏差。后一活動的分布看起來是多模態的(即多個峰值)。 ![Histograms of the total acceleration data by activity](https://img.kancloud.cn/35/03/3503e4868e129fc09cfaf36160a2e1fb_1280x960.jpg) 按活動計算的總加速度數據的直方圖 我們可以使用 _plot_activity_histograms()_ 的更新版本重新運行相同的示例,該版本將繪制車身加速度數據。 更新的功能如下所示。 ```py # plot histograms for each activity for a subject def plot_activity_histograms(X, y): # get a list of unique activities for the subject activity_ids = unique(y[:,0]) # group windows by activity grouped = data_by_activity(X, y, activity_ids) # plot per activity, histograms for each axis pyplot.figure() xaxis = None for k in range(len(activity_ids)): act_id = activity_ids[k] # total acceleration for i in range(3): ax = pyplot.subplot(len(activity_ids), 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(grouped[act_id][:,:,3+i]), bins=100) pyplot.title('activity '+str(act_id), y=0, loc='left') pyplot.show() ``` 運行更新的示例會創建一個新的圖。 在這里,我們可以看到在動作與靜止活動之間的活動中有更多類似的分布。在動態活動的情況下數據看起來是雙峰的,并且在靜止活動的情況下可能是高斯的或指數的。 我們通過活動看到的總體對體加速度分布的模式反映了我們在上一節中使用相同數據類型看到的對象。也許總加速度數據是區分活動的關鍵。 ![Histograms of the body acceleration data by activity](https://img.kancloud.cn/89/04/89041599d841c3de9433a52cc9dbc6e7_1280x960.jpg) 通過活動的身體加速度數據的直方圖 最后,我們可以再次更新示例以繪制陀螺儀數據的每個活動的直方圖。 更新的功能如下所示。 ```py # plot histograms for each activity for a subject def plot_activity_histograms(X, y): # get a list of unique activities for the subject activity_ids = unique(y[:,0]) # group windows by activity grouped = data_by_activity(X, y, activity_ids) # plot per activity, histograms for each axis pyplot.figure() xaxis = None for k in range(len(activity_ids)): act_id = activity_ids[k] # total acceleration for i in range(3): ax = pyplot.subplot(len(activity_ids), 1, k+1, sharex=xaxis) ax.set_xlim(-1,1) if k == 0: xaxis = ax pyplot.hist(to_series(grouped[act_id][:,:,6+i]), bins=100) pyplot.title('activity '+str(act_id), y=0, loc='left') pyplot.show() ``` 運行該示例將創建具有與身體加速度數據類似的模式的繪圖,盡管可能顯示胖尾高斯分布而不是動態活動的雙峰分布。 ![Histograms of the body gyroscope data by activity](https://img.kancloud.cn/20/4a/204a8d33ce922117f42445f941e8443e_1280x960.jpg) 通過活動的身體陀螺儀數據的直方圖 所有這些圖都是為第一個主題創建的,我們期望在其他主題的活動中看到類似的運動數據分布和關系。 ## 9.繪制活動持續時間箱圖 需要考慮的最后一個方面是受試者在每項活動上花費的時間。 這與班級的平衡密切相關。如果活動(類)在數據集中通常是平衡的,那么我們期望特定主題在其跟蹤過程中的活動平衡也將相當平衡。 我們可以通過計算每個主題在每個活動上花費的時間(樣本或行數)并查看每個活動的持續時間分布來確認這一點。 審查這些數據的一種方便方法是將分布總結為箱線圖,顯示中位數(線),中間 50%(方框),數據的一般范圍(四分位數間距)和異常值(以點為單位) 。 下面的函數 _plot_activity_durations_by_subject()_ 通過首先按主題分割數據集,然后按活動分割主題數據并計算在每個活動上花費的行,然后最終創建持續時間測量的每個活動的箱線圖來實現此行為。 ```py # plot activity durations by subject def plot_activity_durations_by_subject(X, y, sub_map): # get unique subjects and activities subject_ids = unique(sub_map[:,0]) activity_ids = unique(y[:,0]) # enumerate subjects activity_windows = {a:list() for a in activity_ids} for sub_id in subject_ids: # get data for one subject _, subj_y = data_for_subject(X, y, sub_map, sub_id) # count windows by activity for a in activity_ids: activity_windows[a].append(len(subj_y[subj_y[:,0]==a])) # organize durations into a list of lists durations = [activity_windows[a] for a in activity_ids] pyplot.boxplot(durations, labels=activity_ids) pyplot.show() ``` 下面列出了完整的示例。 ```py # plot durations of each activity by subject from numpy import array from numpy import dstack from numpy import unique from pandas import read_csv from matplotlib import pyplot # load a single file as a numpy array def load_file(filepath): dataframe = read_csv(filepath, header=None, delim_whitespace=True) return dataframe.values # load a list of files, such as x, y, z data for a given variable def load_group(filenames, prefix=''): loaded = list() for name in filenames: data = load_file(prefix + name) loaded.append(data) # stack group so that features are the 3rd dimension loaded = dstack(loaded) return loaded # load a dataset group, such as train or test def load_dataset(group, prefix=''): filepath = prefix + group + '/Inertial Signals/' # load all 9 files as a single array filenames = list() # total acceleration filenames += ['total_acc_x_'+group+'.txt', 'total_acc_y_'+group+'.txt', 'total_acc_z_'+group+'.txt'] # body acceleration filenames += ['body_acc_x_'+group+'.txt', 'body_acc_y_'+group+'.txt', 'body_acc_z_'+group+'.txt'] # body gyroscope filenames += ['body_gyro_x_'+group+'.txt', 'body_gyro_y_'+group+'.txt', 'body_gyro_z_'+group+'.txt'] # load input data X = load_group(filenames, filepath) # load class output y = load_file(prefix + group + '/y_'+group+'.txt') return X, y # get all data for one subject def data_for_subject(X, y, sub_map, sub_id): # get row indexes for the subject id ix = [i for i in range(len(sub_map)) if sub_map[i]==sub_id] # return the selected samples return X[ix, :, :], y[ix] # convert a series of windows to a 1D list def to_series(windows): series = list() for window in windows: # remove the overlap from the window half = int(len(window) / 2) - 1 for value in window[-half:]: series.append(value) return series # group data by activity def data_by_activity(X, y, activities): # group windows by activity return {a:X[y[:,0]==a, :, :] for a in activities} # plot activity durations by subject def plot_activity_durations_by_subject(X, y, sub_map): # get unique subjects and activities subject_ids = unique(sub_map[:,0]) activity_ids = unique(y[:,0]) # enumerate subjects activity_windows = {a:list() for a in activity_ids} for sub_id in subject_ids: # get data for one subject _, subj_y = data_for_subject(X, y, sub_map, sub_id) # count windows by activity for a in activity_ids: activity_windows[a].append(len(subj_y[subj_y[:,0]==a])) # organize durations into a list of lists durations = [activity_windows[a] for a in activity_ids] pyplot.boxplot(durations, labels=activity_ids) pyplot.show() # load training dataset X, y = load_dataset('train', 'HARDataset/') # load mapping of rows to subjects sub_map = load_file('HARDataset/train/subject_train.txt') # plot durations plot_activity_durations_by_subject(X, y, sub_map) ``` 運行該示例將創建六個箱形圖,每個活動一個。 每個箱圖總結了訓練數據集中每個活動花費的時間(行數或窗口數)。 我們可以看到,受試者在靜止活動(4,5 和 6)上花費的時間更多,在動作活動中花費的時間更少(1,2 和 3),3 的分布最小,或者時間花費最少。 活動的分布并不大,這表明不需要削減較長時間的活動或過度采樣活動。盡管如果運動活動的預測模型的技能通常更差,這些方法仍然可用。 ![Boxplot of activity durations per subject on train set](https://img.kancloud.cn/f5/c1/f5c1a3608baab01cede2b3a478fe7056_1280x960.jpg) 訓練組上每個受試者的活動持續時間的箱線圖 我們可以使用以下附加行為訓練數據創建類似的箱線圖。 ```py # load test dataset X, y = load_dataset('test', 'HARDataset/') # load mapping of rows to subjects sub_map = load_file('HARDataset/test/subject_test.txt') # plot durations plot_activity_durations_by_subject(X, y, sub_map) ``` 運行更新的示例顯示了活動之間的類似關系。 這是令人鼓舞的,這表明測試和訓練數據集確實可以合理地代表整個數據集。 ![Boxplot of activity durations per subject on test set](https://img.kancloud.cn/25/2c/252c18e3f8708b4ec8e59fac36e60c84_1280x960.jpg) 測試集上每個受試者的活動持續時間的箱線圖 現在我們已經探索了數據集,我們可以建議一些關于如何建模的想法。 ## 10.建模方法 在本節中,我們總結了一些建模活動識別數據集的方法。 這些想法分為項目的主題。 ### 問題框架 第一個重要的考慮因素是預測問題的框架。 原始作品中描述的問題的框架是基于已知主體的運動數據和活動,根據運動數據預測新主體的活動。 我們可以總結為: * 給出一個移動數據窗口預測活動。 這是一個合理而有用的問題框架。 將提供的數據構建為預測問題的其他一些可能方法包括: * 在給定移動數據的時間步長的情況下預測活動。 * 給出多個移動數據窗口的預測活動。 * 給定多個移動數據窗口的預測活動序列。 * 給出預分段活動的一系列移動數據的預測活動。 * 給定移動數據的時間步長,預測活動停止或轉換。 * 給定移動數據窗口預測靜止或非靜止活動 其中一些框架可能過于具有挑戰性或太容易。 然而,這些框架提供了探索和理解數據集的其他方法。 ### 數據準備 在使用原始數據訓練模型之前可能需要一些數據準備。 數據似乎已經縮放到范圍[-1,1]。 在建模之前可以執行的一些其他數據轉換包括: * 跨學科規范化。 * 每個科目的標準化。 * 跨學科標準化。 * 軸功能選擇。 * 數據類型功能選擇。 * 信號異常檢測和清除。 * 刪除過多代表活動的窗口。 * 對代表性不足的活動進行過采樣。 * 將信號數據下采樣到 1 / 4,1 / 2,1,2 或其他部分。 ### 預測建模 通常,問題是時間序列多類分類問題。 正如我們所看到的,它也可以被構造為二元分類問題和多步時間序列分類問題。 最初的論文探討了在數據集版本中使用經典機器學習算法,其中從每個數據窗口設計了特征。具體地說,是一種改進的支持向量機 數據集的特征工程版本上的 SVM 結果可以提供問題表現的基線。 從這一點擴展,在該版本的數據集上評估多個線性,非線性和集合機器學習算法可以提供改進的基準。 問題的焦點可能是數據集的未設計或原始版本。 在這里,可以探索模型復雜性的進展,以確定最合適的問題模型;一些候選模型包括: * 常見的線性,非線性和集成機器學習算法。 * 多層感知器。 * 卷積神經網絡,特別是 1D CNN。 * 循環神經網絡,特別是 LSTM。 * CNN 和 LSTMS 的雜交體,例如 CNN-LSTM 和 ConvLSTM。 ### 模型評估 在原始論文中對模型的評估涉及使用 70%和 30%比率的受試者對數據進行訓練/測試分割。 對這種預先定義的數據分割的探索表明,這兩組都能夠合理地代表整個數據集。 另一種替代方法可以是每個受試者使用留一法交叉驗證或 LOOCV。除了為每個受試者提供用作保留測試集的機會之外,該方法還將提供可以平均和總結的 30 個分數的群體,這可以提供更穩健的結果。 使用分類精度和混淆矩陣表示模型表現,兩者都適用于預測問題的多類性質。 具體而言,混淆矩陣將有助于確定某些類別比其他類別更容易或更具挑戰性,例如靜止活動與涉及運動的活動相比。 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 ### 文件 * [基于傳感器的活動識別的深度學習:一項調查](https://arxiv.org/abs/1707.03502)。 * [使用智能手機進行人類活動識別的公共領域數據集](https://upcommons.upc.edu/handle/2117/20897),2013 年。 * [智能手機上的人類活動識別使用多類硬件友好支持向量機](https://link.springer.com/chapter/10.1007/978-3-642-35395-6_30),2012。 ### API * [pandas.read_csv API](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) * [numpy.dstack API](https://www.numpy.org/devdocs/reference/generated/numpy.dstack.html) ### 用品 * [使用智能手機數據集進行人類活動識別,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones) * [活動識別,維基百科](https://en.wikipedia.org/wiki/Activity_recognition) * [使用智能手機傳感器](https://www.youtube.com/watch?v=XOEN9W05_4A),視頻的活動識別實驗。 ## 摘要 在本教程中,您發現了使用智能手機數據集進行時間序列分類的活動識別,以及如何加載和瀏覽數據集以使其為預測建模做好準備。 具體來說,你學到了: * 如何下載數據集并將其加載到內存中。 * 如何使用線圖,直方圖和箱線圖來更好地理解運動數據的結構。 * 如何建模問題包括框架,數據準備,建模和評估。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看