日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习中val_小波变换(七):小波变换在机器学习中的应用(下)

發布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习中val_小波变换(七):小波变换在机器学习中的应用(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文繼續講解一篇關于小波變換在機器學習中的應用的博客:《A guide for using the Wavelet Transform in Machine Learning》,極力推薦!!3.1?使用連續小波變換可視化狀態空間

1維信號的小波變換是2維的時間-尺度圖,該圖給出了系統狀態空間的詳細信息,也就是給出了系統的動態行為。

下圖給出了El Nino數據集的原始時間序列信號、傅里葉變換和小波變換的結果。

3.2 使用連續小波變換和卷積神經網絡進行信號的分類

由3.1部分的2維時間-尺度圖可知:小波變換不僅可以更好地理解系統的動態行為,也可以被用來區分不同類型的信號。測試所用的數據集包含了人做6種不同的活動。

3.2.1 加載UCI-HAR時間序列數據集

對于數據集的描述如下:包含人做6種不同的活動,一共10000多個信號,每個信號包含如下圖的9個分量。

由于每個信號包含9個分量,因此需要對每個信號進行9次連續小波變換。

按照7:3的比例劃分所有信號,每個信號包含9個分量,每個分量包含128個樣本點。因此,訓練集的大小為(7352,128,9),測試集的大小為(2947,128,9)。3.2.2?對數據集應用連續小波變換,并且將數據變換到合適的格式

既然每條信號對應9張時間-尺度圖,該怎么把它們輸入到CNN中呢?有如下四種可選的方案:

1)為每個分量分別訓練CNN,最終的結果通過集成方式確定。這個方法可能性能較差,因為它忽略了不同分量之間的聯系;2)先將9個分量的時間序列信號串聯起來,然后對串聯信號做連續小波變換。這種方法會在信號拼接的地方不連續,進而在時間-尺度圖上信號拼接處產生造成噪聲。3)首先計算每個分量的連續小波變換,然后將9個不同分量的時間-尺度圖拼接成一張大的,再輸入到CNN中。但是該方法同樣也會在拼接處不連續,從而將噪聲引入到CNN中。如果CNN足夠深,也許可以區分出這些噪聲。4)將9個不同分量的時間-尺度圖縱向摞在一起,形成一張通道數為9的圖片,再輸入到CNN中訓練,如下圖所示。

scales = range(1,128)waveletname = 'morl'train_size = 5000test_size= 500 train_data_cwt = np.ndarray(shape=(train_size, 127, 127, 9)) for ii in range(0,train_size): if ii % 1000 == 0: print(ii) for jj in range(0,9): signal = uci_har_signals_train[ii, :, jj] coeff, freq = pywt.cwt(signal, scales, waveletname, 1) coeff_ = coeff[:,:127] train_data_cwt[ii, :, :, jj] = coeff_ test_data_cwt = np.ndarray(shape=(test_size, 127, 127, 9))for ii in range(0,test_size): if ii % 100 == 0: print(ii) for jj in range(0,9): signal = uci_har_signals_test[ii, :, jj] coeff, freq = pywt.cwt(signal, scales, waveletname, 1) coeff_ = coeff[:,:127] test_data_cwt[ii, :, :, jj] = coeff_ uci_har_labels_train = list(map(lambda x: int(x) - 1, uci_har_labels_train))uci_har_labels_test = list(map(lambda x: int(x) - 1, uci_har_labels_test)) x_train = train_data_cwty_train = list(uci_har_labels_train[:train_size])x_test = test_data_cwty_test = list(uci_har_labels_test[:test_size])

對于一個信號單個分量進行連續小波變換的結果是127×127的圖片,因此一個信號最終的格式為(127,127,9)。

3.2.3?訓練卷積神經網絡import kerasfrom keras.layers import Dense, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.models import Sequentialfrom keras.callbacks import History history = History() img_x = 127img_y = 127img_z = 9input_shape = (img_x, img_y, img_z) num_classes = 6batch_size = 16num_classes = 7epochs = 10 x_train = x_train.astype('float32')x_test = x_test.astype('float32') y_train = keras.utils.to_categorical(y_train, num_classes)y_test = keras.utils.to_categorical(y_test, num_classes) model = Sequential()model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=input_shape))model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(Conv2D(64, (5, 5), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(1000, activation='relu'))model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test), callbacks=[history]) train_score = model.evaluate(x_train, y_train, verbose=0)print('Train loss: {}, Train accuracy: {}'.format(train_score[0], train_score[1]))test_score = model.evaluate(x_test, y_test, verbose=0)print('Test loss: {}, Test accuracy: {}'.format(test_score[0], test_score[1]))

訓練過程如下。

*** Epoch 1/10*** 5000/5000 [==============================] - 235s 47ms/step - loss: 0.3963 - acc: 0.8876 - val_loss: 0.6006 - val_acc: 0.8780*** Epoch 2/10*** 5000/5000 [==============================] - 228s 46ms/step - loss: 0.1939 - acc: 0.9282 - val_loss: 0.3952 - val_acc: 0.8880*** Epoch 3/10*** 5000/5000 [==============================] - 224s 45ms/step - loss: 0.1347 - acc: 0.9434 - val_loss: 0.4367 - val_acc: 0.9100*** Epoch 4/10*** 5000/5000 [==============================] - 228s 46ms/step - loss: 0.1971 - acc: 0.9334 - val_loss: 0.2662 - val_acc: 0.9320*** Epoch 5/10*** 5000/5000 [==============================] - 231s 46ms/step - loss: 0.1134 - acc: 0.9544 - val_loss: 0.2131 - val_acc: 0.9320*** Epoch 6/10*** 5000/5000 [==============================] - 230s 46ms/step - loss: 0.1285 - acc: 0.9520 - val_loss: 0.2014 - val_acc: 0.9440*** Epoch 7/10*** 5000/5000 [==============================] - 232s 46ms/step - loss: 0.1339 - acc: 0.9532 - val_loss: 0.2884 - val_acc: 0.9300*** Epoch 8/10*** 5000/5000 [==============================] - 237s 47ms/step - loss: 0.1503 - acc: 0.9488 - val_loss: 0.3181 - val_acc: 0.9340*** Epoch 9/10*** 5000/5000 [==============================] - 250s 50ms/step - loss: 0.1247 - acc: 0.9504 - val_loss: 0.2403 - val_acc: 0.9460*** Epoch 10/10*** 5000/5000 [==============================] - 238s 48ms/step - loss: 0.1578 - acc: 0.9508 - val_loss: 0.2133 - val_acc: 0.9300*** Train loss: 0.11115437872409821, Train accuracy: 0.959*** Test loss: 0.21326758581399918, Test accuracy: 0.93

3.3?利用離散小波變換分解信號

在2.5小節講到離散小波變換可以通過一個濾波器組實現,可以將信號分解成一系列的頻率子帶。這部分,我們會用到PyWavelet包將一個信號分解成頻率子帶以及重構出原來的信號。PyWavelet提供了兩種不同的方法來分解一個信號:1)pywt.dwt()可以多次對近似系數進行分解,一直到期望的分解層次;(cA1, cD1) = pywt.dwt(signal, 'db2', 'smooth')reconstructed_signal = pywt.idwt(cA1, cD1, 'db2', 'smooth') fig, ax = plt.subplots(figsize=(8,4))ax.plot(signal, label='signal')ax.plot(reconstructed_signal, label='reconstructed signal', linestyle='--')ax.legend(loc='upper left')plt.show()

2)pywt.wavedec()可以一次性得到期望分解層次的所有近似系數和細節系數

coeffs = pywt.wavedec(signal, 'db2', level=8)reconstructed_signal = pywt.waverec(coeffs, 'db2')fig, ax = plt.subplots(figsize=(8,4))ax.plot(signal[:1000], label='signal')ax.plot(reconstructed_signal[:1000], label='reconstructed signal', linestyle='--')ax.legend(loc='upper left')ax.set_title('de- and reconstruction using wavedec()')plt.show()

3.4?使用離散小波變換移除高頻噪聲

丟棄將信號分解后的細節信號,就能達到移除噪聲的目的。有許多不同的方法可以用來移除信號中的噪聲。例如:Scipy庫包含了許多平滑濾波器,并且使用也較為簡單。那么,用離散小波變換移除高頻噪聲的優點是什么呢?主要是因為有許多不同形狀的小波函數可以選擇。我們可以選擇一個與我們期望看到的特性相符的小波函數,這樣的話我們期望看到的特性就不會被當成噪聲被移除。

3.5?使用離散小波變換來對信號進行分類

在3.2小節使用了連續小波變換+CNN的方式對信號進行分類,在本小節將使用離散小波變換來對信號進行分類。

3.5.1?離散小波分類背后的思路

利用離散小波變換將一個信號分解成不同的頻率子帶。如果不同類別的信號具有不同的頻率特性,那么頻率特性的不同一定會展示在某一個頻率子帶上。我們可以從每一個頻率子帶上產生特征(比如一些統計特征),然后再把這些特征串聯起來作為分類器的輸入。

3.5.2?從每一個頻率子帶上產生特征

從每個頻率子帶上可以產生什么樣的特征呢?一般而言,下面幾種特征是最常使用的。因為在實際應用中不知道哪些特征是有用的,可先進行特征選擇然后再分類,也可將特征選擇融入到分類過程中。

· Auto-regressive model coefficient values· (Shannon) Entropy values; entropy values can be taken as a measure of complexity of the signal.· Statistical features like: variance standard deviation Mean Median 25th percentile value 75th percentile value Root Mean Square value; square of the average of the squared amplitude values The mean of the derivative Zero crossing rate, i.e. the number of times a signal crosses y = 0 Mean crossing rate, i.e. the number of times a signal crosses y = mean(y)def?calculate_entropy(list_values): counter_values = Counter(list_values).most_common() probabilities = [elem[1]/len(list_values) for elem in counter_values] entropy=scipy.stats.entropy(probabilities) return entropydef calculate_statistics(list_values): n5 = np.nanpercentile(list_values, 5) n25 = np.nanpercentile(list_values, 25) n75 = np.nanpercentile(list_values, 75) n95 = np.nanpercentile(list_values, 95) median = np.nanpercentile(list_values, 50) mean = np.nanmean(list_values) std = np.nanstd(list_values) var = np.nanvar(list_values) rms = np.nanmean(np.sqrt(list_values**2)) return [n5, n25, n75, n95, median, mean, std, var, rms]def calculate_crossings(list_values): zero_crossing_indices = np.nonzero(np.diff(np.array(list_values) < 0))[0] no_zero_crossings = len(zero_crossing_indices) mean_crossing_indices = np.nonzero(np.diff(np.array(list_values) < np.nanmean(list_values)))[0] no_mean_crossings = len(mean_crossing_indices) return [no_zero_crossings, no_mean_crossings]def get_features(list_values): entropy = calculate_entropy(list_values) crossings = calculate_crossings(list_values) statistics = calculate_statistics(list_values)????return?[entropy]?+?crossings?+?statistics3.5.3?使用上一小節產生的特征以及scikit-learn中的分類器對兩個ECG數據集進行分類

下一步是利用離散小波變換將訓練集中的信號分解為頻率子帶,為每個子帶計算特征,使用這些特征訓練分類器以及使用分類器來預測信號。

如果一個信號有多個分量,則先對每個分量提取特征,再將這些分量串接在一起,作為該信號的特征向量。

使用DTW進行分類的精度依賴你所提取的特征、所選擇的小波函數以及所使用的分類器(梯度增強算法表現較好)。

4、結語

這篇博客利用小波變換對時間序列進行分析和分類。

可以在這個鏈接:https://github.com/taspinar/siml中找到相應代碼。

總結

以上是生活随笔為你收集整理的机器学习中val_小波变换(七):小波变换在机器学习中的应用(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。