python机器学习k临近算法

该博客介绍了如何使用Python实现K-近邻(K-Nearest Neighbors, KNN)算法,包括数据预处理、距离计算和分类。通过示例代码展示了从文件读取数据、归一化处理和分类过程。" 107312714,9262991,构建离线文章画像与关键词提取,"['数据挖掘', '自然语言处理', '信息检索', '数据分析', '大数据处理']
#-*-coding:utf-8-*-
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def file2matrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()#读取文件的所有内容转换成一个行的列表
numberOfLines=len(arrayOLines)
returnMat=zeros((numberOfLines,3))#生成一个numberoflines行3列全是0的矩阵
classLabelVector=[]
index=0
for line in arrayOLines:
line=line.strip()#去除两侧的空格
listFromLine=line.split('\t')#将字符串分割成序列
returnMat[index,:]=listFromLine[0:3]#选取前三个元素,存储在特征矩阵中
classLabelVector.append(int(listFromLine[-1]))#将列表的最后一列存储到向量classLabelVector中
index+=1
return returnMat,classLabelVector


def autoNorm(dataSet):
minVals=dataSet.min(0)#参数0使得函数可以从列中选取最小值
maxVals=dataSet.max(0)
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))#创建一个和dataset一样大小的矩阵初始化为0
m=dataSet.shape[0]#返回dataset第一维的长度
normDataSet=dataSet-tile(minVals,(m,1))#tile函数将变量内容复制成同样大小的矩阵
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals



def classify0(inX, dataSet, labels, k):    # #inX是你要输入的要分类的“坐标”,dataSet是上面createDataSet的array,
                                           #就是已经有的,分类过的坐标,label是相应分类的标签,k是KNN,k近邻里面的k  
    dataSetSize = dataSet.shape[0]   #shape函数返回读取矩阵第一维的长度
    diffMat = tile(inX, (dataSetSize,1)) - dataSet #前面用tile,把一行inX变成4行一模一样的
                                              #(tile有重复的功能,dataSetSize是重复4遍,
      #后面的1保证重复完了是4行,而不是一行里有四个一样的),
                                              #然后再减去dataSet,是为了求两点的距离,先要坐标相减,这个就是坐标相减  
    sqDiffMat = diffMat**2 #上一行得到了坐标相减,然后这里要(x1-x2)^2,要求乘方 
    sqDistances = sqDiffMat.sum(axis=1)  #axis=1是列相加,这样得到了(x1-x2)^2+(y1-y2)^2 
    distances = sqDistances**0.5 #开根号,这个之后才是距离  
    sortedDistIndicies = distances.argsort()  #argsort是排序,将元素按照由小到大的顺序返回下标,比如([3,1,2]),它返回的就是([1,2,0])    
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  #get是取字典里的元素,
                       #如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,
                       #如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,
#这个点是哪个类别哪个类别就加1  
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
                                      #key=operator.itemgetter(1)的意思是按照字典里的第一个排序,
                                      #{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序  
    return sortedClassCount[0][0] #返回类别最多的类别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值