import numpy as np
import math
import random
import matplotlib.pyplot as plt
import scipy.io as scio
from scipy.fft import fft'''
函数名称:center_data
函数功能:对数据中心化:对输入矩阵的每个元素,都减去该元素所在行(每一行一共有m个元素)的均值
输入参数:X          要处理的矩阵,大小为(n,m)
返回参数:X_center   进行中心化处理之后的矩阵,大小为(n,m)
'''def center_data(X):# 沿着行的方向取均值,即计算n个麦克风在m个时刻中的均值,X_means的shape是(n,)X_means = np.mean(X, axis=1)# 将X_means增加一个新行,shape变为(n,1),X的每一列都与之对应相减return X - X_means[:, np.newaxis]                #np.newaxis的作用是增加一个维度。'''
函数名称:whiten_data
函数功能:对数据白化处理
输入参数:X          要处理的矩阵,大小为(n,m)
返回参数:Z          白化处理之后的矩阵,大小为(n,m)V          白化变换矩阵
'''def whiten_data(X):# 计算X的协方差矩阵,cov_X = E{XX^T)}cov_X = np.cov(X)# 计算协方差矩阵的特征值和特征向量eigenValue, eigenVector = np.linalg.eig(cov_X)# 将特征值向量对角化,变成对角阵,然后取逆eigenValue_inv = np.linalg.inv(np.diag(eigenValue))# 计算白化变换矩阵VV = np.dot(np.sqrt(eigenValue_inv), np.transpose(eigenVector))# 计算白化处理后得矩阵Z,Z=VXZ = np.dot(V, X)return Z, Vdef gx(x, alpha=1):n = x.shape[0]for i in range(n):#for j in range(n):x[i] = x[i] * np.exp((-alpha * x[i]**2) / 2)return xdef div_gx(x, alpha=1):n = x.shape[0]for i in range(n):#for j in range(n):x[i] = (1 - alpha * x[i] **2) * np.exp(( - alpha * x[i]**2) / 2)return x'''
函数名称:decorrelation_data
函数功能:对数据(W)进行去相关
输入参数:W                       要处理的矩阵,大小为(n,n)
返回参数:W_decorrelation         去相关之后的W
'''def decorrelation_data(W):# 对WW.T进行特征值分解,D是特征值,P是特征向量D, P = np.linalg.eigh(np.dot(W, np.transpose(W)))# 特征值对角化,然后取逆div_D = np.linalg.inv(np.diag(D))# W_decorrelation = PD^(-1/2)P.T Wreturn np.dot(np.dot(np.dot(P, np.sqrt(div_D)), np.transpose(P)), W)'''
函数名称:FastICA
函数功能:对输入矩阵做ICA处理
输入参数:Z         输入矩阵(观测矩阵中心化白化之后的结果),大小为(n,m)
返回参数:W         ICA算法估计的Witer_num   ICA迭代次数
'''def FastICA(Z):i = 0VariableNum,SampleNum = Z.shapeprint(VariableNum)print(SampleNum)# create w,随机生成W的值w = np.ones((VariableNum, VariableNum), np.float32)W = np.zeros((VariableNum, VariableNum), np.float32)for i in range(VariableNum):for j in range(VariableNum):W[i, j] = 2 * random.random() - 0.5# 迭代compute WmaxIter = 500  # 设置最大迭代数量for j in range(VariableNum):while(i < maxIter):W_back = W[:,j]t = np.dot(np.transpose(Z),W[:,j])g = gx(t)dg = div_gx(t)W[:,j] = np.dot(Z,g)/SampleNum-np.mean(dg)*W[:,j]W[:,j] = W[:,j] - np.dot(np.dot(W,np.transpose(W)),W[:,j])W[:, j] = W[:, j] / np.linalg.norm(W[:, j])if np.abs(np.dot(np.transpose(W[:,j]),W_back) - 1)< 1e-11:for q in range(w.shape[0]):w[q,j] = W[q,j]breaki = i+1return wdef my_fft(x,n=1024):x_fft = fft(x,n=n)X = x_fft[0:int(x_fft.shape[0]/2)]X = 2*abs(X)/nreturn Xdef show_data(S1,S2,MixedS1,MixedS2,y11,y12):S1 = S1.reshape(1000,)S2 = S2.reshape(1000, )s1_fft = my_fft(S1,n=1024)s2_fft = my_fft(S2,n=1024)MixedS1_fft = my_fft(MixedS1,n=1024)MixedS2_fft = my_fft(MixedS2,n=1024)y11_fft = my_fft(y11,n=1024)y12_fft = my_fft(y12,n=1024)plt.rcParams['font.sans-serif'] = ['simhei']  # 添加中文字体为黑体plt.rcParams['axes.unicode_minus'] = Falseplt.figure(dpi=300)plt.subplot(6,2,1)plt.plot(S1)plt.title('原始信号yy1')plt.subplot(6,2,2)plt.plot(S2)plt.title('原始信号yy2')plt.subplot(6,2,3)plt.plot(s1_fft)plt.title('原始信号1频谱')plt.subplot(6,2,4)plt.plot(s2_fft)plt.title('原始信号2频谱')plt.subplot(6,2,5)plt.plot(MixedS1)plt.title('混合信号1')plt.subplot(6,2,6)plt.plot(MixedS2)plt.title('混合信号2')plt.subplot(6,2,7)plt.plot(MixedS1_fft)plt.title('混合信号1频谱')plt.subplot(6,2,8)plt.plot(MixedS2_fft)plt.title('混合信号2频谱')plt.subplot(6,2,9)plt.plot(y11)plt.title('分离信号1')plt.subplot(6,2,10)plt.plot(y12)plt.title('分离信号2')plt.subplot(6,2,11)plt.plot(y11_fft)plt.title('分离信号1频谱')plt.subplot(6,2,12)plt.plot(y12_fft)plt.title('分离信号2频谱')name_ = '实验仿真'plt.savefig('./results/' + name_ + '.jpg')plt.close()# 主函数入口
def main():Mix_ = scio.loadmat('doubl.mat')Mix = Mix_['doubl']I1_ = scio.loadmat('stri.mat')I1 = I1_['stri']I2_ = scio.loadmat('vibra.mat')I2 = I2_['vibra']#读取数据S1 = I1[0,:]S2 = I2[0,:]S1 = S1.reshape(1,S1.shape[0])S2 = S2.reshape(1,S2.shape[0])S = np.concatenate((S1,S2),axis=0)print(S.shape)MixedS = Mix[0:2,:]print(MixedS.shape)MixedS1 = MixedS[0, :]MixedS2 = MixedS[1, :]MixedS = center_data(MixedS)MixedS_white,Z = whiten_data(MixedS)W = FastICA(MixedS_white)ICAedS = np.dot(np.transpose(W),MixedS)y11 = ICAedS[0,:]y12 = ICAedS[1,:]show_data(S1,S2,MixedS1,MixedS2,y11,y12)if __name__ == "__main__":main()

python fastICA相关推荐

  1. fastica和pca区别_PCA与ICA

    关于机器学习理论方面的研究,最好阅读英文原版的学术论文.PCA主要作用是数据降维,而ICA主要作用是盲信号分离.在讲述理论依据之前,先思考以下几个问题:真实的数据训练总是存在以下几个问题: ①特征冗余 ...

  2. 史上最直白的ICA教程之一

    前言 独立成分分析ICA是一个在多领域被应用的基础算法.ICA是一个不定问题,没有确定解,所以存在各种不同先验假定下的求解算法.相比其他技术,ICA的开源代码不是很多,且存在黑魔法–有些步骤并没有在论 ...

  3. PCA、LDA、MDS、LLE、TSNE等降维算法的Python实现

    整理 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]网上关于各种降维算法的资料参差不齐,但大部分不提供源代码.近日,有人在 GitHub 上整理了一些经典降维算法的 Demo ...

  4. 10种常用降维算法源代码(python)

    最近发现一位同学整理了一些经典的降维算法,并用python实现常见降维算法的代码,特此推荐.作者:超爱学习 代码的github: https://github.com/heucoder/dimensi ...

  5. python用tsne降维_哈工大硕士实现了 11 种经典数据降维算法,源代码库已开放

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  6. std中稳定排序算法_源代码库已开放 | 哈工大硕士生用 Python 实现了 11 种经典数据降维算法...

    转自:AI开发者 网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA ...

  7. python降维之时间类型数据的处理_使用Python进行数据降维|线性降维

    前言 为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的摈弃,并且数据降维保留了原始数据的信息,我们就可以用降维的数据进行机器学习模型的训 ...

  8. python 最优化算法库_哈工大硕士生用?Python 实现了 11 种经典数据降维算法,源代码库已开放...

    雷锋网 AI 开发者按:网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA. ...

  9. 人脑功能连接与相似性分析:基于Python

    文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注. 本文将以人脑腹侧颞叶皮层的多体素模式分析(MVPA)来探讨人脑功能连接与相似性分析.MVPA被认为是一个监督分类问题,分类器试图捕捉fMR ...

最新文章

  1. matlab的帮助命令是英文的,4 Matlab 帮助系统
  2. 初学视觉学习笔记----用摄像头获取图片
  3. Healing Psoriasis The Natural Alternative-序言(未完待续)
  4. 19c 新特性: Hint Usage Reports详解
  5. Sublime Text 2安装插件的方法
  6. 采用批处理命令对文件进行解压及采用SQLCMD进行数据库挂载
  7. 手把手带你阅读Mybatis源码(二)执行篇
  8. 解决oracle11g连接失败 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist
  9. 五年从程序员到架构师 架构师进阶之路
  10. HDU 5762 Teacher Bo (水题)
  11. VBA字典(详解,示例)
  12. 关于先有鸡还是先有蛋,终于有正确答案了 1
  13. Linux下串口编制【转】
  14. 高通WLAN框架学习(17)-- NIO和PNO
  15. Neo4j3-Neo4j基础操作(中)
  16. 运维生涯中总有一次痛彻心扉的rm命令
  17. Android性能调优实例
  18. pycharm定义空的二维数组_数组与面向对象
  19. WIN10, USB转TTL驱动安装( CH340 和 PL- 2303 )
  20. 5年时间,我是如何在帝都全款买房的!!!

热门文章

  1. 基于Java固定资产管理系统设计实现(源码+lw+部署文档+讲解等)
  2. 机器学习算法(一):逻辑回归模型(Logistic Regression, LR)
  3. 5.4 来电黑名单拦截 ,删除呼叫记录
  4. 在嵌入式设备运行Rust/bluer蓝牙简单应用
  5. server sql top速度变慢解决方案_SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种)...
  6. Pokemon Go泄露隐私,不合情但合理
  7. FAN(Understanding The Robustness in Vision Transformers)论文解读,鲁棒性和高效性超越ConvNeXt、Swin
  8. 【博客134】linux显示磁盘信息—df命令
  9. 2019百家号爆文标题技巧 自媒体怎样提高阅读量和收益
  10. 【转载】VC IME 通信