Map-reduce 矩阵

来源:互联网 发布:c4.5算法python实现 编辑:程序博客网 时间:2024/06/05 15:05

来自微博的题目: Map Reduce 矩阵。

新的矩阵的值,是原来矩阵附近8个临近节点的均值。


python代码实现:

# input: element is the key value pair of matrix#        type:    [row, column, value, totle_row, totle_column]def mapper(elem):    row = elem[0]    col = elem[1]    val = elem[2]    t_row = elem[3]    t_col = elem[4]    if (row == 0):        if (col == 0):            mr.emit_intermediate(str("0,1"), val)            mr.emit_intermediate(str("1,0"), val)            mr.emit_intermediate(str("1,1"), val)        elif (col == t_col - 1):            mr.emit_intermediate(str("0,")+str(t_col-2), val)            mr.emit_intermediate(str("1,")+str(t_col-1), val)            mr.emit_intermediate(str("1,")+str(t_col-2), val)        else:            mr.emit_intermediate(str("0,")+str(col-1), val)            mr.emit_intermediate(str("0,")+str(col+1), val)            mr.emit_intermediate(str("1,")+str(col), val)            mr.emit_intermediate(str("1,")+str(col-1), val)            mr.emit_intermediate(str("1,")+str(col+1), val)    elif (row == t_row - 1):        if (col == 0):            mr.emit_intermediate(str(row-1)+str(col), val)            mr.emit_intermediate(str(row)+str(col+1), val)            mr.emit_intermediate(str(row-1)+str(col+1), val)        elif (col == t_col - 1)            mr.emit_intermediate(str(row)+str(col-1), val)            mr.emit_intermediate(str(row-1)+str(col), val)            mr.emit_intermediate(str(row-1)+str(col-1), val)        else:            mr.emit_intermediate(str(row)+str(col-1), val)            mr.emit_intermediate(str(row)+str(col+1), val)            mr.emit_intermediate(str(row-1)+str(col), val)            mr.emit_intermediate(str(row-1)+str(col-1), val)            mr.emit_intermediate(str(row-1)+str(col+1), val)    else:            mr.emit_intermediate(str(row-1)+str(col-1), val)            mr.emit_intermediate(str(row-1)+str(col), val)            mr.emit_intermediate(str(row-1)+str(col+1), val)            mr.emit_intermediate(str(row)+str(col-1), val)            mr.emit_intermediate(str(row)+str(col+1), val)            mr.emit_intermediate(str(row+1)+str(col), val)            mr.emit_intermediate(str(row+1)+str(col-1), val)            mr.emit_intermediate(str(row+1)+str(col+1), val)def reducer(key, list_of_values):    arithmetic_mean = float(sum(list_of_values))/len(list_of_values)    ret = [int(x) for x in key.split(",")]    ret.append(arithmetic_mean)    mr.emit(ret)



原创粉丝点击