KNNアルゴリズム
61756 ワード
KNNとは
KNN(K-nearest neighbor)、すなわちK近隣アルゴリズムである.その動作原理は非常に簡単です.
例えば、映画に登場する戦闘シーンとキスシーンの数によって、恋愛映画とアクション映画に分けられるトレーニングセットのデータがあります.
映画のタイトル
ファイト?シーン
キスシーン
映画の種類
California Man
3
104
ラブ映画
He's Not Really into Dudes
2
100
ラブ映画
Beautiful Woman
1
81
ラブ映画
Kevin Longblade
101
10
アクションフィルム
Robo Slayer 3000
99
5
アクションフィルム
Amped II
98
2
アクションフィルム
?
18
90
不明
では、次のような未知の映画をどのように分類しますか?
映画のタイトル
ファイト?シーン
キスシーン
映画の種類
?
18
90
不明
KNNは、新しいデータの各特徴をサンプルセットの各サンプルと比較する、サンプルとの距離を算出する方法を採用する.そしてk個の距離が最も近いサンプルを探し出す.これらのサンプルが属する分類が最も多い分類は、そのデータの分類である.
例えば、映画「?」上記サンプルセットの各サンプルと計算する、距離を得る.Kが3を取ると「?3つの恋愛映画との距離が一番近いので、「?ラブ映画でもあります.
アルゴリズムを以下に示す.
アルゴリズムの詳細
PythonでKNNアルゴリズムを実現し、上述の分類問題を解決した.
まず、アルゴリズムで使用されるデータセットを生成します.
然后写出 KNN 分类算法:
KNN 算法在使用的时候,一般需要对特征数据进行归一化处理:
KNN(K-nearest neighbor)、すなわちK近隣アルゴリズムである.その動作原理は非常に簡単です.
例えば、映画に登場する戦闘シーンとキスシーンの数によって、恋愛映画とアクション映画に分けられるトレーニングセットのデータがあります.
映画のタイトル
ファイト?シーン
キスシーン
映画の種類
California Man
3
104
ラブ映画
He's Not Really into Dudes
2
100
ラブ映画
Beautiful Woman
1
81
ラブ映画
Kevin Longblade
101
10
アクションフィルム
Robo Slayer 3000
99
5
アクションフィルム
Amped II
98
2
アクションフィルム
?
18
90
不明
では、次のような未知の映画をどのように分類しますか?
映画のタイトル
ファイト?シーン
キスシーン
映画の種類
?
18
90
不明
KNNは、新しいデータの各特徴をサンプルセットの各サンプルと比較する、サンプルとの距離を算出する方法を採用する.そしてk個の距離が最も近いサンプルを探し出す.これらのサンプルが属する分類が最も多い分類は、そのデータの分類である.
例えば、映画「?」上記サンプルセットの各サンプルと計算する、距離を得る.Kが3を取ると「?3つの恋愛映画との距離が一番近いので、「?ラブ映画でもあります.
アルゴリズムを以下に示す.
アルゴリズムの詳細
PythonでKNNアルゴリズムを実現し、上述の分類問題を解決した.
まず、アルゴリズムで使用されるデータセットを生成します.
def createDataSet():
'''
'''
group = np.array([[3, 104], [2, 100], [1, 81], [101, 10],[99, 5], [98, 2]])
labels = ['A', 'A', 'A', 'D','D', 'D']
return group, labels
def classify0(inX, dataSet, labels, k):
'''
KNN
:param inX:
:param dataSet:
:param labels:
:param k:
:return:
'''
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
print(sortedClassCount)
return sortedClassCount[0][0]
def autoNorm(dataSet):
'''
:param dataSet:
:return:
'''
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minVals, (m, 1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minVals
def plot(dataSet):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataSet[:, 0], dataSet[:, 1])
plt.show()
整体代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import operator
import matplotlib
import matplotlib.pyplot as plt
def createDataSet():
'''
'''
group = np.array([[3, 104], [2, 100], [1, 81], [101, 10],[99, 5], [98, 2]])
labels = ['A', 'A', 'A', 'D','D', 'D']
return group, labels
def classify0(inX, dataSet, labels, k):
'''
KNN
:param inX:
:param dataSet:
:param labels:
:param k:
:return:
'''
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
print(sortedClassCount)
return sortedClassCount[0][0]
def autoNorm(dataSet):
'''
:param dataSet:
:return:
'''
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - np.tile(minVals, (m, 1))
normDataSet = normDataSet/np.tile(ranges, (m,1))
return normDataSet, ranges, minVals
def plot(dataSet):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataSet[:, 0], dataSet[:, 1])
plt.show()
if __name__ == '__main__':
dataSet, labels = createDataSet()
dataSet, _, _ = autoNorm(dataSet)
print(dataSet)
plot(dataSet)
print(classify0([18, 90], dataSet, labels,4))
KNN
KNN . KNN . ,KNN , .