精华内容
下载资源
问答
  • 高斯拟合python
    2020-12-23 09:58:43

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类。因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm。一、导入sklearn算法包  Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明:http://scikit-learn.org/stable/auto_examples/index.html#support-vector-machines。  skleran中集成了许多算法,其导入包的方式如下所示,  逻辑回归:from sklearn.linear_model import LogisticRegression 朴素贝叶斯:from sklearn.naive_bayes import GaussianNB

    K-近邻:from sklearn.neighbors import KNeighborsClassifier  决策树:from sklearn.tree import DecisionTreeClassifier  支持向量机:from sklearn import svm二、sklearn中svc的使用(1)使用numpy中的loadtxt读入数据文件  loadtxt()的使用方法:    fname:文件路径。eg:C:/Dataset/iris.txt。  dtype:数据类型。eg:float、str等。  delimiter:分隔符。eg:‘,’。  converters:将数据列与转换函数进行映射的字典。eg:{1:fun},含义是将第2列对应转换函数进行转换。  usecols:选取数据的列。  以Iris兰花数据集为例子:  由于从UCI数据库中下载的Iris原始数据集的样子是这样的,前四列为特征列,第五列为类别列,分别有三种类别Iris-setosa, Iris-versicolor, Iris-virginica。       当使用numpy中的loadtxt函数导入该数据集时,假设数据类型dtype为浮点型,但是很明显第五列的数据类型并不是浮点型。  因此我们要额外做一个工作,即通过loadtxt()函数中的converters参数将第五列通过转换函数映射成浮点类型的数据。  首先,我们要写出一个转换函数:123def iris_type(s):it = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}

    return it[s]  接下来读入数据,converters={4: iris_type}中“4”指的是第5列:12path = u'D:/f盘/python/学习/iris.data' # 数据文件路径data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})  读入结果:  (2)将Iris分为训练集与测试集123x, y = np.split(data, (4,), axis=1)x = x[:, :2]x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)  1. split(数据,分割位置,轴=1(水平分割) or 0(垂直分割))。  2. x = x[:, :2]是为方便后期画图更直观,故只取了前两列特征值向量训练。  3. sklearn.model_selection.train_test_split随机划分训练集与测试集。train_test_split(train_data,train_target,test_size=数字, random_state=0)  参数解释:  train_data:所要划分的样本特征集  train_target:所要划分的样本结果  test_size:样本占比,如果是整数的话就是样本的数量  random_state:是随机数的种子。  随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。(3)训练svm分类器123clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')

    clf.fit(x_train, y_train.ravel())  kernel='linear'时,为线性核,C越大分类效果越好,但有可能会过拟合(defaul C=1)。   kernel='rbf'时(default),为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。  decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,  decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。(4)计算svc分类器的准确率123456print clf.score(x_train, y_train) # 精度y_hat = clf.predict(x_train)show_accuracy(y_hat, y_train, '训练集')print clf.score(x_test, y_test)y_hat = clf.predict(x_test)show_accuracy(y_hat, y_test, '测试集') 结果为:  如果想查看决策函数,可以通过decision_function()实现12print 'decision_function:n', clf.decision_function(x_train)print 'npredict:n', clf.predict(x_train) 结果为:  decision_function中每一列的值代表距离各类别的距离。(5)绘制图像  1.确定坐标轴范围,x,y轴分别表示两个特征12345x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] # 生成网格采样点grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点print 'grid_test = n', grid_testgrid_hat = clf.predict(grid_test) # 预测分类值grid_hat = grid_hat.reshape(x1.shape) # 使之与输入的形状相同  这里用到了mgrid()函数,该函数的作用这里简单介绍一下:   假设假设目标函数F(x,y)=x+y。x轴范围1~3,y轴范围4~6,当绘制图像时主要分四步进行:  【step1:x扩展】(朝右扩展): [1 1 1]

    [2 2 2]   [3 3 3]  【step2:y扩展】(朝下扩展):   [4 5 6]   [4 5 6]   [4 5 6]  【step3:定位(xi,yi)】:   [(1,4) (1,5) (1,6)]   [(2,4) (2,5) (2,6)]   [(3,4) (3,5) (3,6)]  【step4:将(xi,yi)代入F(x,y)=x+y】  因此这里x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]后的结果为:    再通过stack()函数,axis=1,生成测试点    2.指定默认字体12mpl.rcParams['font.sans-serif'] = [u'SimHei']mpl.rcParams['axes.unicode_minus'] = False  3.绘制123456789101112cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark) # 样本plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10) # 圈中测试集样本plt.xlabel(u'花萼长度', fontsize=13)plt.ylabel(u'花萼宽度', fontsize=13)plt.xlim(x1_min, x1_max)plt.ylim(x2_min, x2_max)plt.title(u'鸢尾花SVM二特征分类', fontsize=15)plt.grid()plt.show()   pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。   scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。   xlim指图的边界

    更多相关内容
  • 将图像中的星点进行二维高斯拟合,并输出结果和对比图像。
  • 多次拟合任意函数曲线,采用高斯曲线拟合算法求解拟合系数。
  • matlab对直方图高斯代码中科院 CEST MRI数据分析的代码和材料 此处包含的 Matlab 脚本 (CEST_Script.m)、函数和数据用于支持出版物“3.0T 前列腺多池化学交换饱和转移 MRI 的优化和可重复性”DOI:10.1002/jmri....
  • 此函数采用一维略带噪声的测试信号,并使用 fminsearch() 函数拟合 6 个高斯函数。 确定每个高斯的参数(幅度、峰值位置和宽度)。 6 个高斯信号应加在一起以给出原始测试信号的最佳估计值。 您可以指定任意数量的...
  • 此函数对数据分布进行高斯拟合。 它基于 MATLAB 内置函数 lscov。 实际上,它是分布日志空间中 lscov 的接口。 它还实现了一种自动计算权重数组的算法,以消除分布尾部噪声引入的偏差。
  • 目前的贡献是表面拟合的简单实现,以解决将 2D 高斯拟合到图像中观察对象的问题。 保持图像尺寸小,以免使拟合程序窒息。 Gauss2DRotFit 需要 2D 高斯的 2D 强度图像形式的输入。 它还接受定义下限、上限以及 7 个...
  • pthon 高斯拟合

    2016-11-29 11:08:33
    用python编写的单高斯和多高斯的代码
  • 基于BFGS的高斯拟合(C++工程)
  • 此程序实现二维数据拟合,使用的方法主要是高斯基函数
  • 此matlab代码利用求解线性方程组的方法,实现了高斯二维曲面拟合(附数学原理PDF文档)
  • 为了拟合光谱重叠峰及太赫兹时域曲线,设计了一种动态增加高斯函数的高斯拟合算法。首先,利用去噪光谱数据的一阶导数粗略搜寻各高斯峰的位置,再根据高斯峰位置初始化多高斯函数。然后,将光谱数据与多高斯函数的均方差...
  • 高斯拟合以找到恒星中心 在这个 matlab 代码中,我使用 cftool 来拟合每颗恒星的高斯曲线并找到它的中心。 一开始,我加载了一个包含多颗恒星的Eclipse图像并放大了特定的恒星。 我给 Matlab 星星的像素以计算背景,...
  • 基于ZEMAX多模高斯拟合,提出了一种基于Zemax 的多模高斯光束拟和方法,与理论的多模高斯光束进行了比较,并仿真分析了其传输情况。结果 表明,该方法拟和的多模高斯光束在远场情况下与理论符合较好,可以用于多种...
  • 2d_gaussian_fit 用于 2D 高斯拟合的 Python 代码,修改自 scipy 食谱。 简单但有用。 代码用于测量囊泡大小分布。
  • 它计算给定一组点的高斯拟合
  • 【血压】 最小二乘法高斯拟合 c语言实现 基础原理 最小二乘法&高斯函数变形 GuassFitTest.h #ifndef GUASSFITTEST_H #define GUASSFITTEST_H #include "ALG.h" /*该工程作为单片机最小二乘法高斯拟合的测试...

    【血压】 最小二乘法高斯拟合 c语言实现

    基础原理

    最小二乘法&高斯函数变形
    在这里插入图片描述
    在这里插入图片描述

    GuassFitTest.h

    #ifndef GUASSFITTEST_H
    #define GUASSFITTEST_H
    #include "ALG.h"
    /*该工程作为单片机最小二乘法高斯拟合的测试工程*/
    
    //变量声明放在c文件,函数声明放在h文件
    
    //高斯公式原理可参考:
    //https://blog.csdn.net/dingzj2000/article/details/103719368
    //数值计算方法教材 103-108页
    // fai0 = 1   fai1 = x   fai2 = x^2
    
    #endif
    
    
    

    GuassFitTest.c

    /**************************************
    2021 04 10
    作者:SZU guangjie2333
    功能:c语言实现最小二乘法高斯拟合
    *************************************/
    
    
    /*头文件引用*/
    #include "GuassFitTest.h"
    
    
    /*内部变量定义*/
    
    //拟合曲线的袖带压AD
    static int cuffPressAD[14] = { 2863,2717,2586,2461,2346,2220,2117,
    						2053,1950,1882,1807,1718,1643,1557 };
    //拟合曲线的脉搏波AD
    static int paluseAD[14] = { 5622,4007,3004,4229,8464,9874,12125,
    					10680,8704,6426,4256,4114,3555,3243 };
    //放气阶数
    int s_iPluseStepCnt = 14;
    
    
    /*主函数*/
    void main()
    {
    	B_parameter B;
    	Gaussian_parameter guassian;
    	float Z[14]; //高斯函数两边取对数,变形,得到一个二次函数。 Z[i] = ln y[i] = ln paluseAD[i]
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		cuffPressAD[i] =(int)(cuffPressAD[i] * 0.097 - 108);  //AD-真实值  线性转换公式
    		paluseAD[i] =(int)(paluseAD[i] / 16);                 //脉搏波AD放大了16倍
    		Z[i] = log(paluseAD[i]);
    		printf("cuffPressAD[%d] = %d \n  paluseAD[%d] = %d \n Z[%d] = %f \n",i, cuffPressAD[i], i,paluseAD[i],i,Z[i]);
    	}
    	//计算最小二乘法的B向量
    	B = GaussianElimination(Z, cuffPressAD,s_iPluseStepCnt);
    	//计算高斯曲线的参数
    	guassian = CalcGaussianParameter(B);
    	//0~250点进行高斯拟合
         GuassFit(guassian);
    
    	printf(" \n\n b0 = %f  b1 = %f  b2 = %f \n\n",B.b0,B.b1,B.b2);
    	printf(" \n\n a = %f  b = %f  c = %f \n\n",guassian.a, guassian.b, guassian.c);
    }
    
    
    
    

    ALG.h

    #ifndef ALG_H
    #define ALG_H
    
    /*该文件是算法函数的头文件*/
    
    #include "stdio.h"
    #include "stdlib.h"
    #include  "math.h"
    
    typedef struct
    {
    	float b0;
    	float b1;
    	float b2;
    }B_parameter;
    
    typedef struct
    {
    	float a;
    	float b;
    	float c;
    }Gaussian_parameter;
    
    typedef struct
    {
    	float value;
    	int index;
    }matrixData;
    
    //高斯列主元素消元法,返回b0,b1, b2
    B_parameter GaussianElimination(float* y, int* x, int s_iPluseStepCnt); 
    //计算高斯曲线参数
    Gaussian_parameter CalcGaussianParameter(B_parameter B);
    //0~250高斯拟合
    void GuassFit(Gaussian_parameter gaussian);
    #endif // !ALG
    
    
    

    ## ALG.c

    #include"ALG.h"
    
    /*该文件用于高斯拟合最小二乘法算法的c语言实现*/
    
    /*************************************
    * 宏定义区
    **************************************/
    #define ROW  3          //行
    #define LINE 4          //列
    
    
    /*************************************
    * 内部变量定义区
    **************************************/
    
    
    //权重(由于前面的点会由于刚刚关阀的影响,脉搏波波动大,故权重为0)
    w[14] = {0,0,0,1,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 };
    
    /*************************************
    * 内部函数定义区
    **************************************/
    
    //(fai0,fai0)的内积,返回1      求和
    static float xfun0(int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += 1 * w[i];
    	}
    
    	return sum;
    }
    
    //(fai0,fai1)的内积,返回x      求和
    static float xfun1(int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0;i < s_iPluseStepCnt ; i++)
    	{
    		sum += x[i] * w[i];
    	}
    
    	return sum;
    }
    
    //(fai0,fai2) || (fai1,fai1)的内积,返回x^2    求和
    static float xfun2(int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += x[i]*x[i] * w[i];
    	}
    
    	return sum;
    }
    
    
    //(fai1,fai2)的内积,返回x^3    求和
    static float xfun3(int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += x[i] * x[i] * x[i] * w[i];
    	}
    
    	return sum;
    }
    
    //(fai2,fai2)的内积,返回x^4    求和
    static float xfun4(int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += x[i] * x[i] * x[i] * x[i] * w[i];
    	}
    
    	return sum;
    }
    
    
    //(y,fai0)的内积,返回y*1    求和
    static float yfun0(float* y, int* x ,int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += y[i] * 1 * w[i];
    	}
    
    	return sum;
    }
    
    //(y,fai1)的内积,返回y*x    求和
    static float yfun1(float* y, int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += y[i] * x[i] * w[i];
    	}
    
    	return sum;
    }
    
    //(y,fai2)的内积,返回y*1    求和
    static float yfun2(float* y, int* x, int s_iPluseStepCnt)
    {
    	float sum = 0;
    	for (int i = 0; i < s_iPluseStepCnt; i++)
    	{
    		sum += y[i] * x[i] * x[i] * w[i];
    	}
    
    	return sum;
    }
    
    //选第k次交换的列最大值当主元,返回所在行
    static matrixData row_k_max(float matrix[ROW][LINE],int k)
    {
    	matrixData line[ROW] ;
    	matrixData Max;
    	//初始化
    	for (int i = 0; i < ROW; i++)
    	{
    		line[i].value = 0;
    		line[i].index = i;
    	}
    	//赋初值
    	for (int i = k; i < ROW; i++)
    	{
    		line[i].value = matrix[i][k];
    	}
    	//比较大小
    	Max.value = 0;
    	for (int i = k; i < ROW; i++)
    	{
    		if (fabs(line[i].value) > fabs(Max.value))
    		{
    			Max = line[i];
    		}
    	}
    	return Max;
    }
    
    //交换两行
    static void swapRow(float matrix[ROW][LINE],int k, int maxRowE)
    {
    	float temp = 0;
    	for (int i = 0; i < LINE; i++)
    	{
    		temp = matrix[k][i];
    		matrix[k][i] = matrix[maxRowE][i];
    		matrix[maxRowE][i] = temp;
    	}
    }
    
    static void printfMatrix(float matrix[ROW][LINE])
    {
    	for (int i = 0; i < ROW; i++)
    	{
    		for (int j = 0 ; j < LINE; j++)
    		{
    			printf(" %f ", matrix[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    
    /*
    外部函数调用
    */
    
    //高斯列主元素消元法,返回b0,b1, b2
    B_parameter GaussianElimination(float* y, int* x, int s_iPluseStepCnt)
    {
    	B_parameter B;  //最小二乘法的待求解向量
    	matrixData Max; //第k次交换,列的最大值和索引
    	float m;
    
    	//计算增广矩阵中的每个值
    	float matrix[ROW][LINE];
    	for (int i = 0; i < ROW; i++)
    	{
    		for (int j = 0; j < LINE; j++)
    		{
    			if (LINE-1 == j)
    			{
    				//计算最后一列即Z向量的值
    				switch (i)
    				{
    					case 0: matrix[i][j] = yfun0(y, x, s_iPluseStepCnt); break;
    					case 1: matrix[i][j] = yfun1(y, x, s_iPluseStepCnt); break;
    					case 2: matrix[i][j] = yfun2(y, x, s_iPluseStepCnt); break;
    					default: break;
    				}
    			}
    			else
    			{
    				//计算x矩阵的每个值
    				switch (i+j)
    				{
    					case 0: matrix[i][j] = xfun0(s_iPluseStepCnt); break;
    					case 1: matrix[i][j] = xfun1(x, s_iPluseStepCnt); break;
    					case 2: matrix[i][j] = xfun2(x, s_iPluseStepCnt); break;
    					case 3: matrix[i][j] = xfun3(x, s_iPluseStepCnt); break;
    					case 4: matrix[i][j] = xfun4(x, s_iPluseStepCnt); break;
    					default: break;
    				}
    			}
    
    		}
    	}
    
    	printf("打印初始的矩阵\n\n");
    	printfMatrix(matrix);
    
    	//进行列主元素消元
    	for (int i = 0; i < ROW-1; i++)   //i代表第i次交换
    	{
    		//选主元
    		Max = row_k_max(matrix,i);
    		//交换行
    		if (Max.index != i)
    		{
    			swapRow(matrix,i,Max.index);
    		}
    		//消主元
    		for (int j = i+1; j < ROW; j++)
    		{
    			m = matrix[j][i] / matrix[i][i];  //小除大,避免小值当分母
    			for (int k = i; k < LINE ; k++)
    			{
    				matrix[j][k] = matrix[j][k] - matrix[i][k] * m; //消元
    			}
    		}
    
    		printf("\n\n打印第%d次变化后的矩阵\n\n",i);
    		printfMatrix(matrix);
    
    	}
    
    	//计算最小二乘法的B列向量
    	B.b2 = matrix[ROW - 1][LINE - 1] / matrix[ROW - 1][LINE - 2];
    	B.b1 = (matrix[ROW - 2][LINE - 1] - B.b2 * matrix[ROW - 2][LINE - 2])/ matrix[ROW - 2][LINE - 3];
    	B.b0 = (matrix[ROW - 3][LINE - 1] - B.b2 * matrix[ROW - 3][LINE - 2] - B.b1 * matrix[ROW - 3][LINE - 3])/matrix[ROW - 3][LINE - 4];
    
    	return B;
    
    }
    
    //计算高斯拟合参数a,b,c
    Gaussian_parameter CalcGaussianParameter(B_parameter B)
    {
    	Gaussian_parameter gaussian;
    	gaussian.a = exp((B.b0 - (B.b1*B.b1/(4*B.b2))));
    	gaussian.b = -1 / B.b2;
    	gaussian.c = -B.b1 / (2 * B.b2);
    	return gaussian;
    }
    
    //从0到250 进行高斯拟合
    void GuassFit(Gaussian_parameter gaussian)
    {
    	float y[250];
    	for (int i = 0; i<250;i++)
    	{
    		y[i] = gaussian.a * exp(-(i-gaussian.c)* (i - gaussian.c) /gaussian.b);
    		printf("%f \n",y[i]);
    	}
    }
    
    
    展开全文
  • Gaussianfit2D_拟合星点_matlab二维高斯拟合_高斯拟合_二维高斯拟合
  • 高斯拟合 GFproject.exe 高斯拟合 高斯拟合
  • Gaussianfit2D_拟合星点_matlab二维高斯拟合_高斯拟合_二维高斯拟合_源码.zip
  • 然后程序尝试使用 MatLab 函数“lsqcurvefit”拟合数据,以找到二维高斯的位置、方向和宽度。 不输入参数执行“mainD2GaussFitRot.m”。 二维高斯函数由函数“D2GaussFunctionRot.m”和“D2GaussFunction.m”定义
  • 基于深度学习和二维高斯拟合的视网膜血管管径测量方法.pdf
  • Python 高斯拟合

    千次阅读 2020-12-23 20:35:53
    Python 高斯拟合 通常我们进行高斯拟合的办法是导入scipy的curve_fit 包,不过这需要自己手写一个高斯分布的函数表达式,不是很方便,astropy提供了一个写好的高斯拟合包 调包 from astropy.modeling import ...

    Python 高斯拟合

    通常我们进行高斯拟合的办法是导入scipy的curve_fit 包,不过这需要自己手写一个高斯分布的函数表达式,不是很方便,astropy提供了一个写好的高斯拟合包

    1. 调包

    from astropy.modeling import models, fitting
    import numpy as np
    import matplotlib.pyplot as plt
    
    1. 生成一个高斯的数据

    为了检验拟合结果的好坏,我们先生成一个μ=0.5,σ=0.2的高斯数据,并赋予他一个噪声

    def func_gaosi(x, miu, sigma):
        return 1/np.sqrt(2*np.pi)/sigma*np.exp(-(x-miu)**2/2/sigma**2)
      
    x = np.linspace(0, 1, 100)
    y = func_gaosi(x, 0.5, 0.2)
    y += np.random.normal(0., 0.02, x.shape)
    plt.plot(x, y)
    plt.xlabel('x')
    plt.ylabel('y')
    

    结果如下:在这里插入图片描述

    1. 使用astropy进行高斯拟合

    g_init = models.Gaussian1D(amplitude=1., mean=0, stddev=1.)
    fit_g = fitting.LevMarLSQFitter()
    g = fit_g(g_init, x, y)
    

    amplitude表示振幅的初值,振幅也就是高斯分布的系数,mean表示μ的初值,stddev表示σ的初值,g就是拟合结果,通过如下命令查看拟合的μ和σ

    print(g.mean.value, g.stddev.value)
    >>>>0.5007101792640887 0.20002191014593193
    

    可以看到是很精确的,而且也不需要自己写高斯分布的函数

    展开全文
  • polyfit-高斯拟合_polyfit_高斯拟合_多次项拟合曲线_高斯曲线拟合_曲线拟合.zip
  • polyfit-高斯拟合_polyfit_高斯拟合_多次项拟合曲线_高斯曲线拟合_曲线拟合_源码.zip
  • 在我用不同的方法来拟合高斯:曲线拟合、最小二乘法和高斯混合法sklearn.混合物. 曲线拟合我得到了一个相当好的拟合但如果你把它和我预期的结果相比,那还不够好。用最小二乘法我得到了“很适合”但是我的高斯函数是...

    我的问题的简短版本如下:我有一些数据(行星密度)的柱状图,看起来有3次窥视。现在我要在这个柱状图中加入3个高斯函数。在

    我期待着这个结果。在

    我用不同的方法来拟合高斯:曲线拟合、最小二乘法和高斯混合法sklearn.混合物. 曲线拟合我得到了一个相当好的拟合

    但如果你把它和我预期的结果相比,那还不够好。用最小二乘法我得到了“很适合”

    但是我的高斯函数是胡说八道的,使用高斯混合我什么也做不到,因为我不能真正熟练地使用我在问题示例中看到的代码。在

    现在我有三个问题:最重要的是:我怎样才能更适合我的第三个高斯函数?我已经尝试过调整p0的初始值,但是高斯函数变得更糟,或者根本找不到参数。

    我的最小二乘法怎么了?为什么它给了我这么奇怪的高斯数?有没有办法解决这个问题?我的猜测是不是因为最小二乘法尽一切努力使拟合和实际数据之间的误差最小化?

    我该怎么处理高斯混合呢?我找到了这个帖子

    但不能适应我的问题。在

    我真的很想了解如何恰当地配合,因为我以后要做很多次。问题是我对统计学不是很在行,只是开始用python编程。在

    以下是我的三种不同代码:

    曲线图import numpy as np

    import math

    import matplotlib.pyplot as plt

    from scipy.optimize import curve_fit

    hist, bin_edges = np.histogram(Density, bins=np.logspace(np.log10(MIN), np.log10(MAX), 32))

    bin_centres = (bin_edges[:-1] + bin_edges[1:])/2

    # Define model function to be used to fit to the data above:

    def triple_gaussian( x,*p ):

    (c1, mu1, sigma1, c2, mu2, sigma2, c3, mu3, sigma3) = p

    res = np.divide(1,x)*c1 * np.exp( - (np.log(x) - mu1)**2.0 / (2.0 * sigma1**2.0) ) \

    + np.divide(1,x)*c2 * np.exp( - (np.log(x) - mu2)**2.0 / (2.0 * sigma2**2.0) ) \

    + np.divide(1,x)*c3 * np.exp( - (np.log(x) - mu3)**2.0 / (2.0 * sigma3**2.0) )

    return res

    # p0 is the initial guess for the fitting coefficients (A, mu and sigma above)

    p0 = [60., 1, 1., 30., 1., 1.,10., 1., 1]

    coeff, var_matrix = curve_fit(triple_gaussian, bin_centres, hist, p0=p0)

    # Get the fitted curve

    hist_fit = triple_gaussian(bin_centres, *coeff)

    c1 =coeff[0]

    mu1 =coeff[1]

    sigma1 =coeff[2]

    c2 =coeff[3]

    mu2 =coeff[4]

    sigma2 =coeff[5]

    c3 =coeff[6]

    mu3 =coeff[7]

    sigma3 =coeff[8]

    x= bin_centres

    gauss1= np.divide(1,x)*c1 * np.exp( - (np.log(x) - mu1)**2.0 / (2.0 * sigma1**2.0) )

    gauss2= np.divide(1,x)*c2 * np.exp( - (np.log(x) - mu2)**2.0 / (2.0 * sigma2**2.0) )

    gauss3= np.divide(1,x)*c3 * np.exp( - (np.log(x) - mu3)**2.0 / (2.0 * sigma3**2.0) )

    plt.plot(x,gauss1, 'g',label='gauss1')

    plt.plot(x,gauss2, 'b', label='gauss2')

    plt.plot(x,gauss3, 'y', label='gauss3')

    plt.gca().set_xscale("log")

    plt.legend(loc='upper right')

    plt.ylim([0,70])

    plt.suptitle('Triple log Gaussian fit over all Data', fontsize=20)

    plt.xlabel('log(Density)')

    plt.ylabel('Number')

    plt.hist(Density, bins=np.logspace(np.log10(MIN), np.log10(MAX), 32), label='all Densities')

    plt.plot(bin_centres, hist, label='Test data')

    plt.plot(bin_centres, hist_fit, label='Fitted data')

    plt.gca().set_xscale("log")

    plt.ylim([0,70])

    plt.suptitle('triple log Gaussian fit using curve_fit', fontsize=20)

    plt.xlabel('log(Density)')

    plt.ylabel('Number')

    plt.legend(loc='upper right')

    plt.annotate(Text1, xy=(0.01, 0.95), xycoords='axes fraction')

    plt.annotate(Text2, xy=(0.01, 0.90), xycoords='axes fraction')

    plt.savefig('all Densities_gauss')

    plt.show()

    租赁广场

    它本身看起来不坏,但3高斯人是可怕的。看这里

    ^{pr2}$

    高斯混合

    就像我之前说的,我不太懂高斯混合。我不知道我是否必须像以前那样定义三重高斯,或者仅仅定义高斯就足够了,高斯混合会发现有一个三重高斯。

    我也不知道我在哪里必须使用哪些数据,因为当我使用数据箱和历史值时,“拟合曲线”只是相互连接的数据点。所以我想我用错了数据。在

    我不明白的部分是拟合GMM和手工构造函数作为高斯和。hist, bin_edges = np.histogram(Density, bins=np.logspace(np.log10(MIN), np.log10(MAX), 32))

    bin_centres = (bin_edges[:-1] + bin_edges[1:])/2

    plt.hist(Density, bins=np.logspace(np.log10(MIN), np.log10(MAX), 32), label='all Densities')

    plt.gca().set_xscale("log")

    plt.ylim([0,70])

    # Define simple gaussian

    def gauss_function(x, amp, x0, sigma):

    return np.divide(1,x)*amp * np.exp(-(np.log(x) - x0) ** 2. / (2. * sigma ** 2.))

    # My Data

    samples = Density

    # Fit GMM

    gmm = GaussianMixture(n_components=3, covariance_type="full", tol=0.00001)

    gmm = gmm.fit(X=np.expand_dims(samples, 1))

    gmm_x= bin_centres

    gmm_y= hist

    # Construct function manually as sum of gaussians

    gmm_y_sum = np.full_like(gmm_x, fill_value=0, dtype=np.float32)

    for m, c, w in zip(gmm.means_.ravel(), gmm.covariances_.ravel(), gmm.weights_.ravel()):

    gauss = gauss_function(x=gmm_x, amp=1, x0=m, sigma=np.sqrt(c))

    gmm_y_sum += gauss / np.trapz(gauss, gmm_x) *w

    # Make regular histogram

    fig, ax = plt.subplots(nrows=1, ncols=1, figsize=[8, 5])

    ax.hist(samples, bins=np.logspace(np.log10(MIN), np.log10(MAX), 32), label='all Densities')

    ax.plot(gmm_x, gmm_y, color="crimson", lw=4, label="GMM")

    ax.plot(gmm_x, gmm_y_sum, color="black", lw=4, label="Gauss_sum", linestyle="dashed")

    plt.gca().set_xscale("log")

    plt.ylim([0,70])

    # Annotate diagram

    ax.set_ylabel("Probability density")

    ax.set_xlabel("Arbitrary units")

    # Make legend

    plt.legend()

    plt.show()

    我希望至少有人能帮我解决我的一个问题。正如我之前所说的,如果有什么遗漏或者你需要更多的信息,请告诉我。在

    提前谢谢!在

    --编辑--

    Here是我的数据。在

    展开全文
  • 针对这些缺陷, 在改进Heaviside函数的基础上, 引入全局高斯拟合项, 并且对局部高斯拟合项和全局高斯拟合项的权重系数均采用自适应的方法进行调整, 得到基于局部和全局高斯拟合的主动轮廓分割模型。改进模型不仅能...
  • MATLAB工具箱大全-2D GaussFit高斯拟合工具箱
  • % This folder contains a collection of "fitting" functions. % (Some has demo options - the third section) % The GENERAL input to the functions should be samples of the distribution....
  • 窗口截取代码健壮的高斯拟合库 在存在异常值的情况下使用几何模型进行稳健高斯拟合的库。 基本上,许多机器学习方法基于并限于在参数方面可微的成本函数。 然而,一类由“顺序统计”支持的机器学习方法不需要为学习...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,751
精华内容 15,500
关键字:

高斯拟合

友情链接: webFtp.rar