<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、みんな、
列内の何かの最も近い値を検索する必要があります。これを行うための関数(私が見つけられない)はありますか、それとも独自のルーチンを作成する必要がありますか?
ありがとう、ナタリー
使用
Col = Column( dtFile1, "X_location" );
JMP オブジェクト (dtFile1 のデータ テーブルなど) は通常、理解できないメッセージ ( <Re: 最も近い値を検索する
反応が遅くてごめんなさい。別のことに夢中になってしまいました。最初は2番目の解決策を試しましたが、まったく機能しません。列の最小値を見つけることさえできません...どうしたの?私の列が数値列ではなく文字列列であることに気づいたので変換しましたが、何の助けにもならないようでした。
桁( dtファイル1 、 「X_場所」 ) <<データ・タイプ( 「数値」 ) ;
コル= dtファイル1 <<桁( 「X_場所」 ) ;
行=ロック・ミン(((コル<<値の取得))) ;
KDTable を使用するもう 1 つの方法。
dt = Open( "$sample_data/big class.jmp" );
// kdtable の入力行列を作成します: [95 59, 123 61, 74 55, ...
データ = (dt:weight << getasmatrix) || (dt:高さ << getasmatrix);
// ルックアップテーブルを作成します
lookup = KDTable( データ );
// 検索例を実行します。体重 100 ポンド、身長 60 ポンドに最も近い 10 人を検索します。
// 5 以内のインチ。(5 は重量やポンドと同じ「単位」です...正規化?)
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100 60] );
// 結果を表示する
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " h=", dt:height[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
アルフレッド w=99 h=64 d=4.12310562561766
クリス w=99 h=64 d=4.12310562561766
マーク w=104 h=62 d=4.47213595499958
ケイティ w=95 h=59 d=5.09901951359278
したがって、d=4.123 は sqrt((100-99)^2+(60-64)^2) になります。Katie が発見されるまでに半径 5 を超えていたため、要求された 10 件の結果は半径によって制限されました。
KDTable は K 次元データを処理します。 K=1 (たとえば、体重のみ) または K=3 (年齢も含める) のみが必要な場合もあります。このデータでは、身長や体重よりも範囲がはるかに狭いため、スケーリング/正規化の問題は年齢とともにより顕著になります。13 歳から 14 歳までの距離は、75 ポンドから 80 ポンドまでの距離よりも大きいですか、それとも小さいですか?
編集: 重みだけを使用すると、さらに単純に見えます。
dt = Open( "$sample_data/big class.jmp" );
// ルックアップテーブルを作成します
lookup = KDTable( dt:weight << getasmatrix );
// 検索の例を実行します: 体重 100 ポンドに最も近い 10 人を検索します
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100] );
// 結果を表示する
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
アルフレッド w=99 d=1
クリス w=99 d=1
ジョン w=98 d=2
マーク w=104 d=4
ケイティ w=95 d=5
ジョー w=105 d=5
マイケル w=95 d=5
粘土 w=105 d=5
ダニー w=106 d=6
以下に、最も近い値の行を取得する 2 つの方法を示します。 1 つ目は行番号の行列を返すため、同点が許容されます。 LocMin() 関数を使用する 2 番目のアプローチでは、一意の最も近い値が 1 つあると想定されます。最初のインスタンスの行番号のみを返し、タイは無視されます。
デフォルトの名前はここにあります( 1 ) ;
dt =開ける( 「$SAMPLE_DATA\Big Class.jmp」 ) ;
コル=桁( "重さ" ) ;
// 値に最も近い行をすべて選択します
価値= 99.5 ;
d =腹筋((コル<<値を取得する) -価値) ;
行=ロック( d ==分( d )) ;
見せる(行) ;
dt <<行を選択する(行) ;
// 値に最も近い最初の行を選択します
価値= 112 ;
行=ロック・ミン(腹筋((コル<<値を取得する) -価値)) ;
見せる(行) ;
dt <<行を選択する(行) ;
または、行列ベクトルを作成することもできます
rowmat=index(1,N 行(dt));
次に、同じランク行列を使用して並べ替えます
rowmatsorted = 行マット;
そして、ソートされた値行列と同じ順序で行番号が含まれるため、値行列から最も近い値の位置を取得すると、rowmatsorted 行列内の同じ位置に行番号が含まれます。
ありがとうジム、これは素晴らしいね。
これなら間違いなく使えます。ただし、次の列の対応する値を取得できるように、行番号を知る必要があります。
関数を使用して最も近い値を見つけた後、元のデータでその値を検索して行番号を見つける必要がありますか?
ナタリー、
これは、ターゲット値に最も近い値を返す、私が作成した簡単な関数です。
デフォルトの名前はここにあります( 1 ) ;
dt =開ける( 「$SAMPLE_DATA\半導体能力.jmp」 ) ;
最も近いものを見つける=関数( {価値、コル} 、
{ある、 R 、ああ、すぐ真上に、すぐ下、価値、コル} 、
ある=桁(コル) <<値を取得する;
R =ランク(ある) ;
ああ=並べ替えられた=ある[ R ] ;
b = 108 ;
すぐ真上に=ああ[ロック(ああ>価値)[ 1 ]] ;
すぐ下=ああ[ロック(ああ<価値)[ N 行(ロック(ああ< b ) )]] ;
もしも(すぐ真上に-価値<価値-すぐ下、
すぐ真上に、
) ;
) ;
見せる(最小=最も近いものを見つける( 108 、 「NPN1」 )) ;