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添加索引和sql分析
mysql索引操作 查看索引 show indexes from students; #students为表名 mysql添加索引命令 创建索引 .PRIMARY KEY(主键索引) mysql> ...
- [CSP-S模拟测试]:金(king)(高精度+模拟)
题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...
- 使用struts2未登录,不能操作
1.定义拦截器类: 注意登录的action,登录成功在session存入标记(login) import com.opensymphony.xwork2.ActionContext; import c ...
- 100万DAU的app技术架构(简单理解)
如图所示:
- appium自动化测试- 元素操作
本文转自:https://www.cnblogs.com/sinder2018/articles/9699801.html 一.滑动屏幕 1.appium - 滑动屏幕 滑动接口: swipe(起始X ...
- Qwidget布局操作之QGridLayout(网格布局)
QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法. 需要做的只是先定义一个QWidget对象,然后使用QMainWi ...
- Mac Office2016 安装及破解
一.安装包下载地址 http://officecdn.microsoft.com/sg/C1297A47-86C4-4C1F-97FA-950631F94777/OfficeMac/Microsoft ...
- linux 日志文件查看
记录下日志中常用的日志查看命令. 1. tail -n 10 -f **.log 显示日志文件尾部10行日志,当有新日志产生,会追加显示. 2. tail 命令 现ff.sh中有如下信息: [ro ...
- Python List列表的操作说明
Python中List的N种操作,其简单程度令人叹为观止... C:\Users\rhys>python Python 2.7.14 (v2.7.14:84471935ed, Sep 16 20 ...
- Django框架(二十八)—— Django缓存机制
目录 Django缓存机制 一.什么是缓存 二.Django的6中缓存方式及配置(只需要改配置文件) 1.开发调试缓存(此模式为开发调试使用,实际上不执行任何操作) 2.内存缓存(将缓存内容保存至内存 ...