包含高斯函数拟合python的词条

[译] 高斯混合模型 --- python教程

本文翻译自

成都创新互联服务项目包括柳江网站建设、柳江网站制作、柳江网页制作以及柳江网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,柳江网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到柳江省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

上一节中探讨的k-means聚类模型简单易懂,但其简单性导致其应用中存在实际挑战。具体而言,k-means的非概率特性及简单地计算点与类蔟中心的欧式距离来判定归属,会导致其在许多真实的场景中性能较差。本节,我们将探讨高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一个强有力的估计工具,而不仅仅是聚类。

我们将以一个标准的import开始

我们看下k-means的缺陷,思考下如何提高聚类模型。正如上一节所示,给定简单,易于分类的数据,k-means能找到合适的聚类结果。

举例而言,假设我们有些简单的数据点,k-means算法能以某种方式很快地将它们聚类,跟我们肉眼分辨的结果很接近:

从直观的角度来看,我可能期望聚类分配时,某些点比其他的更确定:举例而言,中间两个聚类之间似乎存在非常轻微的重叠,这样我们可能对这些数据点的分配没有完全的信心。不幸的是,k-means模型没有聚类分配的概率或不确定性的内在度量(尽管可能使用bootstrap 的方式来估计这种不确定性)。为此,我们必须考虑泛化这种模型。

k-means模型的一种理解思路是,它在每个类蔟的中心放置了一个圈(或者,更高维度超球面),其半径由聚类中最远的点确定。该半径充当训练集中聚类分配的一个硬截断:任何圈外的数据点不被视为该类的成员。我们可以使用以下函数可视化这个聚类模型:

观察k-means的一个重要发现,这些聚类模式必须是圆形的。k-means没有内置的方法来计算椭圆形或椭圆形的簇。因此,举例而言,假设我们将相同的数据点作变换,这种聚类分配方式最终变得混乱:

高斯混合模型(GMM)试图找到一个多维高斯概率分布的混合,以模拟任何输入数据集。在最简单的情况下,GMM可用于以与k-means相同的方式聚类。

但因为GMM包含概率模型,因此可以找到聚类分配的概率方式 - 在Scikit-Learn中,通过调用predict_proba方法实现。它将返回一个大小为[n_samples, n_clusters]的矩阵,用于衡量每个点属于给定类别的概率:

我们可以可视化这种不确定性,比如每个点的大小与预测的确定性成比例;如下图,我们可以看到正是群集之间边界处的点反映了群集分配的不确定性:

本质上说,高斯混合模型与k-means非常相似:它使用期望-最大化的方式,定性地执行以下操作:

有了这个,我们可以看看四成分的GMM为我们的初始数据提供了什么:

同样,我们可以使用GMM方法来拟合我们的拉伸数据集;允许full的协方差,该模型甚至可以适应非常椭圆形,伸展的聚类模式:

这清楚地表明GMM解决了以前遇到的k-means的两个主要实际问题。

如果看了之前拟合的细节,你将看到covariance_type选项在每个中都设置不同。该超参数控制每个类簇的形状的自由度;对于任意给定的问题,必须仔细设置。默认值为covariance_type =“diag”,这意味着可以独立设置沿每个维度的类蔟大小,并将得到的椭圆约束为与轴对齐。一个稍微简单和快速的模型是covariance_type =“spherical”,它约束了类簇的形状,使得所有维度都相等。尽管它并不完全等效,其产生的聚类将具有与k均值相似的特征。更复杂且计算量更大的模型(特别是随着维数的增长)是使用covariance_type =“full”,这允许将每个簇建模为具有任意方向的椭圆。

对于一个类蔟,下图我们可以看到这三个选项的可视化表示:

尽管GMM通常被归类为聚类算法,但从根本上说它是一种密度估算算法。也就是说,GMM适合某些数据的结果在技术上不是聚类模型,而是描述数据分布的生成概率模型。

例如,考虑一下Scikit-Learn的make_moons函数生成的一些数据:

如果我们尝试用视为聚类模型的双成分的GMM模拟数据,则结果不是特别有用:

但是如果我们使用更多成分的GMM模型,并忽视聚类的类别,我们会发现更接近输入数据的拟合:

这里,16个高斯分布的混合不是为了找到分离的数据簇,而是为了对输入数据的整体分布进行建模。这是分布的一个生成模型,这意味着GMM为我们提供了生成与我们的输入类似分布的新随机数据的方法。例如,以下是从这个16分量GMM拟合到我们原始数据的400个新点:

GMM非常方便,可以灵活地建模任意多维数据分布。

GMM是一种生成模型这一事实为我们提供了一种确定给定数据集的最佳组件数的自然方法。生成模型本质上是数据集的概率分布,因此我们可以简单地评估模型下数据的可能性,使用交叉验证来避免过度拟合。校正过度拟合的另一种方法是使用一些分析标准来调整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估计器实际上包含计算这两者的内置方法,因此在这种方法上操作非常容易。

让我们看看在moon数据集中,使用AIC和BIC函数确定GMM组件数量:

最佳的聚类数目是使得AIC或BIC最小化的值,具体取决于我们希望使用的近似值。 AIC告诉我们,我们上面选择的16个组件可能太多了:大约8-12个组件可能是更好的选择。与此类问题一样,BIC建议使用更简单的模型。

注意重点:这个组件数量的选择衡量GMM作为密度估算器的效果,而不是它作为聚类算法的效果。我鼓励您将GMM主要视为密度估算器,并且只有在简单数据集中保证时才将其用于聚类。

我们刚刚看到了一个使用GMM作为数据生成模型的简单示例,以便根据输入数据定义的分布创建新样本。在这里,我们将运行这个想法,并从我们以前使用过的标准数字语料库中生成新的手写数字。

首先,让我们使用Scikit-Learn的数据工具加载数字数据:

接下来让我们绘制前100个,以准确回忆我们正在看的内容:

我们有64个维度的近1,800位数字,我们可以在这些位置上构建GMM以产生更多。 GMM可能难以在如此高维空间中收敛,因此我们将从数据上的可逆维数减少算法开始。在这里,我们将使用一个简单的PCA,要求它保留99%的预测数据方差:

结果是41个维度,减少了近1/3,几乎没有信息丢失。根据这些预测数据,让我们使用AIC来计算我们应该使用的GMM组件的数量:

似乎大约110个components最小化了AIC;我们将使用这个模型。我们迅速将其与数据拟合并确保它已收敛合:

现在我们可以使用GMM作为生成模型在这个41维投影空间内绘制100个新点的样本:

最后,我们可以使用PCA对象的逆变换来构造新的数字:

大部分结果看起来像数据集中合理的数字!

考虑一下我们在这里做了什么:给定一个手写数字的样本,我们已经模拟了数据的分布,这样我们就可以从数据中生成全新的数字样本:这些是“手写数字”,不是单独的出现在原始数据集中,而是捕获混合模型建模的输入数据的一般特征。这种数字生成模型可以证明作为贝叶斯生成分类器的一个组成部分非常有用,我们将在下一节中看到。

什么是高斯拟合?

高斯拟合(Gaussian Fitting)即使用形如:

Gi(x)=Ai*exp((x-Bi)^2/Ci^2)

的高斯函数对数据点集进行函数逼近的拟合方法。

其实可以跟多项式拟合类比起来,不同的是多项式拟合是用幂函数系,

而高斯拟合是用高斯函数系。

使用高斯函数来进行拟合,优点在于计算积分十分简单快捷。这一点

在很多领域都有应用,特别是计算化学。著名的化学软件Gaussian98

就是建立在高斯基函数拟合的数学基础上的。

具体算法楼主可以去几大论坛上问问。现在没时间了。bbs.matwav.com

怎么用python表示出二维高斯分布函数,mu表示均值,sigma表示协方差矩阵,x表示数据点

clear 

close all

%%%%%%%%%%%%%%%%%%%%%%%%%生成实验数据集

rand('state',0)

sigma_matrix1=eye(2);

sigma_matrix2=50*eye(2);

u1=[0,0];

u2=[30,30];

m1=100;

m2=300;%样本数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1数据集

Y1=multivrandn(u1,m1,sigma_matrix1);

Y2=multivrandn(u2,m2,sigma_matrix2);

scatter(Y1(:,1),Y1(:,2),'bo')

hold on

scatter(Y2(:,1),Y2(:,2),'r*')

title('SM1数据集')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2数据集

u11=[0,0];

u22=[5,5];

u33=[10,10];

u44=[15,15];

m=600;

sigma_matrix3=2*eye(2);

Y11=multivrandn(u11,m,sigma_matrix3);

Y22=multivrandn(u22,m,sigma_matrix3);

Y33=multivrandn(u33,m,sigma_matrix3);

Y44=multivrandn(u44,m,sigma_matrix3);

figure(2)

scatter(Y11(:,1),Y11(:,2),'bo')

hold on

scatter(Y22(:,1),Y22(:,2),'r*')

scatter(Y33(:,1),Y33(:,2),'go')

scatter(Y44(:,1),Y44(:,2),'c*')

title('SM2数据集')

end

function Y = multivrandn(u,m,sigma_matrix)

%%生成指定均值和协方差矩阵的高斯数据

n=length(u);

c = chol(sigma_matrix);

X=randn(m,n);

Y=X*c+ones(m,1)*u;

end

不同方法拟合函数的特点

拟合是用高斯函数系。 使用高斯函数来进行拟合,优点在于计算积分十分简单快捷拟合函数:拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字,这就是拟合函数。

常用的拟合方法有如最小二乘曲线拟合法等,在MATLAB中也可以用polyfit 来拟合多项式。拟合以及插值还有逼近是数值分析的三大基础工具。

通俗意义上它们的区别在于:拟合是已知点列,从整体上靠近它们;插值是已知点列并且完全经过点列;逼近是已知曲线,或者点列,通过逼近使得构造的函数无限靠近它们

python怎样做高斯拟合

需要载入numpy和scipy库,若需要做可视化还需要matplotlib(附加dateutil, pytz, pyparsing, cycler, setuptools库)。不画图就只要前两个。

如果没有这些库的话去 下载对应版本,之后解压到 C:\Python27\Lib\site-packages。

import numpy as np  

import pylab as plt  

#import matplotlib.pyplot as plt  

from scipy.optimize import curve_fit  

from scipy import asarray as ar,exp  

x = ar(range(10))  

y = ar([0,1,2,3,4,5,4,3,2,1])  

def gaussian(x,*param):  

return param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4], 2.)))+param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.)))  

popt,pcov = curve_fit(gaussian,x,y,p0=[3,4,3,6,1,1])  

print popt  

print pcov  

plt.plot(x,y,'b+:',label='data')  

plt.plot(x,gaussian(x,*popt),'ro:',label='fit')  

plt.legend()  

plt.show()

GAN 拟合高斯分布数据Pytorch实现

GAN本身是一种生成式模型,所以在数据生成上用的是最普遍的,最常见的是图片生成,常用的有DCGAN WGAN,BEGAN。目前比较有意思的应用就是GAN用在图像风格迁移,图像降噪修复,图像超分辨率了,都有比较好的结果。目前也有研究者将GAN用在对抗性攻击上,具体就是训练GAN生成对抗文本,有针对或者无针对的欺骗分类器或者检测系统等等,但是目前没有见到很典范的文章。好吧,笔者有一个项目和对抗性攻击有关,所以要学习一下GAN。

GANs组成:生成器和判别器。结构如图1所示

针对问题: 给定一批样本,训练一个系统能够生成类似的新样本

核心思想:博弈论中的纳什均衡,

判别器D 的目的是判断数据来自生成器还是训练集,

生成器G 的目的是学习真实数据的分布,使得生成的数据更接近真实数据,

两者不断学习优化最后得到纳什平衡点。

D( x) 表示真实数据的概率分布,

G( z) 表示输入噪声z 产生的生成数据的概率分布

训练目标:G( Z)在判别器上的分布D( G( Z) ) 更接近真实数据在判别器上的分布D( X)

接下来就来实现我们的例子把,目标是把标准正态分布的数据,通过训练的GAN网络之后,得到的数据x_fake能尽量拟合均值为3方差为1的高斯分布N(3,1)的数据。

可以看出生成器其实就是简单的全连接网络,当然CNN,RNN等网络都是适合GAN的,根据需要选择。

可以看出判别器其实也是简单的全连接网络,当然CNN,RNN等网络都是适合GAN的,根据需要选择。

在这里想说的是对于判别器和生成器的训练是分开的,训练判别器的时候固定生成器,训练生成器的时候固定判别器,如此循环。本例子中先训练三次判别器,接着训练一次生成器。

为了便于理解具体训练过程,图2 、图3展示了判别器和生成器训练时的数据流向,具体就不展开了,参考注释。

画图函数敬上

然后调用main()函数就好了

红色是目标分布,蓝色是生成分布,还是有一定效果的额。

感受到是在调参了,请教我如何学习生成(xie)对抗(lun)网络(wen)。


文章标题:包含高斯函数拟合python的词条
文章源于:http://hbruida.cn/article/docsdds.html