Модуль 3 - Школа анализа инженерных данных
Алгоритм анализа акустических данных — домашнее задание
Цель: научиться применять алгоритм анализа акустических данных: загружать сигналы, разбивать их на сегменты, создавать обучающую выборку, извлекать признаки, нормализовать данные и создавать модели машинного обучения.
Данные:
Bearing.mat— эталонные данные с акустическими сигналами подшипника.
Формат сдачи: В проверочную систему Etude нужно вставить код из секции с отметкой ✍️.
Важно: Код должен сохранять результат в переменную, указанную в задании. Некоторые задания требуют копирования полного кода из предыдущих заданий — следуйте указаниям в соответствующих ячейках.
# ⚙️ ПОДГОТОВИТЕЛЬНЫЙ КОД
Pkg.add(["MAT", "Statistics", "FFTW", "DecisionTree"])
cd( @__DIR__ )
# Выполните эту ячейку перед началом работы
✏️ Задание 1
Загрузите файл Bearing.mat с помощью функции matread и сохраните результат в переменную подшипник.
Подсказка:
-
Убедитесь, что пакет
MATподключён. -
Файл находится в папке
data, поэтому путь к нему такой:"data/Bearing.mat".
# ✍️ ВАШ КОД — ЗАДАНИЕ 1
using MAT
подшипник = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(sum(abs(подшипник["inner"])), digits=0)))
Ожидаемый вывод программы: 25057
✏️ Задание 2
Извлеките четыре акустических сигнала из загруженного файла в отдельные векторы: норма, ролик, внутр, внеш. В файле они хранятся как матрицы, поэтому используйте функцию vec.
Подсказка:
-
Скопируйте полный код из Задания 1.
-
Ключи в файле:
"normal","roller","inner","outer". -
Обращение к данным:
подшипник["normal"].
using MAT
подшипник = # скопируйте сюда ваш код из Задания 1
# ✍️ ВАШ КОД — ЗАДАНИЕ 2
норма = # здесь напишите ваш код
ролик = # здесь напишите ваш код
внутр = # здесь напишите ваш код
внеш = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(sum(abs.(норма).+abs.(ролик).+abs.(внутр).+abs.(внеш)), digits=0)))
Ожидаемый вывод программы: 94201
✏️ Задание 3
Напишите функцию разделить_на_сегменты, которая разбивает длинный сигнал на короткие сегменты с перекрытием. Затем разбейте каждый из четырёх сигналов на сегменты длиной 4000 отсчётов с перекрытием 75 процентов.
Подсказка:
-
Скопируйте полный код из Заданий 1 и 2.
-
Шаг вычисляется как
Int(floor(длина_сегмента * (1 - перекрытие))). -
Цикл идёт от
1с шагомшагдоlength(сигнал) - длина_сегмента + 1. -
Каждый сегмент:
сигнал[i:i+длина_сегмента-1], добавьте его в вектор черезpush!.
using MAT
# скопируйте сюда полный код из Задания 1
# скопируйте сюда полный код из Задания 2
# ...
# ✍️ ВАШ КОД — ЗАДАНИЕ 3
function разделить_на_сегменты(сигнал, длина_сегмента, перекрытие)
шаг = # здесь напишите ваш код
сегменты = []
for i in # здесь напишите ваш код
# здесь напишите ваш код
end
return сегменты
end
длина_сегмента = 4000
перекрытие = 0.75
сегменты_норма = # здесь напишите ваш код
сегменты_ролик = # здесь напишите ваш код
сегменты_внутр = # здесь напишите ваш код
сегменты_внеш = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(sum((sum(abs.(сегменты_норма)).+sum(abs.(сегменты_ролик)).+
sum(abs.(сегменты_внутр)).+sum(abs.(сегменты_внеш)))), digits=0)))
Ожидаемый вывод программы: 367281
✏️ Задание 4
Создайте обучающую выборку для модели, которая будет предсказывать степень износа трёх элементов подшипника: внутреннего кольца, внешнего кольца и тела качения (ролика). В этом задании используется упрощённый подход по сравнению с полным алгоритмом из практического семинара: вместо 54 признаков мы вычисляем только один признак - RMS. Это позволяет сосредоточиться на самом принципе построения обучающей выборки.
Для каждого примера нужно вычислить RMS (среднеквадратичное значение) и записать его в вектор X. В вектор y записываются три целевых значения: процент износа внутреннего кольца, внешнего кольца и ролика соответственно.
Сначала добавьте один пример для нормального подшипника: вычислите RMS сигнала норма и добавьте его в X, а в y добавьте три нуля, так как износ всех элементов равен нулю.
Затем для каждого из трёх типов дефекта - внутреннего кольца, внешнего кольца и ролика - создайте по 12 примеров со степенями износа из вектора степени. Для каждой степени вычислите смесь по формуле норма + степень * (дефект - норма). Эта формула добавляет к нормальному сигналу только дефектную составляющую: при степени 0 получаем чистую норму, при степени 1 - чистый дефект. Для каждой смеси вычислите RMS и добавьте в X. В y добавьте три числа: процент износа соответствующего элемента (значение степени, умноженное на 100), а для остальных двух элементов - нули.
После заполнения векторов преобразуйте X в матрицу с одним столбцом и y в матрицу с тремя столбцами.
Подсказка:
-
Скопируйте полный код из Заданий 1 и 2, чтобы получить переменные
норма,ролик,внутр,внеш. -
Вектор
степениуже определён, в нём 12 значений от 0.05 до 1.0. -
RMS вычисляется в одну строку:
sqrt(mean((сигнал .- mean(сигнал)) .^ 2)). Здесьсигнал .- mean(сигнал)центрирует сигнал, возведение в квадрат.^ 2даёт квадраты отклонений,meanусредняет их,sqrtизвлекает корень. -
Для нормального подшипника:
push!(X, sqrt(mean((норма .- mean(норма)) .^ 2)))иpush!(y, 0.0, 0.0, 0.0). -
В цикле по дефектам используйте кортежи
(внутр, 1),(внеш, 2),(ролик, 3). Индекс указывает, в какой из трёх позиций векторацельзаписывать процент износа. -
Целевой вектор создавайте через
zeros(3), затем заполняйтецель[индекс] = ст * 100. -
Для добавления трёх чисел из вектора
цельвyиспользуйте оператор развёртывания:push!(y, цель...). -
Для преобразования используйте
reshape(X, :, 1)иreshape(y, 3, :)'.
using MAT, Statistics
# скопируйте сюда полный код из Задания 1
# скопируйте сюда полный код из Задания 2
# ...
# ✍️ ВАШ КОД — ЗАДАНИЕ 4
степени = [0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.0]
X = Float64[]
y = Float64[]
push!# здесь напишите ваш код
push!# здесь напишите ваш код
for (дефект, индекс) in # здесь напишите ваш код
for ст in степени
смесь = # здесь напишите ваш код
push!# здесь напишите ваш код
цель = # здесь напишите ваш код
цель[индекс] = # здесь напишите ваш код
push!# здесь напишите ваш код
end
end
X_матрица = # здесь напишите ваш код
y_матрица = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(sum(y_матрица)+1e3*round(sum(X_матрица[:, 1]), digits=3)))
Ожидаемый вывод программы: 9621
✏️ Задание 5
Извлеките из первых 4000 отсчётов нормального сигнала 14 признаков, которые описывают сигнал с разных сторон. Это упрощённая версия набора признаков из практического семинара, где использовались 54 признака. Здесь мы выделяем самые информативные.
Первый признак - RMS, среднеквадратичное значение. Он показывает общую мощность сигнала. Вычисляется как квадратный корень из среднего квадрата отклонений.
Второй признак - доминирующая частота спектра. Это частота, на которой амплитуда спектра максимальна. Для её вычисления нужно применить быстрое преобразование Фурье к сигналу, взять модуль для получения амплитудного спектра, оставить только первую половину, так как вторая половина симметрична. Затем построить вектор частот от 0 до частоты Найквиста и найти частоту, соответствующую максимальной амплитуде.
Следующие десять признаков - энергии сигнала в частотных полосах. Весь диапазон от 0 до 5000 герц разбит на десять равных полос шириной 500 герц. Для каждой полосы нужно вычислить сумму квадратов амплитуд спектра, попадающих в эту полосу. Это показывает, как энергия сигнала распределена по частотам.
Тринадцатый признак - количество пересечений нуля. Это доля моментов времени, когда сигнал переходит через нулевое значение. Вычисляется как количество изменений знака сигнала, делённое на общую длину.
Четырнадцатый признак - отношение 75-го процентиля к 25-му процентилю абсолютных амплитуд. Это показывает, насколько сильно различаются большие и малые амплитуды в сигнале.
Объедините все 14 признаков в один вектор с помощью vcat и сохраните его в переменную признаки.
Подсказка:
-
Скопируйте полный код из Заданий 1 и 2, чтобы получить переменную
норма. -
Переменные
N = 4000,fs = 10000и векторполосыуже определены. -
Центрируйте сигнал:
сигнал = норма[1:N] .- mean(норма[1:N]). -
RMS:
rms_val = sqrt(mean(сигнал .^ 2)). -
Спектр:
спектр = abs.(fft(сигнал)). Односторонний спектр:одност = спектр[1:N÷2]. -
Вектор частот:
частоты = (0:N÷2-1) * fs / N. -
Доминирующая частота:
домин_частота = частоты[argmax(одност)]. Функцияargmaxнаходит индекс максимального элемента. -
Энергии полос:
энергии_полос = [sum(одност[(частоты .>= н) .& (частоты .< в)] .^ 2) for (н, в) in полосы]. Здесь маска(частоты .>= н) .& (частоты .< в)выделяет частоты, попадающие в полосу отндов. -
Пересечения нуля:
пересечения_нуля = sum(diff(sign.(сигнал)) .!= 0) / N. Функцияsignвозвращает знак каждого отсчёта,diffвычисляет разности соседних знаков,.!= 0превращает их в логические значения. -
Для процентилей отсортируйте абсолютные значения:
сортировка = sort(abs.(сигнал)). Затемp25 = сортировка[div(N, 4)]иp75 = сортировка[div(3*N, 4)]. -
Объедините признаки:
признаки = vcat(rms_val, домин_частота, энергии_полос, пересечения_нуля, p75/p25).
using MAT, Statistics, FFTW
# скопируйте сюда полный код из Задания 1
# скопируйте сюда полный код из Задания 2
# ...
# ✍️ ВАШ КОД — ЗАДАНИЕ 5
N = 4000
fs = 10000
полосы = [(0,500), (500,1000), (1000,1500), (1500,2000), (2000,2500),
(2500,3000), (3000,3500), (3500,4000), (4000,4500), (4500,5000)]
сигнал = # здесь напишите ваш код
rms_val = # здесь напишите ваш код
спектр = # здесь напишите ваш код
одност = # здесь напишите ваш код
частоты = # здесь напишите ваш код
домин_частота = # здесь напишите ваш код
энергии_полос = # здесь напишите ваш код
пересечения_нуля = # здесь напишите ваш код
abs_сигнал = # здесь напишите ваш код
сортировка = # здесь напишите ваш код
p25 = # здесь напишите ваш код
p75 = # здесь напишите ваш код
признаки = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(sum(признаки), digits=0)))
Ожидаемый вывод программы: 45545
✏️ Задание 6
Нормализуйте матрицу признаков X_матрица: вычислите средние значения и стандартные отклонения каждого столбца, затем примените нормализацию. Сохраните результат в переменную X_норм.
Подсказка:
-
Скопируйте полный код из Заданий 1, 2 и 4.
-
Средние:
mean(X_матрица, dims=1)[:]. -
Стандартные отклонения:
std(X_матрица, dims=1)[:]. -
Замените нулевые отклонения на единицу:
ско[ско .< 1e-10] .= 1.0. -
Нормализация:
(X_матрица .- средние') ./ ско'.
using MAT, Statistics
# скопируйте сюда полный код из Задания 1
# скопируйте сюда полный код из Задания 2
# ...
# скопируйте сюда полный код из Задания 4
# ...
# ✍️ ВАШ КОД — ЗАДАНИЕ 6
средние = # здесь напишите ваш код
ско = # здесь напишите ваш код
ско[ско .< 1e-10] .= 1.0
X_норм = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(1e3*maximum(X_норм), digits=0)))
Ожидаемый вывод программы: 2645
✏️ Задание 7
Создайте три модели случайного леса для предсказания износа трёх элементов подшипника. Для внутреннего и внешнего колец используйте 400 деревьев и максимальную глубину 35. Для ролика используйте 600 деревьев и максимальную глубину 50.
Подсказка:
-
Модели создаются через
DecisionTree.RandomForestRegressor. -
Обязательные параметры:
n_trees,max_depth,min_samples_split=2,min_samples_leaf=1. -
Для воспроизводимости используйте разные
rng: 42, 43 и 44.
# ✍️ ВАШ КОД — ЗАДАНИЕ 7
using DecisionTree
модель_внутр = # здесь напишите ваш код
модель_внеш = # здесь напишите ваш код
модель_ролик = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(Int64(round(1e3*(модель_внутр.partial_sampling+модель_внеш.partial_sampling+модель_ролик.partial_sampling), digits=0)))
Ожидаемый вывод программы: 2100
Заключение
Поздравляем! Вы успешно прошли все этапы создания модели акустической диагностики: от загрузки данных и сегментации сигналов до извлечения признаков, нормализации и создания моделей машинного обучения. В следующем модуле мы применим эти модели для диагностики новых сигналов и оценки степени износа оборудования.