定义 l e ( i , j ) le(i, j) le(i,j)为 X i , X j X_i, X_j Xi,Xj之间的余弦相似度: l e ( i , j ) = X i ⋅ X j ∣ X i ∣ ∣ X j ∣ le(i, j) = \frac{X_i \cdot X_j}{|X_i||X_j|} le(i,j)=∣Xi∣∣Xj∣Xi⋅Xj 要求求新 Y ′ Y' Y′, Y i n e w = ∑ j = 1 n l e ( i , j ) × Y j Y_i^{new} = \sum^n_{j = 1}le(i, j) \times Y_j Yinew=∑j=1nle(i,j)×Yj。
发现暴力计算显然行不通,但是可以转化为矩阵运算,除以模长可以直接对矩阵每行做归一化运算,那么答案就是: X ′ X ′ T Y X'X'^TY X′X′TY X ′ X' X′为按行归一化之后的矩阵。
那么可以得到运算的过程: ( n × k ) × ( k × n ) × ( n × d ) (n\times k) \times (k \times n) \times(n \times d) (n×k)×(k×n)×(n×d)。
发现先做后两个矩阵之间乘法,复杂度 O ( n k d ) O(nkd) O(nkd)。那么直接计算即可。
Code#include
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
//#define int long long
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
double X[10010][100], XT[100][10010], Y[10010][100], ans1[100][100], ans2[10010][100];
inline void solve(){
int n, k, d; cin >> n >> k >> d;
double sum = 0;
for(int i = 1; i X[i][j];
for(int i = 1; i Y[i][j];
for(int i = 1; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?