前兩天被問乙個問題。有兩組向量
x 和
w,維度分別為
a 和
b,它們之間有線性對映關係。即滿足xt
a=wt
,其中a 為線性變換陣。給出兩組含有雜訊的資料,如何求出擬合度較好的陣
a。這實際上是乙個多元線性回歸問題,常用的方法是最小二乘法,確定使得方差最小的係數。
方差為 e(
a)=1
bn∑i
=1n∑
j=1b
(wij
−∑k=
1axi
kakj
)2求偏導忽略其係數 ∂e
(a)∂
akj=
∑i=1
nxik
(wij
−∑p=
1axi
papj
) 用梯度下降法,係數修改應該為 ak
j=ak
j+α∑
i=1n
xik(
wij−
∑p=1
axip
apj)
迭代至誤差收斂即可。注意當誤差上公升的時候,可能是因為迭代步長過大,需要減小步長。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int mod = 1000000007;
const
double eps = 1e-6;
const
int inf = 0x3f3f3f3f;
const ll inf = 100000000000000000ll;
const
int maxn = 100010;
const
int maxm = 300030;
double x[2][505][505];
double cx[505][505];
double c[505][505];
double e[505][505];
double theta;
double last;
double now;
int a,b,n;
void init(int op)}}
}double ex()
}return ret;
}void gradient()
for(int i = 0;i < a;i++)
}init(0);
last = ex();
int op = 1,cnt = 1;
printf("time %d step %.12f error = %f\n",cnt++,theta,last);
while(1)
x[op][i][j] = x[op^1][i][j]+2*tmp*theta;}}
init(op);
now = ex();
if(now > last)
printf("time %d step %.12f error = %f\n",cnt++,theta,now);
if(fabs(now-last)break;
last = now;
op ^= 1;
}for(int i = 0;i < a;i++)
}}void gen()
}int dd[6],bb[6];
int nn = 20;
printf("%d %d %d\n",nn,4,5);
for(int i = 0;i < 20;i++)
printf("\n");
for(int k = 0;k < 5;k++)
printf("%d ",bb[k]);
}printf("\n");
}}void calc()
while(1)
for(int j = 0;j < b;j++)
printf("%f%s",tot,j == b-1?"\n":" ");}}
}int main()
多元線性回歸
多元線性回歸的基本原理和基本計算過程與一元線性回歸相同,但由於自變數個數多,計算相當麻煩,一般在實際中應用時都要借助統計軟體。介紹多元線性回歸的一些基本問題。但由於各個自變數的單位可能不一樣,比如說乙個消費水平的關係式中,工資水平 受教育程度 職業 地區 家庭負擔等等因素都會影響到消費水平,而這些影...
多元線性回歸
from numpy import genfromtxt 用來讀取資料轉化為矩陣 from sklearn import linear model 含有回歸的模型 datapath r c users qaq desktop delivery dummy.csv 路徑 deliverydata ge...
多元線性回歸
比如有乙個住房 的資料集,可能會有多個不同的模型用於擬合,選擇之一像是這種二次模型 0 1x 2x2,因為直線並不能很好的擬合這些資料。但是現在如果用二次函式去考慮,可能會想到二次函式在最高點之後會下降,但是 並不會下降,並不合理,那我們可以用 0 1x 2x2 3x3這樣的三次模型。如果像這樣選擇...