优点: 精度高,对异常值不敏感
缺点: 计算复杂度高,空间复杂度高,对数据的局部结构非常敏感
所需数据源: 数值型和标称型
通常k为不大于20的整数
计算已知类别数据集中的点与当前未知类别点之间的距离
按照距离递增次序排序
选取与当前点距离最小的k个点
确定前k个点所在类别的出现频率
返回前k个点出现频率最高的类别作为当前点的预测分类
打斗镜头出现数量(次) | 亲吻镜头出现数量(次) | 电影类型 |
---|---|---|
2 | 10 | 爱情片 |
3 | 15 | 爱情片 |
4 | 11 | 爱情片 |
5 | 13 | 爱情片 |
5 | 14 | 爱情片 |
15 | 3 | 动作片 |
14 | 5 | 动作片 |
10 | 2 | 动作片 |
18 | 4 | 动作片 |
11 | 2 | 动作片 |
将得到的所有d进行递增次序排序,取前k个点,前k个点所在类别的出现频率高的那个类别即为对未知量的分类类别。
数值归一化
newValue=(oldValue−min)/(max−min)
0.2308=(5−2)/(15−2)
每1行为执行过的命令,每100行为一个集合。
其中如果某个集合(每100行)中出现至少1个异常命令,即整个集合被标记为1
cmd_list = [['cpp','sh',...,'col'],['sh',...,'windows'],...['mailbox','ksh',...'ls']]
len(cmd_list) = 150
frequency_list = FreqDist(list(cmd_list)).keys()
frequency_list = ['vacation', 'sh', 'sendmail', 'cpp', 'xrdb', 'mkpts', 'test',....]
y = list()
a = open('sign.txt')
for line in a.readlines():
line=line.strip('n')
y.append(line)
user_cmd_feature = list()
for every_cmd_list in cmd_list:
v = [0]*len(frequency_list)
# 将按频率排序的所有的命令初始为0
for i in range(0, len(frequency_list)):
if list(frequency_list)[i] in every_cmd_list:
# 判断按频率排序的所有的命令是否在每组命令中出现过
v[i] += 1
user_cmd_feature.append(v)
#训练样本数
N = 90
x_train = user_cmd_feature[:N]
y_train = y[:N]
# 训练数据集
x_test = user_cmd_feature[N:]
y_test = y[N:]
# 测试数据集
neigh = KNeighborsClassifier(n_neighbors=3)
# 此处设置k=3
neigh.fit(x_train, y_train)
y_predict = neigh.predict(x_test)
# 传入测试数据
print(y_predict)
# 测试数据计算结果
score=np.mean(y_test==y_predict)*100
print(score)
# 正确率
《web安全之机器学习入门》[https://item.jd.com/12158965.html]
《深度学习》[https://item.jd.com/12128543.html]
赠书福利
关注MLSRC官方微博,将有机会获赠深度学习领域奠基性的经典畅销书
---《深度学习》
截止时间:11月15日18:00