大数据推荐系统存在逻辑bug无法得到预期结果
求解答
#include<stdio.h>
#include<math.h>
double x[942][1412]={0};
double score[942][1412];
int top[942][1412];
double list[942][1412];
int result[926][11]={0};
double sim[942][942];
double product(double a[],double b[],int n){
double result=0;
for(int i=0;i<n;i++){
result+=a[i]*b[i];
}
return result;
}
double length(double a[],int n){
double result=0;
for(int i=0;i<n;i++){
result+=a[i]*a[i];
}
return sqrt(result);
}
double similar(double a[],double b[],int n){
return product(a,b,n)/(length(a,n)*length(b,n));
}
int main(){
int i,j,m,n,c;
int t,k,q=0;
FILE *p=fopen("training.txt","r");
while(fscanf(p,"%d %d %d",&i,&j,&c)!=EOF){
x[i-1][j-1]=1;
}
fclose(p);//将数据转化为二维数组存储
for(i=0;i<942;i++){
for(j=0;j<942;j++){
sim[i][j]=similar(x[i],x[j],1412);//通过向量方法计算相似度
}
}
for(i=0;i<942;i++){
for(j=0;j<1412;j++){
for(m=0;m<942;m++){
score[i][j]=score[i][j]+sim[i][m]*x[m][j];//加权计算得分
}
}
}//计算每个用户对于每件商品可能的喜爱程度
for(i=0;i<942;i++){
for(j=0;j<1412;j++){
top[i][j]=j+1;
}
}
for(i=0;i<942;i++){
for(j=0;j<1412;j++){
list[i][j]=score[i][j];
}
}
for(i=0;i<942;i++){
for(j=1411;j>=0;j--){
for(m=0;m<j;m++){
if(list[i][m]<list[i][j]){
n=list[i][j];
list[i][j]=list[i][m];
list[i][m]=n;
n=top[i][j];
top[i][j]=top[i][m];
top[i][m]=n;
}
}
}
}//按照分数对用户可能喜欢的商品进行排序
FILE *fpRead=fopen("test.txt","r");
if(fpRead==NULL)
{
return 0;
}
for(i=0;i<926;i++)
{
fscanf(fpRead,"%d ",&result[i][0]);
}//读取test数据
fclose(fpRead);
for(i=0;i<926;i++){
for(j=1;j<11;j++){
result[i][j]=top[result[i][0]][j-1];
}
}//在数组中填入top10商品
FILE *fpWrite=fopen("202200271019_result.txt","w");
if(fpWrite==NULL){
return 0;
}
for(i=0;i<926;i++){
for(j=0;j<11;j++){
fprintf(fpWrite,"%d ",result[i][j]);
}
fprintf(fpWrite,"\n");
}//写入top10推荐
fclose(fpWrite);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:逻辑操作符,有逻辑与
&&
,逻辑或||
当我们要测试两个表达式结果时,如果要同时满足,使用逻辑与&&
只需满足其中一个表达式结果时使用逻辑或||
我们要区分逻辑操作符和位操作符按位与&
,按位或|
区别!
#include<stdio.h>
int main()
{
int a=3;//00000000 00000000 00000000 00000011
int b=1;//00000000 00000000 00000000 00000001
printf("%d\n",a&b);
printf("%d\n",a|b);
printf("%d\n",a&&b);
printf("%d\n",a||b);
return 0;
}
位操作符和逻辑操作符截然不同,一个是对整数的二进制进行操作,另一个是对表达式的结果进行判断!&&
只有当两个表达式结果同时为真,结果才为真!||
只有当两个表达式结果同时为假,结果才为假!
逻辑表达式的特性!
#include<stdio.h>
int main()
{
int a=3,b=5,c=6,i=0;
i=a++&&++b;
printf("%d %d\n",a,b);
i=a++||++b;
printf("%d %d\n",a,b);
return 0;
}
我们可以看到,逻辑或
||
第二个表达式,并没有执行。
这是为什么呢!
总结: 逻辑与&&
当执行到表达式结果为假,便停止执行,后面的表达式!
逻辑或||
当执行到表达式结果为真,便停止执行后面的表达式!
这就是我们常说的逻辑短路特点!
这题目是怎样的,然后 training.txt 文件里的数据是怎样的?