精华内容
下载资源
问答
  • 最小二乘方法原理及其应用——王惠文偏最小二乘方法原理及其应用——王惠文
  • 芯片缺失值估计的迭代局部自动加权最小二乘方法
  • 最小二乘方法.ppt

    2013-05-07 21:14:13
    最小二乘方法.ppt
  • 基于混合最小二乘方法联合反演中国大陆主要块体现今运动状态,独知行,张俊,采用中国大陆多年积累的GPS速度数据和地震矩张量数据,基于混合最小二乘方法联合反演中国大陆主要块体的欧拉运动参数。研究中,将
  • Levenberg-Marquardt非线性最小二乘方法在一个二维位置参数拟合问题上的应用
  • 数据拟合的最小二乘方法的实现一、实验任务二、编程环境三、实验原理与算法五、程序代码六、实验结果及分析七、心得体会 一、实验任务 给定离散样本点,采用最小二乘方法拟合样本数据,涉及的线性方程组请用高斯...

    一、实验任务

    给定离散样本点,采用最小二乘方法拟合样本数据,涉及的线性方程组请用高斯列主元消去法求解。可以教材P92习题3.22为操作内容。
    实验数据:
    xi 0 0.15 0.31 0.5 0.6 0.75
    yi 0.1 1.004 1.031 1.117 1.223 1.422
    表 2-1最小二乘法实验数据

    二、编程环境

    PC一台,C语言(DEV C++)。

    三、实验原理与算法

    在这里插入图片描述

    五、程序代码

    #include<stdio.h>
    #include<math.h>
    #define MAXSIZE 100//最多处理100组数据。
    int main()
    {
    	int i,j,k,m,n,N,mi;
    	float tmp,mx;
    	float X[MAXSIZE][MAXSIZE],Y[MAXSIZE],x[MAXSIZE],y[MAXSIZE],a[MAXSIZE];
    //	m=1;//(或者m=2…) 
        printf("请输入需拟合多项式的次数:\n"); 
        scanf("%d",&m);//输入拟合多项式的次数 
    	N=6;
    //	scanf("%d",&N);//输入给定的定点数 
        if(N>100)
        {
        	printf("请输入100以内的数\n");
    	}
    	else
    	{
    	for(i=0;i<N;i++) 
    	{
    //		scanf("%f,%f",&x[i],&y[i]);//键盘输入需要处理给定的坐标 (x,y); 
    		i=6;
        	x[0]=0,y[0]=1.0;
        	x[1]=0.15,y[1]=1.004;
        	x[2]=0.31,y[2]=1.031;
        	x[3]=0.5,y[3]=1.117;
        	x[4]=0.6,y[4]=1.223;
        	x[5]=0.75,y[5]=1.422;
    	}
    	for(i=0;i<=m;i++)//计算Sk 
    	{
    		for(j=i;j<=m;j++)
    		{
    			tmp=0;
    			for(k=0;k<N;k++)
    			   tmp=tmp+pow(x[k],(i+j));
    			X[i][j]=tmp;
    			X[j][i]=X[i][j];
    		}
    	}
    	for(i=0;i<=m;i++)//求Tk 
    	{
    		tmp=0;
    		for(k=0;k<N;k++)
    		  tmp=tmp+y[k]*pow(x[k],i);
    		Y[i]=tmp;
    	}
    	for(j=0;j<m;j++)//解线性方程组 
    	{
    		for(i=j+1,mi=j,mx=fabs(X[j][j]);i<=m;i++)//fabs函数:求浮点数x的绝对值 ,计算|x|, 当x不为负时返回x,否则返回-x  
    		   if(fabs(x[i][j])>mx)//选取第k列中绝对值最大的元素mx作为主元 
    		   {
    		   	 mi=i;
    		   	 mx=fabs(X[i][j]);
    		   }
    		if(j<mi)//换行:a(kj)<->aij(j=K+1,…,n)bk <->bi
    		{
    			tmp=Y[j];
    			Y[j]=Y[mi];
    			Y[mi]=tmp;
    			for(k=j;k<=m;k++)
    			{
    				tmp=X[j][k];
    				X[j][k]=X[mi][k];
    				X[mi][k]=tmp;				
    			}
    		}
    		for(i=j+1;i<=m;i++)//消元,将X[i][j]变换为上三角行列式 
    		{
    			tmp=-X[i][j]/X[j][j];
    			Y[i]+=Y[j]*tmp;
    			for(k=j;k<=m;k++)
    			  X[i][k]+=X[j][k]*tmp;
    		}
    	}
    	a[m]=Y[m]/X[m][m];
    	for(i=m-1;i>=0;i--)
    	{
    		a[i]=Y[i];
    		for(j=i+1;j<=m;j++)
    			a[i]-=X[i][j]*a[j];
    		    a[i]/=X[i][i];
    	}
    	printf("P(x)=%f",a[0]);
    	for(i=1;i<=m;i++)
    	   printf("+(%f)*x^%d",a[i],i);
    	printf("\n");}
    }
    
    

    六、实验结果及分析

    当拟合次数为1次的时,结果为:
    在这里插入图片描述
    当拟合次数为2次时:
    编译结果
    通过计算与分析,发现用最小二乘法,拟合上述数据的二次多项式逼近效果更好一些。

    七、心得体会

    1、通过编程熟悉最小二乘法算法,认真阅读教材并查询相关书籍[1]以及在网上浏览有关最小二乘法拟合数据的网页。进一步分析、总结最小二乘法拟合数据的通解,并得出相关算法。
    2、问题:在算法的Step 4解线性方程组时,调试数据为非正数时,结果都为0。解决方法:发现选定主元时没有考虑绝对值情况,当测试数据为非正数且有零元素存在时,选定的主元为0,结果与实际不相符,经过询问老师,可调用fabs函数解决该问题。
    3、问题:在用高斯列主消元的过程中,发现结果为:

    图 2-4 高斯列主消元出现的问题

    经分析发现a[m]没有归一化处理,解决方法:
    a[m]=Y[m]/X[m][m];
    for(i=m-1;i>=0;i–)
    {
    a[i]=Y[i];
    for(j=i+1;j<=m;j++)
    a[i]-=X[i][j]*a[j];
    a[i]/=X[i][i];
    }

    展开全文
  • 谐波频率估计的总体最小二乘方法ESPRIT-估计原信号的频率.
  • 线性回归-最小二乘方法 使用最小二乘的方法进行原始的计算方式编写 先把该导入的包全部导入了 # 首先需要导入对应的包 import pandas as pd # 数据处理 import numpy as np # 数据计算 import matplotlib.pyplot as ...

    线性回归-最小二乘方法

    使用最小二乘的方法进行原始的计算方式编写

    先把该导入的包全部导入了

    # 首先需要导入对应的包
    import pandas as pd  # 数据处理
    import numpy as np  # 数据计算
    import matplotlib.pyplot as plt  # 画图
    from sklearn.model_selection import train_test_split  # 专门用于数据分割的函数,分割训练集和测试集
    
    # 因为画图,所以先设置字符集防止中文无法显示的问题
    plt.rcParams['font.sans-serif'] = [u'simHei']
    plt.rcParams['axes.unicode_minus'] = False
    

    1 读取数据

    数据存储在文件中需要读取,现在使用的数据是用户的不同时间段家用电量的表格

    dir = './data/household_power_consumption_1000.txt'
    # 使用pandas进行数据导入
    # 使用的是;进行分隔,数据中可能存在大量对的混合类型,所以需要进行low_menorey设置
    data_source = pd.read_csv(dir, sep=';', low_memory=False)
    

    数据导入完成后查看下数据,大致分清需要哪些数据参数计算,由于是估计功率和电流之间的关系,所以取出数据的时候就需要取出对应的数据即可

    2 取出数据

    # 根据数据的内容而言,数据结构如下
    # 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
    # 寻找功率和电流之间的关系
    # 这里就需要对数据(可以看做是一个二维矩阵)进行切片选出需要的数据
    X = data_source.iloc[:, 2:4]  # 切片不包括最后一项
    Y = data_source.iloc[:, 5]
    

    pandas的数据结构中可以直接使用iloc进行切片,其切片的规则和numpy中的规则非常相似,因为数据本身是一个表格,这个表格有行有列,只有两个数据维度,那么每个样本存在多个数据,每个属性就是一列

    3 分割数据

    这里采用的是随机划分,将数据划分成为训练集:测试集=4:1的形式,使用随机抽样的方法,当然分割数据肯定不止是这一种方式,这里先使用这种随机划分的方式

    # 划分数据,test_size是按照比例,random_state是表示随机种子
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
    

    4 数据变化

    直接的pandas数据不好计算,转成numpy数据进行处理,之后使用最小二乘的时候对矩阵的求逆矩阵,求转置等等,方便计算

    # 建立两个训练数据的关系
    x_train = np.mat(X_train)
    y_train = np.mat(Y_train).reshape(-1,1) # 因为y实际上搞出来不是一个列向量,这里进行转一把
    

    这里有个坑,如果本身的pandas就是一列的话这里直接转回造成数据的矩阵型状无法参与后面的计算,所以这里需要转变一下

    5 计算出系数矩阵

    theta的求解利用最小二乘的方式,根据理论,中间的计算推导步骤很麻烦,要用到矩阵求导,大量的矩阵变化,好在我们直接有最后的公式
    Θ=(XTX)1XTY \Theta = (X^T X)^{-1} X^T Y
    这里已经有X和Y了,直接带进去计算

    theta = (x_train.T * x_train).I * x_train.T * y_train
    

    参数矩阵就已经得到

    6 利用参数矩阵计算预测结果

    参数矩阵已经得到后,带入原来的y=kx+b这种线性方程直接可以计算出预测值,而测试集数据需要用x_test去和参数矩阵计算,计算的结果与y_test进行比较

    # 再带入theta进行验证 使用测试集合获得预测的数值
    the_predict = np.mat(X_test) * theta
    

    7 画出对比图

    为了直观的看到整个图,这里直接画出图,但是画图需要注意的是x轴的取值,因为数据本身是对比测试值和预测值的关系,那么这两个的样本都是一一对应的,将样本取值当做x轴显然不现实,每个样本本身就具有多个属性,因此,这里使用个数来当做x轴取值

    # 接下来画图
    # 创建图布
    fig = plt.figure()
    # 设置标题
    plt.title('功率和电流的预测与实际对比图')
    # 设置x轴和y轴
    # 这里因为数据样品是离散的随机取样,所以x轴定为点的序号,比如第一个点第二个点
    x = np.arange(len(X_test)) # 总共的样本个数
    plt.plot(x, Y_test, 'r-',label='真实值',) # 红色的为真实值
    plt.plot(x, the_predict, 'g-',label='预测值',) # 绿色的为预测值
    plt.legend(loc = 'lower right') # 设置图例显示的位置
    plt.show()
    

    以上是最原始的最小二乘法,中间的模型是通过自己计算的到的结论,但是我们的前辈们早就已经计算好了对应的theta公式,直接用就可以了,但是这里还存在特例,就是X转置乘以X如果不是正定矩阵,则还不能这么计算

    使用模型导包的方式进行预测

    下面是另外的方式进行计算用电的功率和时间之间的关系

    在实际项目中,线性回归模型实际上已经是封装好的模型

    依然开始各种导入

    # coding=gbk
    # 因为里面存在中文,所以这里直接添加后就不报错了
    # 导入对应的库
    import numpy as np # 数据计算
    import matplotlib.pyplot as plt # 画图
    import pandas as pd # 数据处理
    from sklearn.linear_model import LinearRegression # 线性回归模型
    from sklearn.model_selection import train_test_split  # 构建数据分割器
    from sklearn.preprocessing import StandardScaler # 归一化数据的模型
    # 配置对应的中文显示问题
    plt.rcParams['font.sans-serif'] = [u'simHei']
    plt.rcParams['axes.unicode_minus'] = False
    

    这次因为里面注释写的多,不知道哪里有问题,反正不加第一个就报错,既然网上查了说加上就不拨错,亲测有效,所以没有为什么,加上就好了

    1 导入数据

    # 导入文件
    data = pd.read_csv('./data/household_power_consumption_1000.txt', sep=';', low_memory=False)
    

    2 截取需要的数据

    这里考虑的是时间和功率之间的关系,但是时间本身是一个字符串,在数据中存在两列用来记录时间

    这里需要将这两列单独取出来

    data.iloc[:, :2]
    

    依然使用的是切片的方式

    取出来之后并不能直接参与计算,因为字符串是需要进行转换才能进行计算,时间有年月日时分秒六个单位组成,数据中确实也是记录下了这六个单位,因此需要进行对应的处理把时间分解出来,使用6个属性进行描述时间

    将字符串转变为时间的函数

    time.striptime(str, format)
    

    这里需要得到str,也就是时间字符串,原来的时间字符串是存储在表中的两列,虽然能够切片进行切出来,但是实际上还是一个具有很多行的列表,这里使用

    pandas_data.apply(function, axis=1, args, kwargs)
    

    这个函数的意义在于进行转换,把pandas数据传递到function函数中进行处理,axis=1表示已一行一行的传进去,很显然这里的function就是一个函数,但是这个函数不能直接在后面加上()传参调用,这里只能写函数名

    所以不管这个函数本身需要几个参数,这里默认的第一个参数就是pandas数据的一行,以列表的方式传进去,那么如果这个函数本身还需要其他参数的话就通过args和kwargs进行传入,这两个参数是留给function的,因为只写函数名没法指明需要的参数,所以这里留下了两个接口

    既然apply把时间对应的两列拆成一行一行的传进去,那么就应该由function这个函数来接收,传进去的是时间字符串列表,所以需要自定义函数处理

    def date_reduce(dt):
        import time
        dt = time.striptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')
        return(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
    

    这里得到传进来的列表后进行拆分,把列表转成可以用的时间字符串,之后使用格式化字符串对原时间字符串转义,返回的是一个时间对象

    前面说过需要将时间数据拆分成年月日时分秒六个属性,所以这里直接返回这六个属性对应的值

    apply函数非常漂亮的将返回的接收了这六个属性值,但是它依然不是正确的能够使用的数据各式,因此这里使用

    pd.Serires(data)
    

    使用pd的数据类型Serires直接强行将返回的数据转成Serires类,这就很像str()这种方式强行转成字符串一样

    因此整个时间的处理如果下

    X = data.iloc[:, :2].apply(lambda x: pd.Series(date_reduce(x)), axis=1)
    

    得到了可以用于计算的X样本数据

    下面再把需要的Y值取出来

    Y = data.iloc[:, 2]  # 就当做是numpy一样直接取
    

    3 使用拆分函数直接将数据集拆分称为训练集和测试集

    # 分成训练集和测试集
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
    

    但是这里只要查看一下就会发现这个数据根本不能使用,X中存在六个属性,而且使用方法进行查看

    print(X_train.describe())
    

    你会发现这六个属性中有三个属性的std(标准差)为0,还有两个标准差很大,标准差为0说明数据本身没有变动,那就意味着整个一列都是完全相同的,这样的数据在前面增加任何系数都没有意义,标准差很大的数据表明波动性太大,因此前面的系数确定就很不均衡,容易给一些属性过高的权重而使得某些属性根本就没有权重

    为了解决这些问题,必须引入归一化操作

    4 归一化数据

    归一化是利用模型将数据进行压缩到标准差为1的区间,这样使得每个有用的属性都把标准差压缩到1,大家权重相同,这样训练出来的模型可靠度要高一些

    ss = StandardScaler()
    

    直接导入标准化模型对象,此时整个模型还是空的,还没有给他数据进行训练,将训练数据扔进这个模型中,其训练出来的数据就是经过标准化以后的数据了,并且将针对这些数据的标准化计算方法封装在ss对象上

    这样做的好处在于如果后面训练出来的预测模型效果还不错,那么就把这个模型和预测模型都保存起来,以后来的新数据都会先进过ss进行标准化后再扔进预测模型进行计算

    归一化训练数据和测试数据

    X_train = ss.fit_transform(X_train)
    X_test = ss.transform(X_test)
    

    这里上面和下面不一样,这里包含fit的方法存在着训练的含义,单纯的transform表示你转变,上面已经fit一次表示已经训练好了x_train数据然后再_transform,表示再把训练数据转变成训练好的数据返回.

    下面的X_test的意思就是直接对x_test进行转变返回,这里不能再训练,因为一旦再训练就会给覆盖原来的训练模型ss,那么X_test与X_train又不是完全相同,这就会回使得获得X_train数据时候的ss模型与获得X_test数据的ss模型不载相同,后面一定会存在误差.所以这里训练过的模型就不再训练了

    5 使用最小二乘进行计算theta值

    这里当然可以对数据进行numpy转变,使用我们的推导结论公式带入直接计算.这样做没有任何问题

    但是这里我们使用别人已经写好的模型

    model_train = LinearRegression(fit_intercept=True)  # 创建模型对象
    

    同ss一样,这个只是创建了模型对象,还没有进行训练

    model_train.fit(X_train, Y_train)
    

    带入数据进行训练,这里只有fit没有后面的transform,表示这里只是把数据扔进去进行模型训练,不需要返回值,我们需要的是模型,执行完这一步之后模型就已经训练完成了,theta什么的已经集成到model_train这个对象身上了,后面只需要调用这个对象就行了

    Y_predict = model_train.predict(X_test)
    

    使用这个模型直接把测试数据扔进去进行计算,并把计算后的值反回出来,因为这里扔进去的是测试数据,所以计算结果就是预测值,看吧这里别人直接就算好了

    现在我们手里面有了预测数据和测试数据的真实值,我们也不知道准不准确,不要惊慌,别人封装好的功能在model_train上面也有

    # 查看模型的r方 也叫做准确率
    print(f'训练样本的R**2(准确率):{model_train.score(X_train,Y_train)}')
    print(f'测试样本的R**2(准确率):{model_train.score(X_test,Y_test)}')
    
    print(f'模型参数θ:{model_train.coef_}')  # coef_可以直接获取到训练后的参数
    print(f'模型截距:{model_train.intercept_}')  # 线性回归y=kx+b的b就是截距
    

    直接可以查看准确率,当然这个模型训练的不咋样,准确率只有0.22.这不是重点,重点是这里直接可以通过模型.score(输入,输出)进行查询看看模型到底效果如何,同时还可以看到参数和截距

    y=kx+b

    k找到了,b找到了,还有模型的正确率,基本上这次建模就已经完成了

    6 画图

    当然如果想更直观的看到模型效果如何,可以直接把他们画图画出来

    fig = plt.figure()
    # 定义x轴
    x = np.arange(len(X_test))
    plt.plot(x, Y_test, 'r-', label='真实值')
    plt.plot(x, Y_predict, 'g-', label='预测值')
    plt.legend(loc='upper left')
    plt.title('以时间的自变量预测功率与时间的关系模型')
    plt.show()
    

    7 模型保存

    模型已经训练完成,如果效果还不错的话则需要把模型保存起来方便以后有了新的数据直接调用这个模型进行预测

    这里就需要想清楚需要保存哪些东西,首先ss肯定要存,你来的新数据难道就不归一化么?不归一化的话带进去的值就不满足预测模型需要的值,所以ss模型一定要存

    用脚指头想也应该想到需要存预测模型,费了半天劲就是为了搞到预测模型,不存它存谁

    from sklearn.externals import joblib
    
    joblib.dump(ss, './standard_to_lr_data_model.model')  # ss = StandardScaler() 标准化类:已经训练过的
    joblib.dump(model_train, './lr_predict_model.model')  # 就是导入的训练对象model_train = LinearRegression(fit_intercept=True):已经训练过的
    

    最后给总代码

    # coding=gbk
    # 因为里面存在中文,所以这里直接添加后就不报错了
    # 导入对应的库
    import numpy as np # 数据计算
    import matplotlib.pyplot as plt # 画图
    import pandas as pd # 数据处理
    from sklearn.linear_model import LinearRegression # 线性回归模型
    from sklearn.model_selection import train_test_split  # 构建数据分割器
    from sklearn.preprocessing import StandardScaler # 归一化数据的模型
    
    
    def date_reduce(dt):
        # 传进来的是两列数据,这两列数据是时间,实际是一个列表两个元素,用空格拼接称为字符串
        import time
        t = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')
        # 解析了数据之后进行返回时间元组
        return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
    
    
    # 配置对应的中文显示问题
    plt.rcParams['font.sans-serif'] = [u'simHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 导入文件
    data = pd.read_csv('./data/household_power_consumption_1000.txt', sep=';', low_memory=False)
    # 因为需要处理时间这个变量,其对应的是前两列做对应的变化
    X = data.iloc[:, :2].apply(lambda x: pd.Series(date_reduce(x)), axis=1)
    # 值得一提的是apply函数的使用,apply函数的参数,第一个参数是一个函数,这个参数是需要传递一个函数,可以是一个隐函数,这里如果不是隐函数则传递的函数自动的会根据后面参数的决定传递的对象,第二个参数是axis,表示轴,如果为1,则表示一行一行的传进去,那么谁调用就传递谁,后面的args和kwargs都是设定传递给第一个参数的,因为第一个参数是写函数名,写函数名没有办法直接执行,所以设计args和kwargs进行传参
    # pd.Series()是将里面的内容转变成为Series数据类型
    
    # 处理好时间后继续获取对应的Y
    Y = data.iloc[:, 2]  # 就当做是numpy一样直接取
    # 分成训练集和测试集
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
    # print(X_train.describe())
    # 查询的里面存在一个std,这个是标准差,平方后就是方差,查询后发现里面存在std为0的数据,标准差为0,表示数据根本就没有发送变化
    # std大了也表示波动很大,对于方差大的,需要规范化到0-1之间,最好将所有的数据都归一化到0-1之间,这样才不会导致造成参数非常大
    
    # 标准化数据
    ss = StandardScaler()  # 创建标准化对象,使用标准差为1的
    # print(X_train)
    X_train = ss.fit_transform(X_train)  # 转变为了可以训练用的数据
    # print(X_train)
    # 写出对应的测试数据
    X_test = ss.transform(X_test)  # 妈蛋,感觉跟fit_transform没有啥子区别
    # print(X_test)
    
    # 使用DataFrame将数据处理称为列表形式
    # print(X_train.describe()) # 这里会报错,说的是numpy.ndarray没有对应的属性
    # 这就是说明X_train通过StandardScaler的fit_transform之后称为了numpy数组对象
    
    # print(pd.DataFrame(X_train).describe())
    
    # print(data.info())
    
    # 直接训练模型
    model_train = LinearRegression(fit_intercept=True)  # 创建模型对象
    # 训练模型
    model_train.fit(X_train, Y_train)
    # 获得预测值
    Y_predict = model_train.predict(X_test)
    
    # 查看模型的r方 也叫做准确率
    print(f'训练样本的R**2(准确率):{model_train.score(X_train,Y_train)}')
    print(f'测试样本的R**2(准确率):{model_train.score(X_test,Y_test)}')
    
    # 预测值减去实际值的平方后再求均值 就是均方差
    mse = np.average((Y_predict - Y_test) ** 2)
    # 如果再开根号 就是标准差
    rmse = np.sqrt(mse)
    
    print(f'模型参数θ:{model_train.coef_}')  # coef_可以直接获取到训练后的参数
    print(f'模型截距:{model_train.intercept_}')  # 线性回归y=kx+b的b就是截距
    
    # 两个模型实际上已经完成了,现在可以进行画图操作
    fig = plt.figure()
    # 定义x轴
    x = np.arange(len(X_test))
    plt.plot(x, Y_test, 'r-', label='真实值')
    plt.plot(x, Y_predict, 'g-', label='预测值')
    plt.legend(loc='upper left')
    plt.title('以时间的自变量预测功率与时间的关系模型')
    plt.show()
    
    # 到这里为止,已经训练好了两个模型
    # 1 标准化模型,这个模型是针对数据进行归一化的模型,保存它的意义在于如果我们最后的模型成功了,那么新的数据进来后也需要执行归一化,这就要求每次归一化的模型必须使用的一样,否则带入计算模型中则无法得到预期的值
    # 2 计算模型,这个模型就是我们的线性回归模型,这个模型里面存放着针对归一化之后的数据计算操作的封装
    # 使用固定的库进行保存模型
    from sklearn.externals import joblib
    
    joblib.dump(ss, './standard_to_lr_data_model.model')  # ss = StandardScaler() 标准化类:已经训练过的
    joblib.dump(model_train, './lr_predict_model.model')  # 就是导入的训练对象model_train = LinearRegression(fit_intercept=True):已经训练过的
    
    
    展开全文
  • 基于多次最小二乘方法的方位-多普勒频差联合无源定位方法,杨斌,李立萍,本文提出了一种方位-多普勒频差(DOA-FDOA)联合定位新算法,该算法借助目标航迹约束条件,通过多次应用最小二乘准则,充分利用多普
  • 谐波频率估计的总体最小二乘方法TLS-ESPRIT,是ESPRIT的改进方法。
  • 最小二乘方法在描述子匹配输出的点对质量很好,理想情况下是图像没有噪声污染与像素迁移与光线恒定,但是实际情况下图像特别容易受到光线、噪声导致像素迁移,从而产生额外的多余描述子匹配,这些点对可以分为...

    参考链接:https://blog.csdn.net/wsp_1138886114/article/details/90578810

    一般的最小二乘

    最小二乘方法在描述子匹配输出的点对质量很好,理想情况下是图像没有噪声污染与像素迁移与光线恒定,但是实际情况下图像特别容易受到光线、噪声导致像素迁移,从而产生额外的多余描述子匹配,这些点对可以分为outlier跟inlier两类。

    一般的RANSAC

    RANSAC(Random Sample Consensus)可以很好的过滤掉outlier点对,使用合法的点对得到最终的变换矩阵H,基本思想是,它会从给定的数据中随机选取一部分进行模型参数计算,然后使用全部点对进行计算结果评价,不断迭代,直到选取的数据计算出来的错误是最小,比如低于0.5%即可。
    注意有时候RANSAC方法不会收敛,导致图像对齐或者配准失败,原因在于RANSAC是一种全随机的数据选取方式,完全没有考虑到数据质量不同。

    算法流程步骤如下:
    1 选择求解模型要求的最少要求的随机点对
    2 根据选择随机点对求解/拟合模型得到参数
    3 根据模型参数,对所有点对做评估,分为outlier跟inlier
    4 如果所有inlier的数目超过预定义的阈值,则使用所有inlier重新评估模型参数,停止迭代
    5 如果不符合条件则继续1~4循环。

    RANSAC算法的改进PROSAC算法

    PROSAC(Progressive Sampling Consensus)(RANSAC算法的改进算法)即渐近样本一致性,该方法采用半随机方法,对所有点对进行质量评价计算Q值,然后根据Q值降序排列,每次只在高质量点对中经验模型假设与验证,这样就大大降低了计算量,在RANSAC无法收敛的情况下,PROSAC依然可以取得良好的结果。OpenCV中的RHO方法就是基于PROSAC估算。

    最小二乘法的改进LMEDS

    LMEDS最小中值方法拟合,该方法可以看成是最小二乘法的改进,原因在于计算机视觉的输入数据是图像,一般都是各自噪声,这种情况下最小二乘往往无法正确拟合数据,所以采用最小中值方法可以更好实现拟合,排除outlier数据。但是它是对高斯噪声敏感算法

    它的最主要步骤描述如下:
    1 随机选取很多个子集从整个数据集中
    2 根据各个子集数据计算参数模型
    3 使用计算出来的参数对整个数据集计算中值平方残差
    4 最终最小残差所对应的参数即为拟合参数。

    展开全文
  • 基于改进约束最小二乘方法的图像复原算法钱春强;王继成【期刊名称】《计算机技术与发展》【年(卷),期】2007(017)006【摘要】约束最小二乘方法(约束最小二乘方滤波器)在图像复原的应用过程中普遍只要求噪声方差和均值...

    基于改进约束最小二乘方法的图像复原算法

    钱春强

    ;

    王继成

    【期刊名称】

    《计算机技术与发展》

    【年

    (

    ),

    期】

    2007(017)006

    【摘要】

    约束最小二乘方法

    (

    约束最小二乘方滤波器

    )

    在图像复原的应用过程中

    普遍只要求噪声方差和均值的知识

    ,

    对处理的每一幅图像都能产生最优效果

    ,

    因而

    得到了广泛应用

    .

    文中提出的图像复原算法就是基于约束最小二乘方法的

    ,

    并对其

    进行了改进

    .

    通过实验证明

    ,

    用该改进的图像复原处理方法复原的图像比用维纳滤

    波方法复原的图像更加平滑

    ,

    复原图像的信噪比也更大

    .

    另一方面

    ,

    改进的约束最

    小二乘方法复原的图像比平滑约束最小平方法复原的图像具有更加突出的边缘

    ,

    而且同样具有更高的信噪比

    .

    适当应用该方法

    ,

    能够体现出维纳滤波和平滑约束最

    小平方滤波这两种基本的约束最小二乘方滤波相结合的效果优势

    .

    【总页数】

    4

    (9-11,14)

    【关键词】

    退化模型

    ;

    图像复原

    ;

    约束最小二乘

    ;

    信噪比

    【作者】

    钱春强

    ;

    王继成

    【作者单位】

    同济大学

    ,

    电子与信息工程学院

    ,

    上海

    ,200331;

    同济大学

    ,

    电子与信

    息工程学院

    ,

    上海

    ,200331

    【正文语种】

    中文

    【中图分类】

    TN911.73

    【相关文献】

    1.

    几种约束最小二乘方图像复原算法的比较研究

    [J],

    李永宁

    2.

    基于小波去噪的平滑约束最小二乘图像复原法

    [J],

    赵东杰

    ;

    周辉

    展开全文
  • 用一般的最小二乘方法和SVD-TLS方法估计观测数据的ARMA模型的AR参数,并估计正弦波的频率。
  • 为了在图像中确定椭圆目标精确的位置和边界,提出了一种基于非线性最小二乘的椭圆拟合方法。该方法在得到目标边界点的基础上,通过最小化拟合椭圆与边界点之间的欧氏距离,确定出由椭圆中心坐标、长半轴和短半轴长度...
  • 利用偏最小二乘回归方法PLSR在模型参数辨识中的优势,辨识出装煤效果模型。仿真结果表明该方法不但可以准确地建立适用于不同条件下的滚筒装煤效果评估模型,同时具有实验简单,次数少,模型预测能力强,模型参数物理意义...
  • 先放代码,有时间补内容 import numpy as ny import sympy as sy from guass_swap import gaussin ny.set_printoptions(suppress=True) def LeastSquares(X,Y,m): assert len(X)==len(Y) n=len(X) ...
  • 由于DVB-RCS网络长传播延迟以及高误码率的特点,会造成所承载TCP业务的性能下降。传统的分层协议设计方式已经不适合这种动态变化的网络特点。采用跨层协议设计方式优化TCP协议性能。跨层设计方式结合了传输层上TCP...
  • 线性拟合即给定一组输入样本,求一个M阶多项式 的参数向量,使得拟合误差最小。这个M阶多项式虽然是关于x的非线性(当时)函数,但是是关于待求参数向量的线性函数,所以叫“线性”拟合。而拟合误差根据具体应用可以...
  • 线性拟合即给定一组输入样本,求一个M阶多项式 的参数向量,使得拟合误差最小。这个M阶多项式虽然是关于x的非线性(当时)函数,但是是关于待求参数向量的线性函数,所以叫“线性”拟合。而拟合误差根据具体应用可以...
  • clc clear f=2.4e9; w=2*pi*f; v=3e8; lamda=v/f; d=0.5*lamda; %设置初始参数 doas=[90,40]*pi/180;%设置来波方向 k=length(doas); m=10; HC=[1,0]';%设置来波方向的绝对限制条件 HD=zeros(1,181)';...tao2...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,138
精华内容 1,255
关键字:

最小二乘方法