标签:KNN 机器 距离 dataSet 学习 算法 input 度量
机器学习(五)
3.1 KNN算法
**
- KNN算法又称为最近邻算法,主要基于测量不同特征值之间的距离方法进行分类,KNN算法可以对数据进行分类和回归处理。
**
3.2 KNN算法核心三要素
**
- 距离度量
- k取值
- 分类规则
**
3.2.1 邻近度度量
考虑的是两个点之间的距离,越相似,代表两个点距离越近。
1. 单个属性的度量
采用相似度度量,相似度s在0和1 之间取值,0代表不相似,1代表完全相似。另外还可以用相异度度量,方法同理,有时也在0和∞之间取值。
2. 二元数据的相似性度量
两个仅包含二元属性的对象之间的相似性度量也称为相似系数,并且通常在0和1之间取值,方法同理。
3. 对于两个n维向量
如果是直接物理量,可以用欧式距离、曼哈顿距离、闵可夫斯基距离方法等计算两个n维向量之间的距离。
4.对于文本分类而言,一般可以采用余弦定理计算两个n维向量之间的夹角确定相似度
3.2.2 如何选择k值
**
- k值较小,相当于用较小邻域中的训练实例进行预测。
**
- 应用中,一般选择较小的k值并且k取奇数,通常采用交叉验证的方法选取最合适的k值。
3.2.3 分类决策规则
KNN算法可以进行回归和分类预测,处理过程类似,区别主要是决策规则不同。
- 做回归时:一般选择平均法,即最近的k个样本的样本输出的平均值作为回归预测值;
- 做分类预测时:通常采用多数表决法,即训练集里和预测的样本特征最近的k个样本,决策类别时,预测为有最多类别数的类别。
3.3 Python实现KNN算法
from numpy import *
import operator
# 定义创建数据集函数
def createDataSet():
# 数据存储到数组变量group中
group = array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]])
# 定义标签变量
labels = ['A', 'A', 'B', 'B']
return group,labels
# 通过使用KNN算法进行分类
def classify(input,dataSet,label,k):
# 定义存储数据集数组第一维度的长度的变量
dataSize = dataSet.shape[0]
# 计算欧氏距离,tile(A,rep)的功能是重复A的各个维度
diff = tile(input,(dataSize,1)) - dataSet
sqdiff = diff ** 2
# 行向量分别相加,从而得到一个新的行向量
squareDist = sum(sqdiff,axis=1)
# 得到欧氏距离
dist = squareDist ** 0.5
# 对距离进行排序,argsort()根据元素的值排序,返回下标
sortedDistIndex = argsort(dist)
print(sortedDistIndex)
# 定义空字典
classCount={}
for i in range(k):
# 返回距离最近的k个点对应的标签值
voteLabel = label[sortedDistIndex[i]]
# 存放到字典当中
classCount[voteLabel] = classCount.get(voteLabel,0)+1
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
编写测试程序,验证一下效果:
import KNN
from numpy import *
dataSet,labels = KNN.createDataSet()
input = array([1.1,0.3])
k = 3
output = KNN.classify(input,dataSet,labels,k)
print("测试数据为:",input,"分类结果为:",output)
标签:KNN,机器,距离,dataSet,学习,算法,input,度量 来源: https://blog.csdn.net/weixin_43693650/article/details/120411569
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。