Keyword: クラスター指示変数, 計算, 多変量解析
概要
本サンプルはクラスター指示変数の計算を行うC言語によるサンプルプログラムです。 本サンプルは以下に示されるデータについてクラスター指示変数の計算を行います。
※本サンプルはnAG Cライブラリに含まれる関数 nag_mv_cluster_indicator() のExampleコードです。本サンプル及び関数の詳細情報は nag_mv_cluster_indicator のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_mv_cluster_indicator のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12
このデータをダウンロード |
nag_mv_cluster_indicator (g03ejc) Example Program Data 5 3 Nag_Median Nag_NoMatUp Nag_DistSquared Nag_NoVarScale 1 5.0 2.0 A 2 1.0 1.0 B 3 4.0 3.0 C 4 1.0 2.0 D 5 5.0 0.0 E 0 1 1 1.0 1.0 1.0 2 0.0
- 1行目はタイトル行で読み飛ばされます。
- 2行目に観測値の数(n)と変数の数(m)を指定しています。
- 3行目にクラスタリングの手法(method)を指定しています。"Nag_Median"はメディアン法(Median)を使用することを意味します。
- 4行目には既存の行列が更新されるかどうかを示すパラメータ(update)、計算される距離の種類(dist)、使用される変数の標準化(scale)を指定しています。この場合、"Nag_NoMatUp"は距離が行列Dに追加される前に行列Dは初期化されることを意味しています。 "Nag_DistSquared" はユークリッド平方距離を意味しています。 "Nag_NoVarScale" はスケールしないことを意味しています。
- 5~9行目に変数の値(x)とオブジェクト名(name)を指定しています。
- 10行目に変数がクラスター指示変数の計算に含まれるどうかを示すフラグ(isx)を指定しています。"1"の場合は計算に含まれます。
- 11行目は変数に対するスケーリング(s)を指定しますが、"Nag_Nag_NoVarScale"の場合は各変数に対し 1.0 を指定しています。
- 12行目に特定の数のクラスタ-が必要かどうかその数(k)とクラスターが生成される際の距離(dlevel)を指定しています。
出力結果
(本関数の詳細はnag_mv_cluster_indicator のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
この出力例をダウンロード |
nag_mv_cluster_indicator (g03ejc) Example Program Results Distance Clusters Joined 1.000 B D 2.000 A C 6.500 A E 14.125 A B Dendrogram 14.125 ------- I I I I 12.006 I I I I I I 9.887 I I I I I I 7.769 I I ---* I I I I 5.650 I I I I I I I I I 3.531 I I I I I I ---* I I 1.412 I I I ---* I I I I I A C E B D Allocation to 2 clusters Object Cluster A 1 B 2 C 1 D 2 E 1
- 4~9行目に距離と結合されたクラスターが出力されています。
- 11~34行目にデンドログラム(樹状図)が出力されています。
- 36行目に2つのクラスターに割り当てられたことが出力されています。
- 38~44行目にオブジェクトがどのクラスターに属するかが出力されています。
ソースコード
(本関数の詳細はnag_mv_cluster_indicator のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
このソースコードをダウンロード |
/* nag_mv_cluster_indicator (g03ejc) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. * */ #include <nag.h> #include <stdio.h> #include <nag_stdlib.h> #include <nagg03.h> #define X(I, J) x[(I) *tdx + J] int main(void) { Integer exit_status = 0, i, *ic = 0, *ilc = 0, *iord = 0, *isx = 0; Integer *iuc = 0; Integer j, k, m, n, nsym, tdx; NagError fail; Nag_ClusterMethod method; Nag_DistanceType dist; Nag_MatUpdate update; Nag_VarScaleType scale; char nag_enum_arg[40]; char **c = 0, name[40][3]; double *cd = 0, *d = 0, dlevel, dmin_, *dord = 0, dstep, *s = 0; double *x = 0, ydist; INIT_FAIL(fail); printf("nag_mv_cluster_indicator (g03ejc) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n]"); scanf("%ld", &n); scanf("%ld", &m); if (n >= 2 && m >= 1) { if (!(cd = nAG_ALLOC(n - 1, double)) || !(d = nAG_ALLOC(n * (n - 1) / 2, double)) || !(dord = nAG_ALLOC(n, double)) || !(s = nAG_ALLOC(m, double)) || !(x = nAG_ALLOC((n) * (m), double)) || !(ic = nAG_ALLOC(n, Integer)) || !(ilc = nAG_ALLOC(n - 1, Integer)) || !(iord = nAG_ALLOC(n, Integer)) || !(isx = nAG_ALLOC(m, Integer)) || !(iuc = nAG_ALLOC(n - 1, Integer))) { printf("Allocation failure\n"); exit_status = -1; goto END; } tdx = m; } else { printf("Invalid n or m.\n"); exit_status = 1; return exit_status; } scanf("%39s%*[^\n] ", nag_enum_arg); /* nag_enum_name_to_value (x04nac). * Converts nAG enum member name to value */ method = (Nag_ClusterMethod) nag_enum_name_to_value(nag_enum_arg); scanf("%39s", nag_enum_arg); update = (Nag_MatUpdate) nag_enum_name_to_value(nag_enum_arg); scanf("%39s", nag_enum_arg); dist = (Nag_DistanceType) nag_enum_name_to_value(nag_enum_arg); scanf("%39s%*[^\n] ", nag_enum_arg); scale = (Nag_VarScaleType) nag_enum_name_to_value(nag_enum_arg); for (j = 0; j < n; ++j) { for (i = 0; i < m; ++i) scanf("%lf", &X(j, i)); scanf("%2s", name[j]); } for (i = 0; i < m; ++i) scanf("%ld", &isx[i]); for (i = 0; i < m; ++i) scanf("%lf", &s[i]); scanf("%ld", &k); scanf("%lf", &dlevel); /* Compute the distance matrix */ /* nag_mv_distance_mat (g03eac). * Compute distance (dissimilarity) matrix */ nag_mv_distance_mat(update, dist, scale, n, m, x, tdx, isx, s, d, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_mv_distance_mat (g03eac).\n%s\n", fail.message); exit_status = 1; goto END; } /* Perform clustering */ /* nag_mv_hierar_cluster_analysis (g03ecc). * Hierarchical cluster analysis */ nag_mv_hierar_cluster_analysis(method, n, d, ilc, iuc, cd, iord, dord, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_mv_cluster_indicator (g03ejc).\n%s\n", fail.message); exit_status = 1; goto END; } printf("\nDistance Clusters Joined\n\n"); for (i = 0; i < n - 1; ++i) { printf("%10.3f ", cd[i]); printf("%3s", name[ilc[i] - 1]); printf("%3s", name[iuc[i] - 1]); printf("\n"); } /* Produce dendrogram */ nsym = 20; dmin_ = 0.0; dstep = cd[n - 2] / (double) nsym; /* nag_mv_dendrogram (g03ehc). * Construct dendrogram following * nag_mv_hierar_cluster_analysis (g03ecc) */ nag_mv_dendrogram(Nag_DendSouth, n, dord, dmin_, dstep, nsym, &c, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_mv_dendrogram (g03ehc).\n%s\n", fail.message); exit_status = 1; goto END; } printf("\n"); printf("Dendrogram "); printf("\n"); printf("\n"); ydist = cd[n - 2]; for (i = 0; i < nsym; ++i) { if ((i + 1) % 3 == 1) { printf("%10.3f%6s", ydist, ""); printf("%s", c[i]); printf("\n"); } else { printf("%16s%s", "", c[i]); printf("\n"); } ydist -= dstep; } printf("\n"); printf("%14s", ""); for (i = 0; i < n; ++i) { printf("%3s", name[iord[i] - 1]); } printf("\n"); /* nag_mv_dend_free (g03xzc). * Frees memory allocated to the dendrogram array in * nag_mv_dendrogram (g03ehc) */ nag_mv_dend_free(&c); /* nag_mv_cluster_indicator (g03ejc). * Construct clusters following * nag_mv_hierar_cluster_analysis (g03ecc) */ nag_mv_cluster_indicator(n, cd, iord, dord, &k, &dlevel, ic, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_mv_cluster_indicator (g03ejc).\n%s\n", fail.message); exit_status = 1; goto END; } printf("\n%s%2ld%s\n\n", "Allocation to ", k, " clusters"); printf("Object Cluster\n\n"); for (i = 0; i < n; ++i) { printf("%5s%s%5s", "", name[i], ""); printf("%ld ", ic[i]); printf("\n"); } END: nAG_FREE(cd); nAG_FREE(d); nAG_FREE(dord); nAG_FREE(s); nAG_FREE(x); nAG_FREE(ic); nAG_FREE(ilc); nAG_FREE(iord); nAG_FREE(isx); nAG_FREE(iuc); return exit_status; }