您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何在python項目中實現(xiàn)一個最小二乘法,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、最小二乘法是什么
最小二乘法Least Square Method,做為分類回歸算法的基礎,有著悠久的歷史(由馬里·勒讓德于1806年提出)。
通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。
利用最小二乘法可以簡便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實際數(shù)據(jù)之間誤差的平方和為最小。
最小二乘法還可用于曲線擬合。其他一些優(yōu)化問題也可通過最小化能量或最大化熵用最小二乘法來表達。
1、已知多條近似交匯于同一個點的直線,想求解出一個近似交點:尋找到一個距離所有直線距離平方和最小的點,該點即最小二乘解;
2、已知多個近似分布于同一直線上的點,想擬合出一個直線方程:設該直線方程為y=kx+b,調(diào)整參數(shù)k和b,使得所有點到該直線的距離平方之和最小,設此時滿足要求的k=k0,b=b0,則直線方程為y=k0x+b0。
實例擴展:
最小二乘法矩陣
#! /usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def calc_left_k_mat(k): """ 獲得左側(cè)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_mat def calc_right_k_mat(k): """ 計算右側(cè)矩陣 :param k: :return: """ k_mat = [] for i in range(k + 1): k_mat.append([i, i + 1]) return k_mat def pow_k(x, k): """ 計算x列表中的k次方和 :param x: 點集合的x坐標 :param k: k值 :return: """ sum = 0 for i in x: sum += i ** k return sum def get_left_mat_with_x(k_mat, k): """ 將 左側(cè)k矩陣運算得到左側(cè)新的矩陣 :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_mat def get_right_mat_with(right_k_mat): """ 將 右側(cè)k矩陣運算得到右側(cè)新的矩陣 :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_mat def 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_mat if __name__ == '__main__': k = 3 x = [1, 2, 3] y = [1, 2, 3] # 計算原始左側(cè)K矩陣 left_k_mat = calc_left_k_mat(k) print("原始左側(cè)K矩陣") print(left_k_mat) # 計算原始右側(cè)K矩陣 right_k_mat = calc_right_k_mat(k) print("原始右側(cè)k矩陣") print(right_k_mat) # 計算左側(cè) k 矩陣 new_left_mat = get_left_mat_with_x(k_mat=left_k_mat, k=k) # 計算右側(cè) k 矩陣 new_right_mat = get_right_mat_with(right_k_mat=right_k_mat) print("計算后左側(cè)K矩陣") print(new_left_mat) print("計算后右側(cè)側(cè)K矩陣") print(new_right_mat) print("-----" * 10) # 融合兩個矩陣 左側(cè) 矩陣每一行增加 右側(cè)矩陣的對應行 new_all = fuse_mat(new_left_mat, new_right_mat) print("完整矩陣") print(new_all)
關于如何在python項目中實現(xiàn)一個最小二乘法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。