六.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>)