如何在python项目中实现一个最小二乘法
这篇文章给大家介绍如何在python项目中实现一个最小二乘法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一、最小二乘法是什么
最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。
二、最小二乘法实现原理
通过最小化误差的平方和寻找数据的最佳函数匹配。
三、最小二乘法功能
利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
四、最小二乘法两种视角描述:“多线→一点”视角与“多点→一线”视角
已知多条近似交汇于同一个点的直线,想求解出一个近似交点:寻找到一个距离所有直线距离平方和最小的点,该点即最小二乘解;
已知多个近似分布于同一直线上的点,想拟合出一个直线方程:设该直线方程为y=kx+b,调整参数k和b,使得所有点到该直线的距离平方之和最小,设此时满足要求的k=k0,b=b0,则直线方程为y=k0x+b0。
实例扩展:
最小二乘法矩阵
#! /usr/bin/env python# -*- coding: utf-8 -*-import numpy as npdef calc_left_k_mat(k): """ 获得左侧k矩阵 :param k: :return: """ k_mat = [] for i in range(k + 1): now_line = [] for j in range(k + 1): now_line.append(j + i) k_mat.append(now_line) return k_matdef calc_right_k_mat(k): """ 计算右侧矩阵 :param k: :return: """ k_mat = [] for i in range(k + 1): k_mat.append([i, i + 1]) return k_matdef pow_k(x, k): """ 计算x列表中的k次方和 :param x: 点集合的x坐标 :param k: k值 :return: """ sum = 0 for i in x: sum += i ** k return sumdef get_left_mat_with_x(k_mat, k): """ 将 左侧k矩阵运算得到左侧新的矩阵 :param k_mat: :param k: :return: """ left_mat = [] for kl in k_mat: now_data = [] for k in kl: now_data.append(pow_k(x, k)) left_mat.append(now_data) return left_matdef get_right_mat_with(right_k_mat): """ 将 右侧k矩阵运算得到右侧新的矩阵 :param right_k_mat: :return: """ right_mat = [] for i in range(len(right_k_mat)): sum = 0 for xL, yL in zip(x, y): a = (xL ** right_k_mat[i][0]) * (yL ** right_k_mat[i][1]) sum += a right_mat.append(sum) return right_matdef fuse_mat(left, right): """ 融合两个矩阵 :param left: :param right: :return: """ new_mat = [] for i in range(len(left)): asd = np.append(left[i], right[i]) new_mat.append(list(asd)) return new_matif __name__ == '__main__': k = 3 x = [1, 2, 3] y = [1, 2, 3] # 计算原始左侧K矩阵 left_k_mat = calc_left_k_mat(k) print("原始左侧K矩阵") print(left_k_mat) # 计算原始右侧K矩阵 right_k_mat = calc_right_k_mat(k) print("原始右侧k矩阵") print(right_k_mat) # 计算左侧 k 矩阵 new_left_mat = get_left_mat_with_x(k_mat=left_k_mat, k=k) # 计算右侧 k 矩阵 new_right_mat = get_right_mat_with(right_k_mat=right_k_mat) print("计算后左侧K矩阵") print(new_left_mat) print("计算后右侧侧K矩阵") print(new_right_mat) print("-----" * 10) # 融合两个矩阵 左侧 矩阵每一行增加 右侧矩阵的对应行 new_all = fuse_mat(new_left_mat, new_right_mat) print("完整矩阵") print(new_all)
关于如何在python项目中实现一个最小二乘法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341