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
随机推荐
- nginx 全面优化 负载均衡
修改nginx.conf文件,它保存有nginx不同模块的全部设置.如果是原生安装的话应该在服务器的 /etc/nginx 目录找到 nginx.conf ,使用其它安装包的话也可以自行查找nginx ...
- [CSP-S模拟测试]:简单的填数(贪心+模拟)
题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...
- [CSP-S模拟测试]:简单的区间(分治)
题目描述 给定一个长度为$n$的序列$a$以及常数$k$,序列从$1$开始编号.记$$f(l,t)=\sum \limits_{i=l}^ra_i-\max \limits_{i=l}^r\{a_i\ ...
- 远程桌面发生身份验证错误,要求的函数不受支持【WIN10家庭】或【专业版】--解决办法
10号更新后,远程出现如下报错 一.[家庭中文版]解决办法[亲自试验] 开启WIN家庭中文版的本地组策略 1.打开tet复制以下代码:@echo off pushd "%~dp0" ...
- Container 技能图谱skill-map
# Container 技能图谱 ## 1. 容器核心 - [Docker](https://www.docker.com/) - [LXC](https://linuxcontainers.org/ ...
- 02 java语言基础
常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用) A: ...
- SQL Server2012创建连接服务器到ORACLE11G
做ETL,肯定少不了经常会从不同的数据库直接进行数据的操作,为了更好的进行跨库操作,SQL SERVER 2012拥有LinkedServer功能.前段时间写了个SQL SERVER同种数据库直接的链 ...
- Win10 打开MSDTC
标签:log com http it sp src c bs io 1,Win+R 打开运行窗口,输入 dcomcnfg,打开组件服务窗口 2,在组件服务 catalo ...
- input file转base64
不想用canvas转 <input type="file" id="file" accept="image/*" onchange=& ...
- MySQL全面优化,速度飞起来!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 在进行MySQL的优 ...