Linear regression tries to fit a line, in the form of , to a given data set. In a simple form assume that a data set consists of
. For example:Â
shows such a data set.
The following code calculates and
for a given data set.
void lr( DATA_TYPE *memory_0 , DATA_TYPE *memory_1 , u32 in_X , u32 in_Y , DATA_TYPE *a0 , DATA_TYPE *a1 , u32 n) { #pragma HLS INTERFACE s_axilite port=return bundle=control_bus #pragma HLS INTERFACE s_axilite port=in_X bundle=control_bus #pragma HLS INTERFACE s_axilite port=in_Y bundle=control_bus #pragma HLS INTERFACE s_axilite port=a0 bundle=control_bus #pragma HLS INTERFACE s_axilite port=a1 bundle=control_bus #pragma HLS INTERFACE s_axilite port=n bundle=control_bus #pragma HLS INTERFACE m_axi port=memory_0 #pragma HLS INTERFACE m_axi port=memory_1 DATA_TYPE SumX = 0; DATA_TYPE SumY = 0; DATA_TYPE SumXX = 0; DATA_TYPE SumXY = 0; #pragma HLS DATAFLOW DATA_TYPE t, y; hls::stream<DATA_TYPE> input_X_fifo; hls::stream<DATA_TYPE> input_Y_fifo; //receive data for (int i = 0; i < n; i++) { #pragma HLS PIPELINE input_X_fifo << *(memory_0 + in_X + i); input_Y_fifo << *(memory_1 + in_Y + i); } //computation for (int i = 0; i < n/(B); i++) { #pragma HLS PIPELINE DATA_TYPE X[B]; DATA_TYPE Y[B]; for (int j = 0; j < B; j++) { #pragma HLS UNROLL X[j] = input_X_fifo.read(); Y[j] = input_Y_fifo.read(); } DATA_TYPE SumX_tmp = 0; DATA_TYPE SumY_tmp = 0; DATA_TYPE SumXX_tmp = 0; DATA_TYPE SumXY_tmp = 0; int j = 0; for (j = 0; j < B; j++) { #pragma HLS UNROLL SumX_tmp += X[j]; SumY_tmp += Y[j]; SumXX_tmp += X[j]*X[j]; SumXY_tmp += X[j]*Y[j]; } SumX += SumX_tmp; SumY += SumY_tmp; SumXX += SumXX_tmp; SumXY += SumXY_tmp; } //write back data *a0 = (SumY*SumXX - SumX*SumXY)/(n*SumXX-SumX*SumX); *a1 = (n*SumXY-SumX*SumY)/(n*SumXX-SumX*SumX); }