发布于2019-08-06 10:30 阅读(1420) 评论(0) 点赞(0) 收藏(4)
K-邻近法 :
手头需要样本数据, 有了样本数据才能建立分类函数
第一步:导入样本数据
K-近邻算法具体思想
(1)计算已知类别数据集中的点于点当前之间的距离
(2)按照距离递增顺序排序
(3)选取与当前距离最小的K个点
(4)确定K个点所在类别出现的频率
(5)返回k个点中出现频率最高的类别座位当前点的预测分类
导入数据样本:
代码:
from numpy import *
import operator
'''
numpy 科学计算和运算符运算魔魁啊, numpy 函数库是python开发环境的一个独立模块,
K-近邻算法,想要运用这个算法进行分类
手头需要样本数据, 有了样本数据才能建立分类函数
第一步:导入样本数据
K-近邻算法具体思想
(1)计算已知类别数据集中的点于点当前之间的距离
(2)按照距离递增顺序排序
(3)选取与当前距离最小的K个点
(4)确定K个点所在类别出现的频率
(5)返回k个点中欻西安频率最高的类别座位当前点的预测分类
'''
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['A','A','B','B']
return group, lables
K-邻近法具体实现:
from numpy import *
import operator
import KNN
group,labels = KNN.createDataSet()
def classify(inX, dataSet, labels, k):
print("dataSet")
print(dataSet)
dataSetSize = dataSet.shape[0] #f返回的是一个是一个(行,列)形式的元组 【1,2,3】 【4,5,6】 组成一个两行三列的矩阵 shape就是[2,3] shape[0]就是2 shape[1]就是3
print("dataSetSize")
print(dataSetSize)
print("inX:")
print(tile(inX, (dataSetSize, 1))) #
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #tile 用法查看光放文档 numpy title
print("diffMat")
print(diffMat)
sqDiffMat = diffMat ** 2
print("sqDiffMat:")
print(sqDiffMat)
sqDistances = sqDiffMat.sum(axis=1) #axis=1以后就是将一个矩阵的每一行向量相加 1 1.44 这一行加起来就是2.44
print("sqDistances:")
print(sqDistances)
distances = sqDistances ** 0.5
print("distances")
print(distances)
sortedDistances = distances.argsort() #数组值从小到大的索引值>> x = np.array([3, 1, 2]) np.argsort(x) array([1, 2, 0])
print("sortedDistances:")
print(sortedDistances)
classCount = {}
for i in range(k):
print("i:")
print(i)
print("sortedDistances[i]:")
print(sortedDistances[i])
numOflabel = labels[sortedDistances[i]] #距离从小到大的下标分别是多少 下标对应的是A 还是B
print(numOflabel)
classCount[numOflabel] = classCount.get(numOflabel, 0) + 1
print("ckassCount:")
print(classCount)
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #operator.itemgetter(1) 获取对象第一个域的值 字典第一个就是key 这里是A或者B
print("sortedClassCount:")
print(sortedClassCount)
return sortedClassCount[0][0]
my = classify([0, -0.1], group, labels, 3) # 找周围的3个点出现最多的是 就是这个的类 K-邻近法实现分类器
print(my)
再提供一份
from numpy import *
import operator
#生成数据集
def createDataSet():
data = array([[1.1,1.0],[1,1],[0,0],[0,0.2]])
lables = ['A','A','B','B']
return data,lables
# 定义分类器参数介绍:
# inX 分类的输入向量[0,1]
# lables 指的是数据所属于的分类,['A','A','B','B']
# k是选中k个点 3
# dataSet指的是数据矩阵array([1,1.1],[1.0,1.0],[0,0],[0,0.2]])
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 求出坐标x,y差值
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
# 求出差值平方 difx**2 ,dify**y
sqDiffMat = diffMat**2
# 求出坐标差值的平方和
sqDistance = sqDiffMat.sum(axis=1)
# 平方和开根号就是与inX 真正相差的距离
distance = sqDistance**0.5
# 将distance排序,返回排序后的index这样可以定位到lable
sortedDistance = distance.argsort()
print(sortedDistance)
#选择距离最小的k个点
classCount = {} #dict 字典
for i in range(k):
#选出距离最小排序后的 所属类型
voteLable = labels[sortedDistance[i]]
# 相当于 map 如果能取出 +1 不能默认是0
classCount[voteLable] = classCount.get(voteLable, 0) + 1
print(classCount.items())
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
data,lables = createDataSet()
my = classify0([1,1], data, lables, 3)
print(my)
计算过程可以参考:点击打开链接
注:上面用到的函数:
from numpy import *
tile(A,n),功能是将数组A重复n次,构成一个新的数组
tile是numpy包的一个函数,功能数数组重复;
tile(2,(2,2))
上面的意思是将2编程两行 2列:
shape:
它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度
对于举证来说 shape[0] 是计算矩阵的行数 shape[1]是计算矩阵的列数
argsort()方法
x.argsort()函数是将x中的元素从小到大排列,返回的是排序后的x对应的index(索引)
python中对列表的排序方法 sort sorted
sort 是对列表进行原位排序
sorted是对列表进行排序,返回的是一个链表
sorted()带一些参数
operator.itemgetter(第几个参数)
reverse 是否需要翻转 从大到小还是从小到大排序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=operator.itemgetter(2),reverse=True)
Python 中矩阵乘法和 列表乘法的不同:
dict.items()方法
作者:精灵
链接:https://www.pythonheidong.com/blog/article/7714/53bc9c17784bbaaad6bc/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!