# -*- coding: utf-8 -*-
"""
1. 直接用.shape可以快速读取矩阵的形状(几乘几),使用shape[0]读取矩阵第一维度的长度
print(shape(group))
print(group.shape[0])
2. 比如 a = np.array([0,1,2]),
np.tile(a,(2,1))就是把a先沿x轴(就这样称呼吧)复制1倍,即没有复制,仍然是 [0,1,2]。
再把结果沿y方向复制2倍,
即: array([[0,1,2],
[0,1,2]])
3. values(),keys(),items(),返回值都为一个list
>>> dict = { 1 : 2, 'a' : 'b', 'hello' : 'world' }
>>> dict.values()
['b', 2, 'world']
>>> dict.keys()
['a', 1, 'hello']
>>> dict.items()
[('a', 'b'), (1, 2), ('hello', 'world')]
输出顺序不是我们保存的顺序,而是python内部的顺序
4. sorted(iterable,key,reverse),
sorted一共有iterable,key,reverse这三个参数。
其中iterable表示可以迭代的对象,例如可以是 dict.items()、dict.keys()等,
用sorted对字典排序
方法一:
sort(dict.items(), key = lambda x:x[1], reverse = True)
lambda x:y 其中x表示输出参数,y表示lambda 函数的返回值
所以 x[0]表示按键 x[1]表示按值
方法二:
import operator
sorted(dict.items(),key = operator.itemgetter(1), reverse = True)
key = operator.itemgetter(1),根据字典的值进行排序
key = operator.itemgetter(0),根据字典的键进行排序
reverse 默认升序,为False升序,为True降序
"""
import numpy as np
import operator
"""
group 数据集 (打斗数,接吻数),即特征矩阵
labels 分类标签
"""
def createDataSet( ):
group = np.array([
[1, 101],
[5, 89],
[108, 5],
[115, 8] ])
labels = ['爱情片', '爱情片', '动作片', '动作片']
return group, labels
"""
函数说明:Knn算法
Paramaters:
inX 测试集 kNN测试集的意义:单个样本
dataSet 训练集 kNN训练集的意义:用来比较的那些数据集
labels 分类标签 kNN分类标签的意义:用来比较的数据集对应的真实标签
k kNN算法参数
"""
def classify(inX, dataSet, labels, k):
#numpy函数shape[0]返回行数。shape[1]返回列数
dataSetSize = dataSet.shape[0]
#使测试集和训练集的行列一样,这样才能相减
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
#测试集和训练集相减后平方
sqDiffMat = diffMat ** 2
#sum():所有元素相加。其中,sum(axis=0)表示列相加, sum(axis=1)表示行相加
sqDistances = sqDiffMat.sum(axis=1)
#开方,计算出距离
distances = sqDistances ** 0.5
#返回从小到大排序后的索引值
sortDistIndex = distances.argsort()
#定义一个记录类别次数的字典
classCount = {}
for i in range(k):
voteIlabel = labels[ sortDistIndex[i] ]
#dict.get(key, default = None)
#返回指定键的值,若不存在返回默认值
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortClassCount = sorted(classCount.items(), key = operator.itemgetter(1),reverse = True)
#sortClassCount = sorted(classCount.items(), key = lambda x:x[1], reverse = True)
return sortClassCount[0][0]
"""
if __name__ == '__main__'的意思是:
当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
细节:
__main__等于当前执行文件的名称(包含了后缀.py)
__name__
1. 以模块直接运行,为当前文件名,包含.py
2. 以模块导入,为模块名,不包含.py
"""
if __name__ == '__main__':
group, labels = createDataSet()
test = [101, 20]
test_class = classify(test, group, labels, 3)
print(test_class)
"""
总结kNN算法的优缺点
优点:
简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
可用于数值型数据和离散型数据;
训练时间复杂度为O(n);无数据输入假定;
对异常值不敏感
缺点
计算复杂性高;空间复杂性高;
样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。
最大的缺点是无法给出数据的内在含义。
"""
kNN ( 一 )
猜你喜欢
转载自blog.csdn.net/Lightlock/article/details/84451085
今日推荐
周排行