目次
機械学習戦闘のKNNアルゴリズム(コード)の詳細な説明
KNNアルゴリズムの一般的なプロセス
(1)データの収集:任意の方法を使用できます
(2)データの準備:距離の計算に必要な値、できれば構造化データ形式
(3)データの分析:任意の方法を使用できます
(4)トレーニングアルゴリズム:このステップは適していませんKNN
(5)テストアルゴリズム:エラー率を計算します
(6)アルゴリズムを使用します:最初にサンプルデータと構造化された出力結果を入力し、次にKNNを実行して入力データが属するカテゴリを決定し、最後に後続の処理を計算されたカテゴリに適用します。
アルゴリズムの一般的な操作
不明なカテゴリ属性のデータセット内の各ポイントに対して次の操作を1回実行します:
(1)既知のカテゴリのデータセット内のポイントと現在のポイント間の距離を計算します;
(2)距離の昇順に従って並べ替えます;
(3)選択して現在の最小のポイント距離を持つkポイント
(4)最初のKポイントが配置されているカテゴリの出現頻度を決定します
(5)最初のKポイントの出現頻度が最も高いカテゴリを現在のポイントの予測分類として返します
データセットを作成する
from numpy import *
import operator
def createDataset():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
4つのデータポイントを使用した簡単な例。
KNNアルゴリズム
def classify0(inX, dataSet, labels, k):
#计算出欧氏距离数组
dataSetSize = dataSet.shape[0] #获取数据集中数据的个数
diffMat = tile(inX,(dataSetSize,1))-dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis = 1)
distances = sqDistances**0.5
sortedDisiIndicies = distances.argsort()
#选择k个距离最小的点
classCount = {
}
for i in range(k):
voteIlabel = labels[sortedDisiIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#排序:将classCount字典分分解为元组列表,使用运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
詳細コード
1、 diffMat = tile(inX,(dataSetSize,1))-dataSet
要素の配列を作成[inX x -A x、inX y -A y ]
tile(A、reps)関数:
A repsを繰り返す配列を作成
Examples
-------------------------------------------------------------
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2)
array([[1, 2, 1, 2],
[3, 4, 3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
[3, 4],
[1, 2],
[3, 4]])
>>> c = np.array([1,2,3,4])
>>> np.tile(c,(4,1))
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])
-----------------------------------------------------------
2、 sqDistances = sqDiffMat.sum(axis = 1) #计算每行的和
合計関数:
axis = 0の場合、列ごとに合計を計算し、axis = 1の場合、行ごとに合計を計算します
3、 sortedDisiIndicies = distances.argsort()
argsort関数:
この配列を並べ替えるインデックスを返します(並べ替え後、元の配列要素の順序を変更せずにインデックスを返します)。
4、 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #统计k个数据里每个标签的频率
関数を取得します。
dict.get(key、default = None)
パラメータ
key
-辞書で検索するキー。
default
–指定されたキーの値が存在しない場合、デフォルト値が返されます。
戻り値は
指定されたキーの値を返しますNone
。値が辞書にない場合はデフォルト値を返します。
5、 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse = True)
Sorted関数:Sorted
()関数は、すべての反復可能なオブジェクトをソートします。
Sorted(iterable
[、cmp
[、key
[、reverse
]]])
iterable
は反復可能なオブジェクトで
cmp
あり、比較関数です。
key
関数またはラムダ関数として。したがって、キーパラメータ
reverse
が並べ替えの方向、reverse = Trueの降順、reverse = Falseの昇順の場合、itemgetterを使用できます。
itemgetter関数:
>>>itemgetter(1)([3,4,5,2,7,8])
> 4
>>>itemgetter(4)([3,4,5,2,7,8])
> 7
>>>itemgetter(1,3,5)([3,4,5,2,7,8])
>(4,2,8)
operator.itemgetter関数
operatorモジュールによって提供されるitemgetter関数は、オブジェクトのどの次元のデータを取得するために使用され、パラメーターはいくつかのシリアル番号です。以下の例を参照してください
a = [1,2,3]
>>> b=operator.itemgetter(1) #定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b=operator.itemgetter(1,0) #定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(2, 1)
要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
コードテスト
if __name__ == "__main__":
group, labels=createDataset()
print(classify0([0,0], group, labels, 3))