[Stove AI] Машинное обучение 054-Слепое разделение источников с помощью ICA
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Слепое разделение источников относится к процессу отделения каждого сигнала источника от сигнала с наложением частот, когда теоретическая модель сигнала и сигнала источника не могут быть точно известны. Целью слепого разделения источников является получение наилучшей оценки исходного сигнала. Проще говоря, это эквивалентно тому, что если десять человек говорят одновременно, я использую магнитофон, чтобы записать то, что они говорят, и то, что я получаю, должно быть смесью 10 разных голосов, тогда как разделить этот смешанный голос на звук речи одного лица? Решением такой проблемы является слепое разделение источников.
Анализ независимых компонентов (ICA) решает проблему декомпозиции необработанных данных и часто используется в задачах слепого разделения источников. в моей последней статье[Stove AI] Машинное обучение 053-Трюк с уменьшением размерности данных-PCA и ядерный PCAУпоминается, что, хотя PCA имеет различные преимущества, он также имеет ряд недостатков. Например, он не может уменьшить размерность нелинейно организованных наборов данных. Решением этого недостатка является использование PCA ядра вместо PCA. Другой недостаток заключается в том, что его нельзя используется для решения наборов данных.Если распределение Гаусса не выполняется, уменьшение размерности данных в этом случае должно быть выполнено с помощью анализа независимых компонентов ICA.
Аналитик независимых компонентов Метод поиска скрытых факторов или компонентов из многомерных статистических данных.Разница между ICA и методами уменьшения размерности, такими как PCA, заключается в том, что он ищет компоненты, которые являются статистически независимыми и негауссовыми. Его математический принцип и логика могут относиться к сообщению в блоге:Независимый компонентный анализ ICA Series 2: концепции, приложения и принципы оценки
1. Загрузите набор данных
Сначала загрузите набор данных.Набор данных, используемый на этот раз, находится в файле mix_of_signals.txt.В этом файле есть четыре столбца данных, представляющих четыре разных источника сигнала, всего 2000 образцов.
data_path="E:\PyProjects\DataSet\FireAI\mixture_of_signals.txt"
df=pd.read_csv(data_path,header=None,sep=' ')
print(df.info()) # 查看数据信息,确保没有错误
print(df.head())
print(df.tail())
dataset_X=df.values
print(dataset_X.shape)
После построения графика вы можете увидеть распределение этих данных:
2. Используйте традиционный PCA для разделения сигналов
Если мы используем PCA для слепого разделения источников, мы можем увидеть, как это работает.Код:
# 如果用PCA来进行分离,看看结果如何
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca_dataset_X = pca.fit_transform(dataset_X)
pd.DataFrame(pca_dataset_X).plot(title='PCA_dataset')
Хотя различные сигналы после разделения PCA нарисованы выше, сигналы смешиваются вместе и их трудно различить, поэтому я написал функцию для их отображения по отдельности.
def plot_dataset_X(dataset_X):
rows,cols=dataset_X.shape
plt.figure(figsize=(15,20))
for i in range(cols):
plt.subplot(cols,1,i+1)
plt.title('Signal_'+str(i))
plt.plot(dataset_X[:,i])
3. Используйте ICA для разделения сигналов
Рассмотрим выделенный сигнал, полученный методом анализа независимых компонент:
# 如果用ICA进行信号分离
from sklearn.decomposition import FastICA
ica = FastICA(n_components=4)
ica_dataset_X = ica.fit_transform(dataset_X)
pd.DataFrame(ica_dataset_X).plot(title='ICA_dataset')
Точно так же для удобства отображения различные сигналы рисуются отдельно, как показано ниже:
Видно, что сигнал, полученный после разделения ICA, очень регулярен, в то время как сигнал после разделения PCA несколько загроможден, и эффект разделения слепых источников ICA лучше на поверхности.
########################резюме########################## ######
1. ICA может решить проблему разделения источников вслепую, и полученный эффект разделения намного лучше, чем PCA.
2. На самом деле, большинство реальных наборов данных в жизни не подчиняются распределению Гаусса.Они обычно подчиняются распределению Гаусса или субгауссову распределению.Поэтому эффект, полученный с помощью PCA, не идеален для многих задач, и ICA может использоваться для получения лучших результатов.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.