python中在實現一元線性回歸時會使用最小二乘法,那你知道最小二乘法是什么嗎。其實最小二乘法為分類回歸算法的基礎,從求解線性透視圖中的消失點,m元n次函數的擬合,包括后來學到的神經網絡,其思想歸根結底全都是最小二乘法。本文向大家介紹python中的最小二乘法。
一、最小二乘法是什么
最小二乘法Least Square Method,做為分類回歸算法的基礎,有著悠久的歷史(由馬里·勒讓德于1806年提出)。
二、最小二乘法實現原理
通過最小化誤差的平方和尋找數據的最佳函數匹配。
三、最小二乘法功能
利用最小二乘法可以簡便地求得未知的數據,并使得這些求得的數據與實際數據之間誤差的平方和為最小。
最小二乘法還可用于曲線擬合。其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。
四、最小二乘法兩種視角描述:“多線→一點”視角與“多點→一線”視角
1、已知多條近似交匯于同一個點的直線,想求解出一個近似交點:尋找到一個距離所有直線距離平方和最小的點,該點即最小二乘解;
2、已知多個近似分布于同一直線上的點,想擬合出一個直線方程:設該直線方程為y=kx+b,調整參數k和b,使得所有點到該直線的距離平方之和最小,設此時滿足要求的k=k0,b=b0,則直線方程為y=k0x+b0。
實例擴展:
最小二乘法矩陣
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#! /usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def 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_mat def calc_right_k_mat(k): """ 計算右側矩陣 :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): """ 將 左側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_mat def 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_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 ] # 計算原始左側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中最小二乘法詳細講解的文章就介紹到這了,更多相關python中最小二乘法如何理解內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.py.cn/jishu/jichu/24530.html