实习笔记Day6(2022.8.13)

一.总结

1.第二篇论文在提出算法思想后,花了很大的篇幅来证明其算法的有效性,这里主要研究其实验结果和分析 

2.深入学习了随机投影树算法(rptree) 

二.学习笔记

1.测试集

测试集一:一组合成数据

测试集二:来自UC Irvine机器学习库的一组数据

2.比较对象

分布式和非分布式的聚类效果

3.编程语言

R语言。k-means算法使用的是R语言中自带的

4.比较指标

(1)聚类准确度

假设数据集中样本所有标签的集合为 \begin{Bmatrix} 1 , 2 , ... , K \end{Bmatrix},式中 \prod 是前述集合中元素所组成的所有排列的集合,h() 和 \hat{h}() 分别表示样本真实的标签和聚类算法给出的标签,II是一个指标函数。该公式的意义是定量地给出了聚类算法的结果和真实结果类似的程度,也就是聚类准确度

(2)计算时间

 从数据被加载进内存开始,到聚类算法给出聚类结果结束所花费的时间

5.实验结果

(1)测试集一:合成数据

实验对三种不同的分布式数据进行了测试,并且都是两个分布式节点,结果表明:

1)不论用k-means还是rptree实现DML,DML对分布式数据的聚类准确度都和非分布式差不多,甚至在某些分布式情况下前者准确度更高

2)计算速度比非分布式数据提高了一倍

(2)测试集二:来自UC Irvine机器学习库的数据

和(1)的实验结论类似

6.rptree算法具体流程 

n_T:一个树节点能代表的数据点的最小个数,P\vec{r}(x):点 x 在向量 \vec{r} 上的投影系数

1)令 U 为所有树 t 的根节点,\Omega 为空集

2)\Omega \leftarrow \begin{Bmatrix} U \end{Bmatrix}

3)while \Omega 非空,do

        1)从 \Omega 中随机选取一个节点 \omega\Omega \leftarrow \Omega -\begin{Bmatrix} \omega \end{Bmatrix}

        2)if \left | \omega \right |< n_T

                跳到下一个while循环

        3)生成一个随机向量 \vec{r}

        4)将节点 \omega 投影到 \vec{r} 上,令 \omega_r=\begin{Bmatrix} r\cdot x\mid x\in \omega \end{Bmatrix}

        5)令a=min\begin{Bmatrix} w_r \end{Bmatrix}b=max\begin{Bmatrix} w_r \end{Bmatrix}

        6)生成一个服从在\begin{bmatrix} a,b \end{bmatrix}均匀分布的点 c

        7)划分节点 \omega :\omega_L=\begin{Bmatrix} x\mid P\vec{r}(x)< c \end{Bmatrix}\omega_R=\begin{Bmatrix} x\mid P\vec{r}(x)\geqslant c \end{Bmatrix}

        8)\Omega \leftarrow\Omega \cup \begin{Bmatrix} w_L,w_R \end{Bmatrix}

return t

至此,两篇论文的基本内容就大致了解完成了,以下是对MPI的学习笔记 

一.基础知识 

1.编译MPI程序 

mpicc -g -Wall -o mpi_hello mpi_hello.c

2.运行MPI程序 

mpiexec -n 1 ./mpi_hello     //使用1个进程运行程序
mpiexec -n 4 ./mpi_hello     //使用4个进程运行程

二.MPI程序 

所有MPI定义的标识符都是都是以字符串 MPI_ 开头的,下划线后的第一个字符大写表示是函数名或MPI定义的类型,MPI定义的宏和常量所有字母都是大写的

1.MPI_Init和MPI_Finalize

MPI_Init函数的作用是告知系统进行所必要的所有初始化设置,函数原型

int MPI_Init(
    int *argc_p;
    char ** argv_p;
);

argc_p和argv_p分别是指向main函数参数argc和argv的指针,不需要时设置为NULL

MPI_Finalize函数用于告知系统MPI已使用完毕,为MPI分配的所有资源都可以释放了

2.MPI程序的基础框架

#include <mpi.h>

int main(int argc, char * argv[]) {
    MPI_Init(&argc, &argv);
    ...
    MPI_Finalize();
    return 0;
}

三.通信子 

通信子是指一组可以互相发送信息的进程集合,在用户启动程序并执行MPI_Init函数后,就定义了用户启动的所有进程组成的通信子,称为MPI_COMM__WORLD

1.int MPI_Comm_size( MPI_Comm comm, int * comm_sz_p )  

第一个参数是一个MPI_Comm类型的通信子,MPI_Comm_size函数在它的第二个参数返回组成通信子的进程数

2.int MPI_Comm_rank( MPI_Comm comm, int * my_rank_p );  

第一个参数是一个MPI_Comm类型的通信子,MPI_Comm_size函数在它的第二个参数返回正在调用进程的通信子中的进程号

四.MPI_Send

int MPI_Send(
	void * 	msg_buf_p,
    int		msg_size,
    MPI_Datatype 	msg_type,
    int 	dest,
    int 	tag,
    MPI_Comm	commmunicator
);

第一个参数msg_buf_p是一个指向消息内容的内存块的指针

第二个参数msg_size和第三个参数和msg_type 指定了要发送的数据量

第四个参数dest指定了要接收消息的进程的进程号

第五个参数tag是个非负int型,用于区分看上去完全一样的消息

第六个参数commmunicator是一个通信子,用于指定通信范围(一个通信子的进程所发送的消息不能被另一个通信子的进程所接收)

五.MPI_Recv 

int MPI_Recv(
    void * msg_buf_p,
    int 	buf_size,
    MPI_Datatype	buf_type,
    int 	source,
    int 	tag, 
    MPI_Comm	communicator,
    MPI_Status*	status_p
);

参数source用于指定接收从哪个进程发送来的消息,参数tag要与发送消息的参数tag相匹配,参数communicator必须与发送进程所用的通信子匹配,前三个参数意义与MPI_Send类似,最后一个参数在后续介绍

三.工作记录

暂无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值