Using the Netezza Analytics Matrix Engine
Felt like writing something about the topic due to the lack of available examples out there in the internet.
For more details on the subject, check out the guides by IBM:
1. Netezza Matrix Engine Reference Guide
2. IBM Netezza Analytics Matrix Engine Developer's Guide
-- initialize the engine
CALL NZM..INITIALIZE();
--create some random matrix
CALL NZM..CREATE_RANDOM_MATRIX('A', 10, 10);
CALL NZM..CREATE_RANDOM_MATRIX('B', 10, 10);
--let's try adding the matrix. Put the result in matrix C
CALL NZM..ADD('A', 'B', 'C');
--now let's see the result -> create a table from the matrix
CALL NZM..CREATE_TABLE_FROM_MATRIX('C', 'TABLE_C');
--look at the content.
select * from table_c order by row, col;
--to check the results, let's create additional tables from matrix A and B and calculate manually.
CALL NZM..CREATE_TABLE_FROM_MATRIX('B', 'TABLE_B');
select * from table_b order by row, col;
CALL NZM..CREATE_MATRIX_FROM_TABLE('TABLE_A', 'A', 10, 10);
select * from table_b order by row, col;
--let's try some real-life application.
/* Begin Ego Network Centrality Calculation (based on Borgatti, 2004)*/
/* formula for ego betweenness
A^2*[1-A], where A is the adjacency matrix of node 'i'.
*/
/*
suppose we have an adjacency matrix in EGO_NTWK_3. Content of the table must be in "row, col, value" format so that it could be converted to matrix later. Below is some sample data:
row,col,value
1,1,0
1,2,1
1,3,1
1,4,1
1,5,1
2,1,1
2,2,0
2,3,1
2,4,0
2,5,0
3,1,1
3,2,1
3,3,0
3,4,1
3,5,0
4,1,1
4,2,0
4,3,1
4,4,0
4,5,0
5,1,1
5,2,0
5,3,0
5,4,0
5,5,0
*/
select * from EGO_NTWK_3;
--create matrix from adjacency matrix table
call nzm..create_matrix_from_table('EGO_NTWK_3', 'EGO_NTWK', 5, 5);
--get geodesics of length 2, A^2
CALL nzm..mtx_pow2('EGO_NTWK',2,'EGO_NTWK_SQ');
--create ones matrix
call nzm..create_ones_matrix('ONES',nzm..get_num_rows('EGO_NTWK'),nzm..get_num_rows('EGO_NTWK'));
--preparing [1-A]
CALL NZM..SUBTRACT('ONES', 'EGO_NTWK', '1_MINUS_EGO');
--calculating A^2*[1-A]
CALL NZM..MULTIPLY_ELEMENTS('EGO_NTWK_SQ', '1_MINUS_EGO', 'RESULT');
--transfer result in a new table
CALL NZM..CREATE_TABLE_FROM_MATRIX('RESULT', 'TABLE_R');
--clear all matrix for future calculations
CALL NZM..DELETE_ALL_MATRICES;
--get reciprocal of matrix for values above diagonal (since below diagonal are just duplicates). The sum is the ego betweenness score for 'i'.
select sum(reciprocal) from (
select row,col,1/value as reciprocal from table_r
where col < row
and value != 0
order by row, col
) A;
/* The ego-betweenness score should be 3.5 */
For more details on the subject, check out the guides by IBM:
1. Netezza Matrix Engine Reference Guide
2. IBM Netezza Analytics Matrix Engine Developer's Guide
Comments