机器学习实战_初识kNN算法_理解其python代码

简介: 机器学习实战_初识kNN算法_理解其python代码

这是经过我修改后能在python3.0中完美运行的KNN project,可以直接拿来学习:
http://download.csdn.net/download/qq_36396104/10142842

以下为我搜索后结合自己的想法编写,如有侵权,可联系我核实后删除(恕我小白一只~)

(一)

python基础:

numpy:

1、shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。

2、tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,具体有:

得到一个数组![]

11796a04387d601c74560ba4fdddb5fd_SouthEast.jpg

得到一个一维数组![]

d295c24b766939064234be0b33e8d24b_SouthEast.jpg

得到一个二维数组![]

f23c3a4c8e7a2facf4189c13d10f6e0f_SouthEast.jpg

注意和

matrix([[0,1,2],

[0,1,2]])区分,虽然它们形式上看上去是一致的

3、1. Python 自己的sum()

输入的参数首先是[],输入的是数组

>>> sum([0,1,2])  
3  
>>> sum([0,1,2],3)  
6  
>>> sum([0,1,2],[3,2,1])  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
TypeError: can only concatenate list (not "int") to list 

2.python的 numpy当中

现在对于数据的处理更多的还是numpy。没有axis参数表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加

这里面输入的可以是矩阵

>>> import numpy as np  
>>> a=np.sum([[0,1,2],[2,1,3]])  
>>> a  
9  
>>> a.shape  
()  
>>> a=np.sum([[0,1,2],[2,1,3]],axis=0)  
>>> a  
array([2, 2, 5])  
>>> a.shape  
(3,)  
>>> a=np.sum([[0,1,2],[2,1,3]],axis=1)  
>>> a  
array([3, 6])  
>>> a.shape  
(2,)  

4、argsort()的用法:

[4,5,1]中,‘4’的索引是0,‘5’的索引是1,‘1’的索引是2。

从小到大排列,就是1、4、5,对应索引就是2、0、1(0是指list【4,5,1】中的第0个数,我才开始还以为是系统中的4对应的是0,憋笑俺>﹏<)

PS:argsort函数返回的是:数组值从小到大的索引值

5、列表、元组、字典的区别及使用:

(1)列表

(2)元组

(3)字典

6、range()函数:

>>> range(1,5) #代表从1到5(不包含5)
[1, 2, 3, 4]
>>> range(1,5,2) #代表从1到5,间隔2(不包含5)
[1, 3]
>>> range(5) #代表从0到5(不包含5)
[0, 1, 2, 3, 4]

简单的KNN算法:

def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()#得到测试集和样本集的从小到大的距离
    classCount = {}
    #print(distances)
    #print(0 , sortedDistIndicies)
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        #print(1 , voteIlabel)
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1#搜索字典classCount中的voteIlabel,如果存在则加1,不存在则创建
        #print(2 ,classCount)
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    print(sortedDistIndicies)
    return sortedClassCount[0][0]

(二)

python基础:

1、zeros()

>>> np.zeros(5)
array([ 0.,  0.,  0.,  0.,  0.])
>>> np.zeros((5,), dtype=np.int)
array([0, 0, 0, 0, 0])
>>> np.zeros((2, 1))
array([[ 0.],
       [ 0.]])
>>> s = (2,2)
>>> np.zeros(s)
array([[ 0.,  0.],
       [ 0.,  0.]])
>>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype
array([(0, 0), (0, 0)],
      dtype=[('x', '<i4'), ('y', '<i4')])

2、strip():

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。

3、list

从所给文本中解析数据
def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #get the number of lines in the file
    returnMat = zeros((numberOfLines,3))        #prepare matrix to return
    classLabelVector = []                       #prepare labels return
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]#将listFormLine的前三行复制给returnMat的第indeX行
        classLabelVector.append(listFromLine[-1])#存储所给数据的最后一行
        index += 1
    n = 0
    for element in classLabelVector:
        if element == "largeDoses":
            classLabelVector[n] = 3;
            n += 1
        if element == "smallDoses":
            classLabelVector[n] = 2;
            n += 1
        if element == "didntLike":
            classLabelVector[n] = 1;
            n += 1
    return returnMat,classLabelVector
#Test:
import matplotlib.pyplot as plt
from numpy import array
import CreateDateSet
datingDataMat,datingLabels=CreateDateSet.file2matrix('datingTestSet.txt')
# print(datingDataMat)
fig =plt.figure()
ax = fig.add_subplot(111)
# print(datingDataMat[:,1])
# print(datingDataMat[:,2])
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

(三)

from numpy import *
"""归一化数值"""
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
   # normDataSet = zeros(shape(dataSet))#书上多余的代码,但有助于理解算法
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m,1))#为归一化做准备
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide,归一化
    return normDataSet, ranges, minVals

(四)留出法测试算法和数据集

from CreateDateSet import file2matrix
from HandleDate import autoNorm
from kNN import classify0
hoRatio = 0.10      #hold out 10%,留出法,用10%作为测试集
datingDataMat,datingLabels = file2matrix('datingTestSet.txt')       #load data setfrom file
normMat, ranges, minVals = autoNorm(datingDataMat)#归一化
m = normMat.shape[0]
numTestVecs = int(m*hoRatio)#得到的100个测试集
errorCount = 0.0
for i in range(numTestVecs):#从第一个到第100个
    classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)#使用knn算法分类
    print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))#得到结果
    if (classifierResult != datingLabels[i]): errorCount += 1.0
print('the total error rate is: %f' % (errorCount / float(numTestVecs)))
print(errorCount)

AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
8月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
727 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
8月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
8月前
|
机器学习/深度学习 缓存 算法
微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地
本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
|
9月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
9月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
8月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1391 12
Scikit-learn:Python机器学习的瑞士军刀
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
939 8

推荐镜像

更多