真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

svdjava代碼 SVD代碼

求SVD算法的C++實(shí)現(xiàn)代碼

/** C++ function for SVD

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到如皋網(wǎng)站設(shè)計(jì)與如皋網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋如皋地區(qū)。

函數(shù)原型:

bool svd(vectorvectordouble A, int K, std::vectorstd::vectordouble U, std::vectordouble S, std::vectorstd::vectordouble V);

其中

A是輸入矩陣,假設(shè)A的維數(shù)是m*n,那么本函數(shù)將A分解為U diag(S) V'

其中U是m*K的列正交的矩陣. V是n*K的列正交矩陣,S是K維向量。K由第二個(gè)參數(shù)指定。

U的第i列是A的第i大奇異值對(duì)應(yīng)的左歧義向量,S[i]=A的第 i大奇異值,V的第i列是A的第i大奇異值對(duì)應(yīng)的右歧義響亮.

K是需要分解的rank,0K=min(m,n)

本程序采用的是最基本冪迭代算法,在linux g++下編譯通過(guò)

**/

#include cmath

#include iostream

#include iomanip

#include cstdlib

#include cstring

#include fstream

#include vector

using namespace std;

const int MAX_ITER=100000;

const double eps=0.0000001;

double get_norm(double *x, int n){

double r=0;

for(int i=0;in;i++)

r+=x[i]*x[i];

return sqrt(r);

}

double normalize(double *x, int n){

double r=get_norm(x,n);

if(reps)

return 0;

for(int i=0;in;i++)

x[i]/=r;

return r;

}

inline double product(double*a, double *b,int n){

double r=0;

for(int i=0;in;i++)

r+=a[i]*b[i];

return r;

}

void orth(double *a, double *b, int n){//|a|=1

double r=product(a,b,n);

for(int i=0;in;i++)

b[i]-=r*a[i];

}

bool svd(vectorvectordouble A, int K, std::vectorstd::vectordouble U, std::vectordouble S, std::vectorstd::vectordouble V){

int M=A.size();

int N=A[0].size();

U.clear();

V.clear();

S.clear();

S.resize(K,0);

U.resize(K);

for(int i=0;iK;i++)

U[i].resize(M,0);

V.resize(K);

for(int i=0;iK;i++)

V[i].resize(N,0);

srand(time(0));

double *left_vector=new double[M];

double *next_left_vector=new double[M];

double *right_vector=new double[N];

double *next_right_vector=new double[N];

while(1){

for(int i=0;iM;i++)

?left_vector[i]= (float)rand() / RAND_MAX;

if(normalize(left_vector, M)eps)

?break;

}

int col=0;

for(int col=0;colK;col++){

double diff=1;

double r=-1;

for(int iter=0;diff=eps iterMAX_ITER;iter++){

?memset(next_left_vector,0,sizeof(double)*M);

?memset(next_right_vector,0,sizeof(double)*N);

?for(int i=0;iM;i++)

??? ?for(int j=0;jN;j++)

??? ??? ?next_right_vector[j]+=left_vector[i]*A[i][j];

?r=normalize(next_right_vector,N);

?if(reps) break;

?for(int i=0;icol;i++)

??? ?orth(V[i][0],next_right_vector,N);

?normalize(next_right_vector,N);

?for(int i=0;iM;i++)

??? ?for(int j=0;jN;j++)

??? ??? ?next_left_vector[i]+=next_right_vector[j]*A[i][j];

?r=normalize(next_left_vector,M);

?if(reps) break;

?for(int i=0;icol;i++)

??? ?orth(U[i][0],next_left_vector,M);

?normalize(next_left_vector,M);

?diff=0;

?for(int i=0;iM;i++){

??? ?double d=next_left_vector[i]-left_vector[i];

??? ?diff+=d*d;

?}

?memcpy(left_vector,next_left_vector,sizeof(double)*M);

?memcpy(right_vector,next_right_vector,sizeof(double)*N);

}

if(r=eps){

?S[col]=r;

?memcpy((char *)U[col][0],left_vector,sizeof(double)*M);

?memcpy((char *)V[col][0],right_vector,sizeof(double)*N);

}else

?break;

}

delete [] next_left_vector;

delete [] next_right_vector;

delete [] left_vector;

delete [] right_vector;

return true;

}

void print(vectorvectordouble A){

for(int i=0;iA.size();i++){

for(int j=0;jA[i].size();j++){

?coutsetprecision(3)A[i][j]' ';

}

coutendl;

}

}

int main(){

int m=10;

int n=5;

srand(time(0));

vectorvectordouble A;

A.resize(m);

for(int i=0;im;i++){

A[i].resize(n);

for(int j=0;jn;j++)

?A[i][j]=(float)rand()/RAND_MAX;

}

print(A);

coutendl;

vectorvectordouble U;

vectordouble S;

vectorvectordouble V;

svd(A,2,U,S,V);

cout"U="endl;

print(U);

coutendl;

cout"S="endl;

for(int i=0;iS.size();i++){

coutS[i]' ';

}

coutendl;

cout"V="endl;

print(V);

return 0;

}

如何將SVD算法用mapreduce實(shí)現(xiàn)

數(shù)據(jù)挖掘比賽算法

examples/src/main/java/org/apache/mahout/cf/taste/example/kddcup/track1/svd

推薦系統(tǒng)中利用SVD實(shí)現(xiàn)降維

core/src/main/java/org/apache/mahout/cf/taste/impl/recommender/svd

java 一個(gè)字符串12345678,怎樣每隔2個(gè)數(shù)字,用#連接起來(lái)

String?getStr(String?str)?{

if?(str.length()?=?2)?{

return?str;

}

return?str.substring(0,?2)?+?"#"?+?getStr(str.substring(2));

}

不要太簡(jiǎn)單

opencv中把矩陣進(jìn)行奇異值分解后怎樣重構(gòu)矩陣?

SVD相當(dāng)于:

C為mxn階矩陣,U為mxm階酉矩陣,E為mxn階實(shí)數(shù)對(duì)角矩陣,V為nxn階酉矩陣。

E矩陣對(duì)角線上的元素等于C的奇異值。

在OpenCV中可以用

solve(InputArray?src1, InputArray?src2, OutputArray?dst, intflags=DECOMP_SVD)

你是不是要用SVD求解最小二乘問(wèn)題?

線性方程組Cx=b,求其最小二乘解。

你可以先求出C的偽逆C+。

C+=V(E+)(UT)

(E+)是E的偽逆,將E主對(duì)角線上每個(gè)非零元素都求倒數(shù)之后再轉(zhuǎn)置得到.

(UT)是U的轉(zhuǎn)置。

最后計(jì)算出最小二乘解為:(C+)b


新聞名稱:svdjava代碼 SVD代碼
文章地址:http://weahome.cn/article/hpdodg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部