数据分析(二)特征值和特征向量、奇异值、傅里叶变换

人工智能27

一、特征值和特征向量(只能是方阵)

对于n阶方阵A,如果存在数a和非零n维列向量x,使得Ax=ax,则称a是矩阵A的一个特征值,x是矩阵A属于特征值a的特征向量


eigvals, eigvecs = np.linalg.eig(A)

S = np.mat(eigvecs) * np.mat(np.diag(eigvals)) * np.mat(eigvecs逆)

案例:

import numpy as np
A = np.mat('3 -2; 1 0')
print(A)
eigvals, eigvecs = np.linalg.eig(A)
print(eigvals)
print(eigvecs)
print(A * eigvecs[:, 0])
print(eigvals[0] * eigvecs[:, 0])
S = np.mat(eigvecs) * np.mat(np.diag(eigvals)) * np.mat(eigvecs.I)

案例:读取图片的亮度矩阵,提取特征值和特征向量,保留部分特征值,重新生成新的亮度矩阵,然后绘制图片。

[En]

Case: read the luminance matrix of the picture, extract the eigenvalues and Eigenvectors, retain some of the eigenvalues, regenerate the new luminance matrix, and draw the picture.

"""
  特征值和特征向量  提取图片
"""

import imageio
import numpy as np
import matplotlib.pyplot as mp

original = imageio.imread('D:\\python\\...\\lily.jpg',as_gray = True)
print(original.shape)

original = np.mat(original)

eigvals, eigvecs = np.linalg.eig(original)
print(eigvals,'特征值')
print(eigvecs,'特征向量')

eigvals[50:] = 0

dst = eigvecs * np.diag(eigvals) * eigvecs.I

mp.subplot(121)
mp.imshow(original,cmap='gray')
mp.xticks()
mp.yticks()
mp.tight_layout()

mp.subplot(122)
mp.imshow(dst.real,cmap='gray')
mp.xticks()
mp.yticks()
mp.tight_layout()

mp.show()

数据分析(二)特征值和特征向量、奇异值、傅里叶变换

二、奇异值分解(既可以方阵,又可以非方阵)

有一个矩阵M,可以分解为3个矩阵U、S、V,使得U x S x V等于M。 U与V都是正交矩阵(乘以自身的转置矩阵结果为单位矩阵)。 那么S矩阵主对角线上的元素称为矩阵M的奇异值,其它元素均为0。

import numpy as np
M = np.mat('4 11 14; 8 7 -2')
print(M)
U, sv, V = np.linalg.svd(M, full_matrices=False)
print(U * U.T)
print(V * V.T)
print(sv)
S = np.diag(sv)
print(S)
print(U * S * V)

例如:读取图片的亮度矩阵,提取奇异值和两个正交矩阵,保留一些奇异值,重新生成新的亮度矩阵,然后绘制图片。

[En]

Example: read the luminance matrix of the picture, extract the singular value and two orthogonal matrices, retain some singular values, regenerate the new luminance matrix, and draw the picture.

"""
  特征值和特征向量  提取图片
"""

import imageio
import numpy as np
import matplotlib.pyplot as mp

original = imageio.imread('D:\\python\\...\\lily.jpg',as_gray = True)
print(original.shape)

original = np.mat(original)

eigvals, eigvecs = np.linalg.eig(original)
print(eigvals,'特征值')
print(eigvecs,'特征向量')

eigvals[50:] = 0
dst = eigvecs * np.diag(eigvals) * eigvecs.I

U , sv, V = np.linalg.svd(original,full_matrices=False)
sv[50:] = 0
dst2 = U * np.diag(sv) * V

mp.subplot(221)
mp.imshow(original,cmap='gray')
mp.xticks()
mp.yticks()
mp.tight_layout()

mp.subplot(222)
mp.imshow(dst.real,cmap='gray')
mp.xticks()
mp.yticks()
mp.tight_layout()

mp.subplot(224)
mp.imshow(dst2.real,cmap='gray')
mp.xticks()
mp.yticks()
mp.tight_layout()

mp.show()

数据分析(二)特征值和特征向量、奇异值、傅里叶变换

三、快速傅里叶变换(fft)

什么是傅里叶变换?

法国科学家傅里叶提出傅里叶定理,任何一条周期曲线,无论多么跳跃或不规则,都能表示成一组光滑正弦曲线叠加之和。傅里叶变换即是将不规则曲线拆解为一组光滑正弦曲线的过程。

傅里叶变换的目的是将时间域(即时间域)中的信号转换为频域(即频域)中的信号。随着领域的不同,人们对同一事物的理解也会发生变化,所以在频域中很容易处理,而在时间域中很难处理。这可以极大地减少处理信号的存储。

[En]

The purpose of Fourier transform is to transform the signal in the time domain (that is, the time domain) into the signal in the frequency domain (that is, the frequency domain). With the difference of the domain, the understanding of the same thing will change, so it can be easily processed in the frequency domain where it is difficult to deal with in the time domain. This can greatly reduce the storage of processing signals.

例如:弹钢琴

假设有一时间域函数: y = f(x),根据傅里叶的理论它可以被分解为一系列正弦函数的叠加,他们的振幅A,频率ω或初相位φ不同:
y = A 1 s i n ( ω 1 x + ϕ 1 ) + A 2 s i n ( ω 2 x + ϕ 2 ) + A 2 s i n ( ω 2 x + ϕ 2 ) + R y = A_1sin(\omega_1x+\phi_1) + A_2sin(\omega_2x+\phi_2) + A_2sin(\omega_2x+\phi_2) + R y =A 1 ​s i n (ω1 ​x +ϕ1 ​)+A 2 ​s i n (ω2 ​x +ϕ2 ​)+A 2 ​s i n (ω2 ​x +ϕ2 ​)+R

因此,傅里叶变换可以将一个较复杂的函数变换为多个简单函数的叠加,问题的观点也从时间域转移到了频率域,一些问题会相对简单地处理。

[En]

Therefore, the Fourier transform can transform a more complex function into the superposition of multiple simple functions, and the point of view of the problem has also shifted from the time domain to the frequency domain, and some problems will be relatively simple to deal with.

傅里叶变换相关函数

导入快速傅里叶变换所需模块

import numpy.fft as nf

(1) 通过采样数与采样周期求得傅里叶变换分解所得曲线的 频率序列

freqs = np.fftfreq(采样数量, 采样周期)

(2) 通过原函数值的序列j经过快速傅里叶变换得到一个 复数数组,复数的模代表的是 振幅,复数的辐角代表 初相位

np.fft(原函数数组) -> 复数数组(表示一组正弦函数)

(3) 通过 复数数组 经过逆向傅里叶变换得到 合成的函数值数组

np.ifft(复数数组)->原函数值数组

案例:针对方波,绘制时域图与频域图。

import numpy as np
import matplotlib.pyplot as mp

x = np.linspace(0,4 * np.pi,1000)

y = np.zeros(1000)
for i in range(1, 1001, 2):
    y += 4 / i * np.pi * np.sin(i * x)

mp.figure('合成方波',facecolor='lightgray')

mp.title('Chart',fontsize = 18)

mp.grid(linestyle=':')
mp.plot(x,y,color = 'purple',label = 'y')
mp.tight_layout()

import numpy.fft as nf
complex_ary = nf.fft(y)
print(complex_ary.shape,complex_ary.dtype,complex_ary.size)

y_ = nf.ifft(complex_ary)
mp.subplot(121)
mp.grid(linestyle=':')
mp.plot(x,y_,color = 'green',label = 'y_',linewidth = 7,alpha = 0.2)

freqs = nf.fftfreq(y.size, x[1] - x[0])
pows = np.abs(complex_ary)
print(freqs)
mp.subplot(122)
mp.plot(freqs[freqs > 0],pows[freqs > 0],color = 'green',label = 'pows')
mp.tight_layout()

mp.legend()
mp.show()

数据分析(二)特征值和特征向量、奇异值、傅里叶变换

基于傅里叶变换的频域滤波

含噪信号是高能信号和低能噪声的叠加,通过傅里叶变换的频域滤波可以将其滤除。

[En]

Noisy signal is the superposition of high-energy signal and low-energy noise, which can be reduced by frequency domain filtering of Fourier transform.

通过FFT使含噪信号转换为含噪频谱,去除低能噪声,留下高能频谱后再通过IFFT留下高能信号。

案例:基于傅里叶变换的频域滤波为音频文件去除噪声。

"""
  频率滤波降噪
"""
import numpy as np
import numpy.fft as nf
import scipy.io.wavfile as wf
import matplotlib.pyplot as mp

sample_rate, noised_sigs = wf.read("D:\\python\\...\\noised.wav")
print(sample_rate, noised_sigs.shape)

noised_sigs = noised_sigs / 2 ** 15

times = np.arange(noised_sigs.size) / sample_rate
print(times)
mp.figure('Filter',facecolor='lightgray')
mp.subplot(221)

mp.title('Time Domain Chart',fontsize = 16)
mp.ylabel('Noised Signal',fontsize = 12)
mp.grid(linestyle=':')
mp.plot(times[:178],noised_sigs[:178],color='orange',label='Noised')
mp.legend()
mp.tight_layout()

freqs = nf.fftfreq(times.size, times[1] - times[0])
complex_ary = nf.fft(noised_sigs)
pows = np.abs(complex_ary)
mp.subplot(222)

mp.title('freqs Domain Chart',fontsize = 16)
mp.ylabel('pows',fontsize = 12)
mp.grid(linestyle=':')
mp.semilogy((freqs[freqs > 0]),(pows[freqs > 0]),color='purple',label='Noised')
mp.legend()
mp.tight_layout()

found_freq = freqs[pows.argmax()]

noised_index = np.where(freqs != found_freq)

complex_ary[noised_index] = 0
pows = np.abs(complex_ary)
mp.subplot(224)

mp.ylabel('pows',fontsize = 12)
mp.grid(linestyle=':')
mp.plot((freqs[freqs > 0]),(pows[freqs > 0]),color='green',label='Filter')
mp.legend()

filter_sigs = nf.ifft(complex_ary).real
mp.subplot(223)

mp.ylabel('Filter Signal',fontsize = 12)
mp.grid(linestyle=':')
mp.plot(times[:178],filter_sigs[:178],color='blue',label='Filter')
mp.legend()
mp.tight_layout()

wf.write("D:\\python\\video\\笔记\\第五阶段\\AI\\data_note\\素材\\da_data\\filter_noised.wav", sample_rate,
         (filter_sigs * 2 ** 15).astype(np.int16) )

mp.show()

数据分析(二)特征值和特征向量、奇异值、傅里叶变换

Original: https://blog.csdn.net/qq_44665283/article/details/122737576
Author: undo_try
Title: 数据分析(二)特征值和特征向量、奇异值、傅里叶变换



相关阅读

Title: pytorch安装详细步骤

文章目录

(一)win—配置tensorflow-GPU

直接查看这条链接即可:win-配置tf-GPU
本人用的conda和tensorflow-GPU版本下载:提取码:98ot
环境:win10+anaconda
注:anaconda安装步骤略,以下步骤默认anaconda已安装。

(二)安装 pytorch

2.1 创建虚拟环境


数据分析(二)特征值和特征向量、奇异值、傅里叶变换


conda create --name pytorch python=3.8.1

注意,这里的 pytorch 是虚拟环境的名称,可随意取。3.8.1是我机器上的python版本,可结合自己安装的python版本灵活变换。


activate pytorch

数据分析(二)特征值和特征向量、奇异值、傅里叶变换

2.2正式安装pytorch

****:pytorch 官网链接
数据分析(二)特征值和特征向量、奇异值、傅里叶变换
注意:如果笔记本有独立显卡(NVIDIA)的话,可以如上选择对应的CUDA版本,否则选择CPU。

  • 本人采用的方法
    在pytorch虚拟环境下,创建.condarc文件
    数据分析(二)特征值和特征向量、奇异值、傅里叶变换
    在虚拟环境中输入如下命令:
conda config --set show_channel_urls yes
  • 之后在自己电脑的用户文件下找到一个.condarc文件
    数据分析(二)特征值和特征向量、奇异值、傅里叶变换
    用记事本打开这个文件,然后用如下代码代替其中的内容:
channels:
  - defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

记住.condarc配置好后一定要保存。

  • 或者使用清华镜像源
    在浏览pytorch安装帮助的相关帖子时有人说清华源停止镜像了,但是现在清华源已经恢复提供镜像了,所以还是可以用的。附上清华源Anaconda镜像使用帮助,大家可以读一下这段帮助(不读也没关系下面给出详细步骤)。
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

复制这条命令在 Anaconda Prompt 里输入。

2.3 验证是否安装成功

是否安装成功分两个方面。

  • 一个是在prompt里面

(1)在命令行左边为 pytorch 环境中,输入 python

(2)之后,输入 import torch,如果没有报错,意味着 PyTorch 已经顺利安装了。

  • 一个是在jupyter notebook里面调用
    首先,在菜单中打开Anaconda Prompt,然后安装插件。
    命令行输入:
conda install nb_conda

然后进入创建的pytorch环境,命令行输入:

conda install ipykernel

安装成功的样子如下:
数据分析(二)特征值和特征向量、奇异值、傅里叶变换
进入Anaconda中可查看,多了pytorch框架:
数据分析(二)特征值和特征向量、奇异值、傅里叶变换

(三)本文参考链接如下:(感谢各位大佬)

WIN10下pytorch环境配置(安装了半天的血泪史)
WIn10+Anaconda环境下安装PyTorch(避坑指南)
win10下使用anaconda安装pytorch(清华镜像)
如何让Jupyter Notebook支持pytorch

Original: https://blog.csdn.net/weixin_54546190/article/details/120754242
Author: ☞源仔
Title: pytorch安装详细步骤

相关文章