Python 第三方模块 科学计算 SciPy模块3 聚类,快速傅里叶变换

六.Cluster模块
1.概述:

scipy.cluster是scipy下的1个做聚类的包,包含了2类聚类方法:
①矢量量化(scipy.cluster.vq):支持"矢量量化"(Vector Quantization)"K-均值聚类算法"(M-Means Clustering Algorithm)
②层次聚类(scipy.cluster.hierarchy):支持"层次聚类"(Hierarchical Clustering)"凝聚聚类"(Agglomerative Clustering)

2.矢量量化
(1)数据预处理:

将数据进行美白:[<result>=]scipy.cluster.vq.whiten(<obs>[,check_finite=True])
  #每列为1个属性,该方法相当于将每个属性的标准差都缩放为1或<obs>/<obs>.std(axis=0)
  #参数说明:
	obs:指定数据集;为M×N ndarray(每行为1条记录)
	  #下述各方法使用的<obs>都应先通过该方法进行处理
  	check_finite:指定是否检查<obs>是否仅包含有限值
  	  #若不检查,可能带来性能上的提升;但若<obs>包含∞/NaN,可能导致错误
  	result:返回处理后的数据;为M×N ndarray

#实例:
>>> features=np.array([[1.9,2.3,1.7],[1.5,2.5,2.2],[0.8,0.6,1.7,]])
>>> cluster.vq.whiten(features)
array([[4.17944278, 2.69811351, 7.21248917],
       [3.29956009, 2.93273208, 9.33380951],
       [1.75976538, 0.7038557 , 7.21248917]])
>>> s0=features.std(axis=0)
>>> features/s0
array([[4.17944278, 2.69811351, 7.21248917],
       [3.29956009, 2.93273208, 9.33380951],
       [1.75976538, 0.7038557 , 7.21248917]])

(2)矢量量化:

将数据点分配给聚类中心:[<code>,<dist>=]scipy.cluster.vq.vq(<obs>,<code_book>[,check_finite=True])
  #参数说明:
	code_book:指定聚类中心;为k×N ndarray
	code:返回数据点所属的聚类中心;1×M ndarray
	dist:返回各数据点到其所属的聚类中心的欧几里得距离;1×M ndarray

#实例:
>>> code_book=np.array([[1.,1.,1.],[2.,2.,2.]])
>>> features=np.array([[1.9,2.3,1.7],[1.5,2.5,2.2],[0.8,0.6,1.7]])
>>> cluster.vq.vq(features,code_book)
(array([1, 1, 0]), array([0.43588989, 0.73484692, 0.83066239]))

(3)K-均值聚类算法:

利用k-均值算法进行聚类:[<codebook>,<distortion>=]scipy.cluster.vq.kmeans(<obs>,<k_or_guess>[,iter=20,thresh=1e-5,check_finite=True])
  #这不是标准k-均值算法,停止条件为精度变化而非迭代次数/不一定返回最后1次迭代的聚类中心/会多次运行k-均值
  #参数说明:
  	k_or_guess:指定簇的数量或聚类中心;int/k×N ndarray
  	  #若为int,则初始聚类中心被随机选取
  	iter:指定运行k-means算法的次数;int
  	  #每次运行,会重新随机选择初始聚类中心,并迭代直到精度变化小于thresh
  	  #若k_or_guess为ndarray,则忽略该参数
  	thresh:指定最低精度变化(停止条件);float
  	  #若2次迭代间的精度变化小于等于该值,则停止
  	codebook:返回最终的聚类中心;为k×N ndarray
  	  #返回具有最低失真的聚类中心
  	distortion:返回数据点到最终聚类中心的平均欧几里得距离;float

######################################################################################################################

利用k-均值算法进行聚类:[<centroid>,<label>=]scipy.cluster.vq.kmeans2(<data>,<k>[,iter=20,thresh=1e-5,minit='random', missing='warn',check_finite=True])
  #这是标准的k-均值算法
  #参数说明:
    data:指定数据集;为M×N ndarray(每行为1条记录)/1×M ndarray(每个元素为1条记录)
    k:指定簇的数量或初始聚类中心;int/k×N ndarray
      #若为ndarray/minit="matrix",则被认为指定了聚类中心
      #若为int,则初始聚类中心被随机选取
    iter:指定迭代次数(尝试新聚类中心的次数);int
      #注意与scipy.cluster.vq.kmeans()中iter参数的区别
    thresh:暂未使用;float
    minit:指定初始化方法(选择初始聚类中心的方法);'random'/'points'/'++'/'matrix'
      #'random':generate k centroids from a Gaussian with mean and variance estimated from the data.
      #'points':choose k observations (rows) at random from data for the initial centroids.
      #'++':choose k observations accordingly to the kmeans++ method (careful seeding)
      #'matrix':interpret the k parameter as a k by M (or length k array for 1-D data) array of initial centroids
    missing:指定如何处理空簇;'warn'/'raise'
    centroid:返回最终聚类中心;为k×N ndarray
      #返回最后1次迭代的聚类中心
    label:返回各记录所属的聚类中心;为M×N ndarray

3.层次聚类

七.Fft模块

注意:旧版是fftpack,不过目前使用fft或fftpack均可

1.快速傅里叶变换
(1)1维:

进行1维离散傅里叶变换:[<out>=]scipy.fft.fft(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:
    x:指定向量;为array-like
      #其中的元素可为复数;当维数>1时,会被拆分为多个向量分别进行变换
    n:指定轴(axis)的长度;int
      #如果n>len(<x>),就在<x>后补0;如果n<len(<x>),就裁剪掉<x>后部多余的元素
      #如果n=len(<x>),不进行加工;如果n=None,则为<x>中相应轴的长度
    axis:指定沿哪个轴进行变换;int
      #-1表示最后1个axis;相当于指定拆分出的向量与哪个轴平行
    norm:指定归一化模式(normalization mode);None/"ortho"
      #Default is None, meaning no normalization on the forward transforms and scaling by '1/n' on the 'ifft'. For
      #'norm="ortho"', both directions are scaled by '1/sqrt(n)'
    overwrite_x:是否可销毁<x>中的内容;bool
      #如果为True,<x>中的数据可能被销毁,如被变换结果覆盖
    workers:指定允许被拆分为的最大子任务数;int
      #每子任务对从<x>拆分出的所有向量中的1个进行变换,因而仅在<x>的维数>1时有效;不同的子任务是被并行计算的
      #如果为负值,由os.cpu_count()决定
    plan:目前无用
    out:返回变换后得到的向量;为ndarray

#实例:
>>> x=np.array([1.0,2.0,1.0,-1.0,1.5])
>>> y=scipy.fft.fft(x)
>>> print(y)
[ 4.5       -0.j          2.08155948-1.65109876j -1.83155948+1.60822041j
 -1.83155948-1.60822041j  2.08155948+1.65109876j]
>>> z=scipy.fft.ifft(y)
>>> print(z)
[ 1. +0.j  2. +0.j  1. +0.j -1. +0.j  1.5+0.j]

######################################################################################################################

对实数组进行1维离散傅里叶变换:[<out>=]scipy.fft.rfft(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:其他参数同scipy.fft.fft()
    x:其中的元素只能是实数,其他同scipy.fft.fft()

######################################################################################################################

计算具有Hermitian对称性(即实谱)的信号的FFT:[<out>=]scipy.fft.hfft(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])

(2)2维:

进行2维离散傅里叶变换:[<out>=]scipy.fft.fft2(<x>[,s=None,axes=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:其他参数同scipy.fft.fft()
    x:指定矩阵;为ndarray-like(n≥2)
      #其中的元素可为复数;维数过多时,也会被拆分并分别进行变换
    s:指定各个轴(axes)的长/宽度;None/int sequence
      #处理方法同scipy.fft.fft()的<n>
    axes:指定沿哪个轴进行变换;int sequence
      #-1表示最后1个axis,-2表示倒数第2个

#实例:
>>> scipy.fft.fft2([[1,2],[2,3]],axes=[1,0])
array([[ 8.-0.j, -2.-0.j],
       [-2.-0.j,  0.-0.j]])
>>> scipy.fft.fft2([[1,2],[2,3]],axes=[0,1])
array([[ 8.-0.j, -2.-0.j],
       [-2.-0.j,  0.-0.j]])
>>> scipy.fft.fft2([[[1,2],[2,3]],[[3,4],[4,5]]],axes=[0,1])
array([[[10.-0.j, 14.-0.j],
        [-2.-0.j, -2.-0.j]],

       [[-4.-0.j, -4.-0.j],
        [ 0.-0.j,  0.-0.j]]])
>>> scipy.fft.fft2([[[1,2],[2,3]],[[3,4],[4,5]]],axes=[0,2])
array([[[10.-0.j, -2.-0.j],
        [14.-0.j, -2.-0.j]],

       [[-4.-0.j,  0.-0.j],
        [-4.-0.j,  0.-0.j]]])
>>> scipy.fft.fft2([[[1,2],[2,3]],[[3,4],[4,5]]],axes=[1,2,0])
array([[[24.-0.j, -4.-0.j],
        [-4.-0.j,  0.-0.j]],

       [[-8.-0.j,  0.-0.j],
        [ 0.-0.j,  0.-0.j]]])

######################################################################################################################

对实数组进行2维离散傅里叶变换:[<out>=]scipy.fft.rfft2(<x>[,s=None,axes=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:其他参数同scipy.fft.fft2()
    x:其中的元素只能是实数,其他同scipy.fft.fft2()

######################################################################################################################

[<out>=]scipy.fft.hfft2(<x>[,s=None,axes=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])

(3)n维:

进行n维离散傅里叶变换:[<out>=]scipy.fft.fftn(<x>[,s=None,axes=(-len(<s>),1-len(<s>)...,-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:同scipy.fft.fft2()

######################################################################################################################

对实数组进行n维快速傅里叶变换:[<out>=]scipy.fft.rfftn(<x>[,s=None,axes=(-len(<s>),1-len(<s>)...,-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:<x>同scipy.fft.rfft2(),其他参数同scipy.fft.fft2()

######################################################################################################################

[<out>=]scipy.fft.hfftn(<x>[,s=None,axes=None,norm=None,overwrite_x=False,workers=None,plan=None])

2.快速傅里叶逆变换
(1)1维:

进行1维离散傅里叶逆变换:[<out>=]scipy.fft.ifft(<x>[,s=None,axis=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:同scipy.fft.fft()

######################################################################################################################

对实数组进行1维离散傅里叶逆变换:[<out>=]scipy.fft.irfft(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:<x>同scipy.fft.rfft(),其他参数同scipy.fft.fft()

######################################################################################################################

计算具有Hermitian对称性(即实谱)的信号的逆FFT:[<out>=]scipy.fft.ihfft(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])

(2)2维:

进行2维离散傅里叶逆变换:[<out>=]scipy.fft.ifft2(<x>[,s=None,axes=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:同scipy.fft.fft2()

######################################################################################################################

对实数组进行2维离散傅里叶逆变换:[<out>=]scipy.fft.irfft2(<x>[,s=None,axes=(-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:<x>同scipy.fft.rfft2(),其他参数同scipy.fft.fft2()

######################################################################################################################

[<out>=]scipy.fft.ihfft2(<x>[,n=None,axis=-1,norm=None,overwrite_x=False,workers=None,plan=None])

(3)n维:

进行n维离散傅里叶逆变换:[<out>=]scipy.fft.ifftn(<x>[,s=None,axes=(-len(<s>),1-len(<s>)...,-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:同scipy.fft.fft2()

######################################################################################################################

对实数组进行n维离散傅里叶逆变换:[<out>=]scipy.fft.irfftn(<x>[,s=None,axes=(-len(<s>),1-len(<s>)...,-2,-1),norm=None,overwrite_x=False,workers=None,plan=None])
  #参数说明:<x>同scipy.fft.rfft2(),其他参数同scipy.fft.fft2()

######################################################################################################################

[<out>=]scipy.fft.ihfftn(<x>[,s=None,axes=None,norm=None,overwrite_x=False,workers=None,plan=None])

3.离散正/余弦变换
(1)离散余弦变换:

进行离散余弦变换:[<y>=]scipy.fft.dct(<x>[,type=2,n=None,axis=-1,norm=None,overwrite_x=False,workers=None])
  #参数说明:其他参数同scipy.fftpack.fft()
    x:指定输入;为array-like
    type:指定DCT类型;1/2/3/4

######################################################################################################################

进行多维离散余弦变换:[<y>=]scipy.fft.dctn(<x>[,type=2,s=None,axes=None,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dct()/scipy.fft.fft2()

######################################################################################################################

进行离散正弦变换:[<dst>=]scipy.fft.dst(<x>[,type=2,n=None,axis=-1,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dct()

######################################################################################################################

进行多维离散正弦变换:[<y>=]scipy.fft.dstn(<x>[,type=2,s=None,axes=None,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dctn()

(2)离散正/余弦逆变换:

进行逆离散余弦变换:[<idct>=]scipy.fft.idct(<x>[,type=2,n=None,axis=None,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dct()

######################################################################################################################

进行多维逆离散余弦变换:[<y>=]scipy.fft.idctn(<x>[,type=2,s=None,axes=None,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dctn()

######################################################################################################################

进行逆离散正弦变换:[<idst>=]scipy.fft.idst(<x>[,type=2,n=None,axis=-1,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dct()

######################################################################################################################

进行多维逆离散正弦变换:[<y>=]scipy.fft.idstn(<x>[,type=2,s=None,axes=None,norm=None,overwrite_x=False,workers=None])
  #参数说明:同scipy.fftpack.dctn()

4.其他
(1)辅助函数:

[<y>]=fftshift(<x>[,axes=None])
[<y>]=ifftshift(<x>[,axes=None])
[<f>]=fftfreq(<n>[,d=1.0])
[<f>]=rfftfreq(<n>[,d=1.0])
[<out>=]next_fast_len()
set_workers(<workers>)
[<w>=]get_workers()

(2)后台控制:

scipy.fft.set_backend(<backend>[,coerce=False,only=False])
scipy.fft.skip_backend(<backend>)
scipy.fft.set_global_backend(<backend>)
scipy.fft.register_backend(<backend>)

猜你喜欢

转载自blog.csdn.net/weixin_46131409/article/details/114129394
今日推荐