<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何使用腦波預測人眼是開放還是閉合 > 原文: [https://machinelearningmastery.com/how-to-predict-whether-eyes-are-open-or-closed-using-brain-waves/](https://machinelearningmastery.com/how-to-predict-whether-eyes-are-open-or-closed-using-brain-waves/) #### 評估機器學習方法進行時間序列預測時如何避免方法錯誤的案例研究。 評估關于時間序列預測問題的機器學習模型具有挑戰性。 在問題框架或模型評估中很容易產生一個小錯誤,這會產生令人印象深刻的結果,但會導致無效的發現。 一個有趣的時間序列分類問題是僅基于他們的腦波數據(EEG)來預測受試者的眼睛是開放還是閉合。 在本教程中,您將發現在評估時間序列預測模型時,基于腦電波和常見方法陷阱預測眼睛是開放還是閉合的問題。 通過本教程,您將了解在評估時間序列預測問題的機器學習算法時如何避免常見陷阱。這些陷阱既吸引了初學者,也吸引了專業從業者和學者。 完成本教程后,您將了解: * 眼睛狀態預測問題和您可以使用的標準機器學習數據集。 * 如何重現熟練的結果來預測 Python 中腦波的眼睛狀態。 * 如何在評估預測模型時發現一個有趣的方法缺陷。 讓我們開始吧。 ## 教程概述 本教程分為七個部分;他們是: 1. 從腦波預測開/閉眼 2. 數據可視化和刪除異常值 3. 開發預測模型 4. 模型評估方法的問題 5. 用時間順序訓練分裂訓練 6. 前瞻性驗證 7. 外賣和重點課程 ## 從腦波預測開/閉眼 在這篇文章中,我們將仔細研究一個問題,即根據腦波數據預測受試者眼睛是開放還是閉合。 Oliver Rosler 和 David Suendermann 為他們的 2013 年論文題為“[邁向使用 EEG 的眼睛狀態預測的第一步](http://suendermann.com/su/pdf/aihls2013.pdf)”描述了這個問題。 我看到了這個數據集,我不得不知道更多。 具體地,當對象打開和閉合眼睛時,通過攝像機記錄,由單個人進行腦電圖(EEG)記錄 117 秒(剛好不到兩分鐘)。然后手動記錄 EEG 跡線中每個時間步的打開/關閉狀態。 使用 [Emotiv EEG Neuroheadset](https://www.emotiv.com/) 記錄 EEG,產生 14 條痕跡。 ![Cartoon of where EEG sensors were located on the subject](https://img.kancloud.cn/2b/ab/2bab10ad4183890f580d06c81c0cf5bd_760x862.jpg) EEG 傳感器位于受試者身上的卡通 取自“使用 EEG 進行眼狀態預測的第一步”,2013 年。 輸出變量是二進制的,這意味著這是一個兩類分類問題。 在 117 秒內總共進行了 14,980 次觀測(行),這意味著每秒約有 128 次觀測。 語料庫由 14,977 個實例組成,每個實例具有 15 個屬性(14 個屬性表示電極和眼睛狀態的值)。實例按時間順序存儲在語料庫中,以便能夠分析時間依賴性。語料庫的 8,255(55.12%)個實例對應于睜眼,6,722(44.88%)個實例對應于閉眼狀態。 * [使用腦電圖進行眼狀態預測的第一步](http://suendermann.com/su/pdf/aihls2013.pdf),2013。 還有一些腦電圖觀察具有遠大于預期的幅度。這些可能是異常值,可以使用簡單的統計方法識別和刪除,例如刪除與平均值有 3 到 4 個標準偏差的行。 該問題的最簡單的框架是在當前時間步長給出 EEG 跡線的情況下預測眼睛狀態(打開/關閉)。該問題的更高級框架可以尋求對每個 EEG 跡線的多變量時間序列建模以便預測當前眼睛狀態。 ## 數據可視化和刪除異常值 數據集可以從 UCI 機器學習庫免費下載: * [腦電圖眼狀態數據集](https://archive.ics.uci.edu/ml/datasets/EEG+Eye+State) 原始數據采用 ARFF 格式(在 Weka 中使用),但可以通過刪除 ARFF 標頭轉換為 CSV。 下面是刪除了 ARFF 標題的前五行數據的示例。 ```py 4329.23,4009.23,4289.23,4148.21,4350.26,4586.15,4096.92,4641.03,4222.05,4238.46,4211.28,4280.51,4635.9,4393.85,0 4324.62,4004.62,4293.85,4148.72,4342.05,4586.67,4097.44,4638.97,4210.77,4226.67,4207.69,4279.49,4632.82,4384.1,0 4327.69,4006.67,4295.38,4156.41,4336.92,4583.59,4096.92,4630.26,4207.69,4222.05,4206.67,4282.05,4628.72,4389.23,0 4328.72,4011.79,4296.41,4155.9,4343.59,4582.56,4097.44,4630.77,4217.44,4235.38,4210.77,4287.69,4632.31,4396.41,0 4326.15,4011.79,4292.31,4151.28,4347.69,4586.67,4095.9,4627.69,4210.77,4244.1,4212.82,4288.21,4632.82,4398.46,0 ... ``` 我們可以將數據作為 DataFrame 加載,并繪制每個 EEG 軌跡和輸出變量(打開/關閉狀態)的時間序列。 完整的代碼示例如下所示。 該示例假定您具有 CSV 格式的數據集副本,文件名為“ _EEG_Eye_State.csv_ ”,與代碼位于同一目錄中。 ```py # visualize dataset from pandas import read_csv from matplotlib import pyplot # load the dataset data = read_csv('EEG_Eye_State.csv', header=None) # retrieve data as numpy array values = data.values # create a subplot for each time series pyplot.figure() for i in range(values.shape[1]): pyplot.subplot(values.shape[1], 1, i+1) pyplot.plot(values[:, i]) pyplot.show() ``` 運行該示例會為每個 EEG 跟蹤和輸出變量創建一個線圖。 我們可以看到異常值清除每條跡線中的數據。我們還可以分別以 0/1 看到眼睛的開/關狀態。 ![Line Plot for each EEG trace and the output variable](https://img.kancloud.cn/06/5e/065e7feba0d7286709fc545d4db93974_1280x960.jpg) 每個 EEG 軌跡和輸出變量的線圖 去除異常值以更好地理解 EEG 痕跡與眼睛的開/閉狀態之間的關系是有用的。 下面的示例將刪除所有具有 EEG 觀測值的行,這些行是平均值的四個標準偏差或更多。數據集將保存到名為“ _EEG_Eye_State_no_outliers.csv_ ”的新文件中。 這是[離群值檢測和刪除](https://machinelearningmastery.com/how-to-use-statistics-to-identify-outliers-in-data/)的快速而骯臟的實現,但是完成了工作。我相信你可以設計出更高效的實施方案。 ```py # remove outliers from the EEG data from pandas import read_csv from numpy import mean from numpy import std from numpy import delete from numpy import savetxt # load the dataset. data = read_csv('EEG_Eye_State.csv', header=None) values = data.values # step over each EEG column for i in range(values.shape[1] - 1): # calculate column mean and standard deviation data_mean, data_std = mean(values[:,i]), std(values[:,i]) # define outlier bounds cut_off = data_std * 4 lower, upper = data_mean - cut_off, data_mean + cut_off # remove too small too_small = [j for j in range(values.shape[0]) if values[j,i] < lower] values = delete(values, too_small, 0) print('>deleted %d rows' % len(too_small)) # remove too large too_large = [j for j in range(values.shape[0]) if values[j,i] > upper] values = delete(values, too_large, 0) print('>deleted %d rows' % len(too_large)) # save the results to a new file savetxt('EEG_Eye_State_no_outliers.csv', values, delimiter=',') ``` 運行該示例總結了刪除的行,因為 EEG 數據中的每一列都針對平均值之上和之下的異常值進行處理。 ```py >deleted 0 rows >deleted 1 rows >deleted 2 rows >deleted 1 rows >deleted 0 rows >deleted 142 rows >deleted 0 rows >deleted 48 rows >deleted 0 rows >deleted 153 rows >deleted 0 rows >deleted 43 rows >deleted 0 rows >deleted 0 rows >deleted 0 rows >deleted 15 rows >deleted 0 rows >deleted 5 rows >deleted 10 rows >deleted 0 rows >deleted 21 rows >deleted 53 rows >deleted 0 rows >deleted 12 rows >deleted 58 rows >deleted 53 rows >deleted 0 rows >deleted 59 rows ``` 我們現在可以通過加載新的' _EEG_Eye_State_no_outliers.csv_ '文件來顯示沒有異常值的數據。 ```py # visualize dataset without outliers from pandas import read_csv from matplotlib import pyplot # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) # retrieve data as numpy array values = data.values # create a subplot for each time series pyplot.figure() for i in range(values.shape[1]): pyplot.subplot(values.shape[1], 1, i+1) pyplot.plot(values[:, i]) pyplot.show() ``` 運行該示例可創建更好的繪圖,清晰顯示眼睛閉合時的正峰值(1)和眼睛打開時的負峰值(0)。 ![Line Plot for each EEG trace and the output variable without outliers](https://img.kancloud.cn/e2/c9/e2c9c06450ed95182c5a3eef7c7ba0c6_1280x960.jpg) 每個 EEG 軌跡的線圖和沒有異常值的輸出變量 ## 開發預測模型 最簡單的預測模型是基于當前的 EEG 觀察來預測眼睛開/閉狀態,忽略跟蹤信息。 直觀地說,人們不會期望這是有效的,然而,這是 Rosler 和 Suendermann 2013 年論文中使用的方法。 具體來說,他們使用這種問題框架的 10 倍交叉驗證評估了 [Weka 軟件](https://machinelearningmastery.com/applied-machine-learning-weka-mini-course/)中的一大套分類算法。他們使用多種方法實現了超過 90%的準確度,包括基于實例的方法,如 [k-最近鄰](https://machinelearningmastery.com/k-nearest-neighbors-for-machine-learning/)和 KStar。 > 然而,基于實例的學習器,如 IB1 和 KStar,再次大大超過了決策樹。后者實現了明顯的最佳表現,分類錯誤率僅為 3.2%。 - [使用 EEG 進行眼狀態預測的第一步](http://suendermann.com/su/pdf/aihls2013.pdf),2013。 在許多其他論文中,類似的方法和發現與相同和相似的數據集一起使用。 當我讀到這篇文章時,我很驚訝,因此轉載了結果。 完整示例如下所列,k = 3 KNN。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import KFold from sklearn.neighbors import KNeighborsClassifier from numpy import mean # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # evaluate knn using 10-fold cross-validation scores = list() kfold = KFold(10, shuffle=True, random_state=1) for train_ix, test_ix in kfold.split(values): # define train/test X/y trainX, trainy = values[train_ix, :-1], values[train_ix, -1] testX, testy = values[test_ix, :-1], values[test_ix, -1] # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on train set model.fit(trainX, trainy) # forecast test set yhat = model.predict(testX) # evaluate predictions score = accuracy_score(testy, yhat) # store scores.append(score) print('>%.3f' % score) # calculate mean score across each run print('Final Score: %.3f' % (mean(scores))) ``` 運行該示例打印交叉驗證的每個折疊的得分,并且在所有 10 倍中平均得分為 97%。 ```py >0.970 >0.975 >0.978 >0.977 >0.973 >0.979 >0.978 >0.976 >0.974 >0.969 Final Score: 0.975 ``` 非常令人印象深刻! 但是感覺有些不對勁。 我有興趣了解在開放到封閉和關閉到開放的每個過渡期間如何考慮數據中清晰峰值的模型。 我嘗試使用我自己的測試工具來考慮數據的時間順序的每個模型表現得更糟。 為什么? 提示:考慮所選模型評估策略和表現最佳的算法類型。 ## 模型評估方法的問題 **免責聲明**:我沒有打電話給論文或相關論文的作者。我不在乎。根據我的經驗,大多數發表的論文都無法復制或存在重大的方法缺陷(包括我寫的很多東西)。我只對學習和教學感興趣。 時間序列模型的評估方法存在方法上的缺陷。 我教導了這個缺陷,但在閱讀了論文并重現結果之后,它仍然讓我絆倒了。 我希望通過這個例子來說明它將幫助你解決自己的預測問題。 模型評估中的方法缺陷是使用 k 折交叉驗證。具體而言,以不遵守觀察的時間順序的方式評估模型。 這個問題的關鍵是找到基于實例的方法,比如 k-最近鄰,因為它對這個問題非常熟練。 KNN 將在數據集中尋找 _k_ 最相似的行,并計算輸出狀態的模式作為預測。 通過在評估模型時不考慮實例的時間順序,它允許模型使用來自未來的信息進行預測。這在 KNN 算法中特別明顯。 由于觀測頻率高(每秒 128 次),最相似的行將是在過去和未來的預測實例中及時相鄰的行。 我們可以通過一些小實驗來更清楚地說明這一點。 ## 用時間順序訓練分裂訓練 我們可以做的第一個測試是評估 KNN 模型的技能,當數據集被洗牌時,以及當數據集不是時,訓練/測試分割。 在分割之前對數據進行混洗的情況下,我們期望結果類似于上一節中的交叉驗證結果,特別是如果測試集是數據集的 10%。 如果關于時間排序和基于實例的方法在未來使用相鄰示例的重要性的理論是正確的,那么我們期望在拆分之前數據集未被洗牌的測試更糟糕。 首先,下面的示例將數據集拆分為訓練/測試拆分,分別為 90%/ 10%的數據。在拆分之前對數據集進行洗牌。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.1, shuffle=True, random_state=1) # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on train set model.fit(trainX, trainy) # forecast test set yhat = model.predict(testX) # evaluate predictions score = accuracy_score(testy, yhat) print(score) ``` 運行該示例,我們可以看到,確實,該技能與我們在交叉驗證示例中看到的或與其接近的技能相匹配,準確率為 96%。 ```py 0.9699510831586303 ``` 接下來,我們重復實驗,而不是在拆分之前對數據集進行洗牌。 這意味著訓練數據是關于觀測的時間排序的前 90%的數據,并且測試數據集是數據的最后 10%或約 1,400 個觀測值。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.1, shuffle=False, random_state=1) # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on train set model.fit(trainX, trainy) # forecast test set yhat = model.predict(testX) # evaluate predictions score = accuracy_score(testy, yhat) print(score) ``` 運行該示例顯示模型技能更差,為 52%。 ```py 0.5269042627533194 ``` 這是一個好的開始,但不是確定的。 考慮到我們可以在結果變量圖上看到非常短的開/關間隔,有可能最后 10%的數據集難以預測。 我們可以重復實驗并及時使用前 10%的數據進行測試,最后 90%的數據用于訓練。我們可以通過在使用 [flip()函數](https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html)分割數據之前反轉行的順序來實現。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from numpy import flip # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # reverse order of rows values = flip(values, 0) # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.1, shuffle=False, random_state=1) # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on train set model.fit(trainX, trainy) # forecast test set yhat = model.predict(testX) # evaluate predictions score = accuracy_score(testy, yhat) print(score) ``` 運行實驗產生類似的結果,準確度約為 52%。 這提供了更多的證據,證明不是特定的連續觀察塊導致模型技能差。 ```py 0.5290006988120196 ``` 看起來需要立即相鄰的觀察來做出良好的預測。 ## 前瞻性驗證 模型可能需要過去(但不是未來)的相鄰觀察,以便進行熟練的預測。 這聽起來很合理,但也有問題。 然而,我們可以使用測試集上的前向驗證來實現這一點。這是允許模型在預測時間步驟之前使用所有觀察的地方,因為我們在測試數據集中的每個新時間步驟驗證新模型。 有關前進驗證的更多信息,請參閱帖子: * [如何對時間序列預測的機器學習模型進行反向測試](https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/) 下面的示例使用前向驗證評估 KNN 的技能,使用最后 10%的數據集(約 10 秒),遵守時間順序。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from numpy import array # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.1, shuffle=False, random_state=1) # walk-forward validation historyX, historyy = [x for x in trainX], [x for x in trainy] predictions = list() for i in range(len(testy)): # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on train set model.fit(array(historyX), array(historyy)) # forecast the next time step yhat = model.predict([testX[i, :]])[0] # store prediction predictions.append(yhat) # add real observation to history historyX.append(testX[i, :]) historyy.append(testy[i]) # evaluate predictions score = accuracy_score(testy, predictions) print(score) ``` 運行該示例可提供令人印象深刻的模型技能,準確率約為 95%。 ```py 0.9531795946890287 ``` 我們可以進一步推進此測試,并且在進行預測時僅將先前的 10 個觀測值用于模型。 下面列出了完整的示例。 ```py # knn for predicting eye state from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from numpy import array # load the dataset data = read_csv('EEG_Eye_State_no_outliers.csv', header=None) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.1, shuffle=False, random_state=1) # walk-forward validation historyX, historyy = [x for x in trainX], [x for x in trainy] predictions = list() for i in range(len(testy)): # define model model = KNeighborsClassifier(n_neighbors=3) # fit model on a small subset of the train set tmpX, tmpy = array(historyX)[-10:,:], array(historyy)[-10:] model.fit(tmpX, tmpy) # forecast the next time step yhat = model.predict([testX[i, :]])[0] # store prediction predictions.append(yhat) # add real observation to history historyX.append(testX[i, :]) historyy.append(testy[i]) # evaluate predictions score = accuracy_score(testy, predictions) print(score) ``` 運行該示例可以進一步提高模型技能,準確率接近 99%。 我預計,當跡線從開放到閉合或從閉合到開放轉變時,唯一出現的錯誤是 EEG 系列拐點處的錯誤,這是問題的實際難點部分。這方面需要進一步調查。 ```py 0.9923130677847659 ``` 實際上,我們已經確認該模型需要相鄰的觀測結果及其結果才能進行預測,并且它只能在過去而不是未來的相鄰觀測中做得很好。 這是有趣的。但這一發現在實踐中沒有用。 如果部署了該模型,則需要模型知道最近過去的眼睛打開/關閉狀態,例如之前的 128 秒。 這將無法使用。 基于腦波預測眼睛狀態的模型的整體思想是讓它在沒有這種確認的情況下運行。 ## 外賣和重點課程 讓我們回顧一下到目前為止我們學到的東西: **1.模型評估方法必須考慮到觀測的時間順序。** 這意味著使用 k-fold 交叉驗證在方法上無效,該交叉驗證不按時間分層(例如,隨機抽取或使用隨機選擇的行)。 這也意味著使用在分割之前混洗數據的訓練/測試分割在方法上是無效的。 我們在模型的高技能評估中看到了這一點,與模型的低技能相比,在模型的低技能時,在預測時間無法獲得直接相鄰的觀測時間。 **2.模型評估方法必須對最終模型的使用有意義。** 這意味著即使您使用的方法尊重觀察的時間順序,模型也應該只有在實際使用模型時可用的信息。 我們在模型的高技能下看到了這一點,這種方法遵循了觀察順序的前瞻性驗證方法,但提供了可用的信息,例如眼睛狀態,如果模型在實踐中使用則無法獲得。 關鍵是從使用最終模型的問題框架開始,然后向后工作到可用的數據,以及在框架中評估模型的方法,該框架僅在可用的信息下運行取景。 當您試圖了解其他人的工作時,這會倍加適用。 **前進** 希望,無論是在評估自己的預測模型時,還是在評估其他模型時,這都會有所幫助。 那么,如果提供原始數據,您將如何解決此問題? 我認為這個問題的關鍵是在從開眼到閉眼或閉眼到開眼的過渡時 EEG 數據中明顯的正/負峰值。我希望有效的模型可以利用這個特征,可能使用半秒鐘或類似的先前腦電圖觀察。 甚至可以使用單個跡線而不是 15 個,以及來自信號處理的簡單峰值檢測方法,而不是機器學習方法。 如果你對此有所了解,請告訴我。我很想看看你發現了什么。 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 * [腦電圖眼狀態數據集,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/EEG+Eye+State) * [使用腦電圖進行眼狀態預測的第一步](http://suendermann.com/su/pdf/aihls2013.pdf),2013。 * [EEG 眼睛狀態識別使用增量屬性學習和時間序列分類](https://www.hindawi.com/journals/mpe/2014/365101/),2014。 ## 摘要 在本教程中,您發現了在評估時間序列預測模型時基于腦電波和常見方法陷阱預測眼睛是開放還是閉合的問題。 具體來說,你學到了: * 眼睛狀態預測問題和您可以使用的標準機器學習數據集。 * 如何重現熟練的結果來預測 Python 中腦波的眼睛狀態。 * 如何在評估預測模型時發現一個有趣的方法缺陷。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看