#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h> #define NUM (int)pow(2.0,25)+1 int length=;//计算长度
int data[];//存放数据流 struct node
{
int data;
struct node* next;
};
struct node* creat()//创建链表
{
int x;
struct node *tail,*p,*head;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
tail=head;
//FILE *fp=fopen("./stream_for_fm.txt","r");
FILE *fp=fopen("./stream_sample_fm.txt","r");//样本
if(fp==NULL)
{
printf("file open failed!\n");
exit();
}
while(!feof(fp))
{
fscanf(fp,"%d",&x);
p=(struct node *)malloc(sizeof(struct node));
p->data=x;
tail->next=p;
p->next=NULL;
tail=p;
data[length++]=x;
}
printf("链表创建成功!\n");
return head;
}
/*排序链表*/
struct node *sort(struct node *head)
{
struct node *p,*q;
for(p=head->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data > q->data)
{
int tmp=p->data;
p->data=q->data;
q->data=tmp;
}
}
}
printf("链表排序完成!\n");
return head;
} /*计算有多少不同元素*/
int different_node_count(struct node *head)
{
struct node *p,*q,*tmp;
int count_equal=,count_total=;
tmp=NULL; for(p=head->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data == q->data)
{
count_equal++;//相同元素加
tmp=q;//记录最后一个相同的元素位置
}
else
{
break;
}
}
if(tmp!=NULL)
{
p=tmp;
tmp=NULL;
}
//count_total++;//统计全部节点的个数
}
printf("不同节点的个数%d\n节点总数:%d\n",length-count_equal,length);
return length-count_equal;
}
//计算尾数
int get_tailnum(long long a)
{
int i=,count =;
while(a!=)
{
if( == a%)
{
count++;
}
else
{
break;
}
a=a/;
i++;
}
return count;
} int main()
{
struct node *head;
int only_value;
int M=,L=;
int i,j,k,x;
int circle=;
long long h,a,b;
int R[][];//尾数
int max_tailnum=,tmp;//最大尾长
double ave_tail[]={};//最大尾数的平均数
int mid_tail;//平均尾数的中位数
int estimate[];//存入估计值
double error;//误差
long long sum=; head=creat();
head=sort(head);
only_value=different_node_count(head);
srand(time());
for(x=;x<circle;x++)
{
for(i=;i<M;i++)//分组M
{
for(j=;j<L;j++)//每组L个hash
{
a=rand()%NUM;
b=rand()%NUM;
max_tailnum=;
for(k=;k<length;k++)
{
tmp=get_tailnum(a*data[k]+b);
if(max_tailnum<tmp)
{
max_tailnum=tmp;
}
}
R[i][j]=max_tailnum;
}
for(j=;j<L;j++)
{
ave_tail[i]+=R[i][j];
}
ave_tail[i]/=L;//每组的平均值
} if(M%==)
{
mid_tail=(ave_tail[M/]+ave_tail[M/+])/;
}
else
{
mid_tail=ave_tail[M/];
} estimate[x]=(int)pow(2.0,mid_tail); //ave_tail尾长的平均值清零
for(int i= ;i < ;i ++)
{
ave_tail[i]=;
}
}
int temp=;
printf("估计元素个数");
for(i=;i<circle;i++)
{
temp+=estimate[i];
//printf("%8d",estimate[i]);
sum+=(estimate[i]-only_value)*(estimate[i]-only_value);
}
printf("%lf",temp/(double)circle);
putchar('\n');
error=sqrt(sum/(double)only_value);
printf("误差(方差):%lf\n",error);
system("pause");
return ;
}

FM算法组合估计的更多相关文章

  1. FM算法(一):算法理论

    主要内容: 动机 FM算法模型 FM算法VS 其他算法   一.动机 在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合:非线性SVM可 ...

  2. FM算法

    1.FM背景 在计算广告中,CTR预估(click-through rate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果.在前面的相关博文中,我们已经提到了CTR中相关特征工程 ...

  3. FM算法解析及Python实现

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

  4. FM算法 的总结

    FM的总结: 1.FM算法与线性回归相比增加了特征的交叉.自动选择了所有特征的两两组合,并且给出了两两组合的权重. 2.上一条所说的,如果给两两特征的组合都给一个权重的话,需要训练的参数太多了.比如我 ...

  5. FM算法及FFM算法

    转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...

  6. 个性化排序算法实践(一)——FM算法

    因子分解机(Factorization Machine,简称FM)算法用于解决大规模稀疏数据下的特征组合问题.FM可以看做带特征交叉的LR. 理论部分可参考FM系列,通过将FM的二次项化简,其复杂度可 ...

  7. 推荐算法之---FM算法;

    一,FM算法: 1,逻辑回归上面进行了交叉特征.算法复杂度优化从O(n^3)->O(k*n^2)->O(k*n). 2,本质:每个特征都有一个k维的向量,代表的是每个特征都有k个不可告人的 ...

  8. FM算法(二):工程实现

    主要内容: 实现方法 Python实现FM算法 libFM   一.实现方法 1.FM模型函数 变换为线性复杂度的计算公式: 2.FM优化目标 根据不同的应用,FM可以采用不同的损失函数loss fu ...

  9. (转载)FM 算法

    (转载)FM算法 https://zhuanlan.zhihu.com/p/33184179

随机推荐

  1. express设置允许跨域访问该服务.

    const express = require('express');const app = express(); //设置允许跨域访问该服务.app.all('*', function (req, ...

  2. cs224d 作业 problem set2 (三) 用RNNLM模型实现Language Model,来预测下一个单词的出现

      今天将的还是cs224d 的problem set2 的第三部分习题, 原来国外大学的系统难度真的如此之大,相比之下还是默默地再天朝继续搬砖吧 下面讲述一下RNN语言建模的数学公式: 给出一串连续 ...

  3. Django框架(十八)—— auth框架:用户登录、注册、认证

    目录 auth模块 一.什么是author模块 二.auth模块的使用 1.创建超级用户(create_superuser()) 2.验证用户(authenticate()) 3.登录用户(login ...

  4. php &引用符的注意情况

  5. requests返回页面乱码

    req=requests.post(domain,params,json=None) req=req.content.decode()

  6. redis 学习入门篇

    基本概念 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库(非关系性数据库). redis的特点 速度快,因为数据存在内存中,读写数据的时候都不 ...

  7. Pytest---yield

    场景:你已经可以将测试方法前要执行的或依赖的解决了,测试 方法后销毁清除数据的要如何进行呢?范围是模块级别的.类似 setupClass 解决:通过在同一模块中加入 yield关键字,yield是调用 ...

  8. Java中HashMap与ConcurrentHashMap的区别

    从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...

  9. ionic2(3) 密码键盘组件 ionic2-pincode-input 使用

    1.效果展示: 2.安装: npm install ionic2-pincode-input --save 3.app.module.ts配置 app.module.ts import { NgMod ...

  10. JS window对象 返回浏览历史中的其他页面 go()方法,根据当前所处的页面,加载 history 列表中的某个具体的页面。 语法: window.history.go(number);

    返回浏览历史中的其他页面 go()方法,根据当前所处的页面,加载 history 列表中的某个具体的页面. 语法: window.history.go(number); 参数: 浏览器中,返回当前页面 ...