0

私はKNNのユークリッド距離を計算する例をたくさん見てきましたが、KNNの評価では分類できませんでした。例えばKNNのユークリッド距離を計算する

私は「非常に近いゲームを」文を持っている

どのように私は、文のために、「素晴らしいゲームを」ユークリッド距離を計算するのですか?

+0

それはあなたの文章のための「ユークリッド距離」によって何を意味するかは不明です。任意の距離を取得するには、いくつかのエンコーディングを修正する必要があります。たとえば、カウントのベクトル、バイナリバージョン、またはtfidfベクトルを使用できます。 –

+0

トレーニングデータが[link](https://i.stack.imgur.com/PrqAF.png)で、KNNを使って「非常に近いゲーム」という文を分類する必要があるとします – xx4xx4

+0

このデータは文章です。前に述べたように、それらをベクトル化するには多くの方法があります。 –

答えて

1

ユークリッド距離を計算することができる座標系を定義した後でなければ、多次元空間の一点について文章を考えてみてください。例えば。あなたは

  1. O1を導入することができます - 文の長さ(長さ)
  2. O2 - 単語数(WordsCount)
  3. O2 - アルファベット順の中心を(私はそれを考えました)。それは、文中の各作業のアルファベットの中心の算術平均として計算することができる。したがって

    CharsIndex = Sum(Char.indexInWord)/CharsCountInWord; CharsCode = Sum(Char.charCode)/CharsCount; AlphWordCoordinate = [CharsIndex, CharsCode]; WordsIndex = Sum(Words.CharsIndex)/WordsCount; WordsCode = Sum(Words.CharsCode)/WordsCount; AlphaSentenceCoordinate = (WordsIndex ^2+WordsCode^2+WordIndexInSentence^2)^1/2;

、ユークリッド距離は、次のように無計算することができない。

EuclidianSentenceDistance = (WordsCount^2 + Length^2 + AlphaSentenceCoordinate^2)^1/2 

なしすべての文は、P [長さのように、三次元空間内の点に変換することができます、言葉、アルファコーディネート]。距離を持つことで、文章を比較して分類することができます。

これは理想的なアプローチではありませんが、私はあなたにアイデアを示したかったのです。

import math 

def calc_word_alpha_center(word): 
    chars_index = 0; 
    chars_codes = 0; 
    for index, char in enumerate(word): 
     chars_index += index 
     chars_codes += ord(char) 
    chars_count = len(word) 
    index = chars_index/len(word) 
    code = chars_codes/len(word) 
    return (index, code) 


def calc_alpha_distance(words): 
    word_chars_index = 0; 
    word_code = 0; 
    word_index = 0; 
    for index, word in enumerate(words): 
     point = calc_word_alpha_center(word) 
     word_chars_index += point[0] 
     word_code += point[1] 
     word_index += index 
    chars_index = word_chars_index/len(words) 
    code = word_code/len(words) 
    index = word_index/len(words) 
    return math.sqrt(math.pow(chars_index, 2) + math.pow(code, 2) + math.pow(index, 2)) 

def calc_sentence_euclidean_distance(sentence): 
    length = len(sentence) 

    words = sentence.split(" ") 
    words_count = len(words) 

    alpha_distance = calc_alpha_distance(words) 

    return math.sqrt(math.pow(length, 2) + math.pow(words_count, 2) + math.pow(alpha_distance, 2)) 


sentence1 = "a great game" 
sentence2 = "A great game" 

distance1 = calc_sentence_euclidean_distance(sentence1) 
distance2 = calc_sentence_euclidean_distance(sentence2) 

print(sentence1) 
print(str(distance1)) 

print(sentence2) 
print(str(distance2)) 

コンソール出力

a great game 
101.764433866 
A great game 
91.8477000256 
+0

私は混乱しています...あなたは私が持っている例を使用して計算を入れようとすることができますか? このリンクの例:https://stackoverflow.com/questions/17053459/how-to-transform-a-text-to-vector – xx4xx4

+0

コードのサンプルを追加しました。あなたはそれで遊んで、良い品質の機能を達成しようとすることができます。今のところ、あなたが見るように、関数はcharレジスタのようなマイナーな変更に素早く敏感です。 – slesh

+0

があるとし...私は、コードを読んだが、私は何をしようとしているから、その異なると思う:私は「非常に近いゲーム」 : トレーニング文:「グレートゲーム」 ラベルなし文を2つの文の間のユークリッド距離を計算したい。私の前のコメントのリンクのように、各文をバイナリに変換するはずです... – xx4xx4

関連する問題