程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

【机器学习】Python 3.0 简单实现K-邻近法

发布于2019-08-06 10:30     阅读(1302)     评论(0)     点赞(0)     收藏(4)


知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

 

Python 3.0 简单实现K-邻近法

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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

0 0
收藏该文
已收藏

评论内容:(最多支持255个字符)