FM算法组合估计
#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算法组合估计的更多相关文章
- FM算法(一):算法理论
主要内容: 动机 FM算法模型 FM算法VS 其他算法 一.动机 在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合:非线性SVM可 ...
- FM算法
1.FM背景 在计算广告中,CTR预估(click-through rate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果.在前面的相关博文中,我们已经提到了CTR中相关特征工程 ...
- FM算法解析及Python实现
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
- FM算法 的总结
FM的总结: 1.FM算法与线性回归相比增加了特征的交叉.自动选择了所有特征的两两组合,并且给出了两两组合的权重. 2.上一条所说的,如果给两两特征的组合都给一个权重的话,需要训练的参数太多了.比如我 ...
- FM算法及FFM算法
转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...
- 个性化排序算法实践(一)——FM算法
因子分解机(Factorization Machine,简称FM)算法用于解决大规模稀疏数据下的特征组合问题.FM可以看做带特征交叉的LR. 理论部分可参考FM系列,通过将FM的二次项化简,其复杂度可 ...
- 推荐算法之---FM算法;
一,FM算法: 1,逻辑回归上面进行了交叉特征.算法复杂度优化从O(n^3)->O(k*n^2)->O(k*n). 2,本质:每个特征都有一个k维的向量,代表的是每个特征都有k个不可告人的 ...
- FM算法(二):工程实现
主要内容: 实现方法 Python实现FM算法 libFM 一.实现方法 1.FM模型函数 变换为线性复杂度的计算公式: 2.FM优化目标 根据不同的应用,FM可以采用不同的损失函数loss fu ...
- (转载)FM 算法
(转载)FM算法 https://zhuanlan.zhihu.com/p/33184179
随机推荐
- 埋在MySQL数据库应用中的17个关键问题
出处:https://blog.csdn.net/weixin_42882439 MySQL的使用非常普遍,跟MySQL有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份.集群.横向扩展. ...
- Javascript 数组 数字 字符串 时间等使用
1.Javascript 数组API 1. //定义数组 2. var pageIds = new Array(); 3. pageIds.push('A'); 5. 数组长度 6. pageIds. ...
- Android 架构师技能图谱
# Android 架构师技能图谱 ## 架构与设计 - 设计模式 - 重构 - 技术选型 - 特性 - 可用性 - 性能 - 包大小 - 方法数 - 文档 - 技术支持 - UI架构模式 - MVC ...
- python 操作数据库的常用SQL命令
这俩天在学习PYTHON操作数据库的知识.其实基本SQL命令是与以前学习的MYSQL命令一致,只是增加了一些PYTHON语句. 1,安装pymysql,并导入. import pymysql 2,因为 ...
- php打包下载文件
使用前请先开启:查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉; $zip=new \ZipArchive(); $zifile = 'download/' ...
- XStream教程
XStream是一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和xml文档相互转换). 特点 使用方便 - XStream的API提供了一个高层次外观,以 ...
- Java.io包
Java.io.BufferedInputStream 类添加功能到另一个输入流,缓冲输入以及支持mark和reset methods.Following是关于缓冲输入流的要点: 当创建缓冲输入,创建 ...
- php &引用符的注意情况
- redis的一些特性
Redis内存回收 Redis复制原理 Redis提供的高可用方案 Redis提供的分片算法 Redis迁移
- HTTP、HTTP1.0、HTTP1.1、HTTP2.0、HTTPS
一.HTTP HTTP(超文本传输协议,HyperText Transfer Protocol)是应用层的协议,目前在互联网中应用广泛. 它被设计用于Web浏览器和Web服务器之间的通信,但它也可 ...