机器学习--diy笔记与感悟--①k-临近算法(代码片段)

Pinging_Goooooo Pinging_Goooooo     2022-10-20     573

关键词:

 

##“计算机出身要紧跟潮流”

机器学习作为如今发展的趋势需要被我们所掌握。而今我也需要开始learn机器学习,并将之后的所作所想记录在此。

 

今天我开始第一课--K临近算法

 

一、k-临近的基础概念理解

学习开始前,我将用最简单的话来解释k-临近算法的思想。

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

简单来说,当我们有一定数量的训练值后(例如 Y1(a,b),Y2(c,d),Y3(e,f).....这些数据属于不同的类型)我们就可以把这些点画到二维坐标系中,然后当你拿到一个新的未知数据类型的数据时,你可以把X(x1,x2)放到坐标系上,并测出未知量X与坐标系中所有点的距离,取最近的k个点(这个k是你自己设置的)。之后取这K个值中类型占比最大的那一个作为未知X的类型。

下面是算法的流程总结:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

 

 

二、KNN算法设计

这里首先将这个基础的knn算法用python写出来,我这里使用了python-2.7.10的版本。

这里是用了knn算法,测试样例是四个电影,共有两种类型,每种电影均有两个参数(电影中打斗次数与亲吻次数---二维的数据)。

最终实现给出某一部电影的打斗次数+亲吻次数来预测这是什么类型的电影。

#coding:utf-8
import operator
import numpy as np
def createData():
    group = np.array([[1,101],[5,89],[108,5],[115,8]])
    labels = [\'爱情片\',\'爱情片\',\'动作片\',\'动作片\']
    return group, labels


#-----------------------------

def classfy(X,dataArray,labels,k):
    dataSize = dataArray.shape[0]
#传入dataArray二维数组的行数
    diffMat = np.tile(X,(dataSize,1)) - dataArray
#tile函数是将X这个数组以在二维里重复datasize次:https://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html
    squareMat = diffMat**2
#将diffMat平方(为了算距离)
    square_add_Mat = squareMat.sum(axis=1)
#axis=1就是将一个矩阵的每一行向量相加,例如a = np.array([[0, 2, 1]]),print a.sum(axis=1)得到[3](0+1+2)
    distances = square_add_Mat**0.5
#这样就得到了X点与坐标中所有点的距离数组----((X1-X2)^2+(Y1-Y2)^2)^0.5
    sortDistances = distances.argsort()
#将distances从小到大排列出来,返回索引值
    arrayLength = len(sortDistances)
#数据量的个数
    classCount = 
    for i in range(k):
        currentLabel = labels[sortDistances[i]]
        classCount[currentLabel] = classCount.get(currentLabel,0) + 1 
#classCount中放的是键值对,键(为label),值(为出现的次数),get为得到当前classcount数组中为currentLabel这个键的值。
    
    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    
#http://www.runoob.com/python/python-func-sorted.html   这是sorted的具体用法。
#classCount.iteritems()为将classCount变为字典;key=operator.itemgetter(1)为以第二个参数为基准进行排序(这里指的就是键值对里的值,既按照出现的次数进行排序)。
    
    return sortedClassCount[0][0]
#返回结果

#-------------------------------------
if __name__ == \'__main__\':
    group, labels = createData()
#创建数据
    test = [101,20]
    k = 3
#knn的k值,可以自行设计
    test_process = classfy(test,group,labels,k)
    print test_process

    

 

 

 

结果得到

 

 

三、具体实战(由现有数据预测约会成功率)

  背景:

海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人。经过一番总结,她发现自己交往过的人可以进行如下分类:

  • 不喜欢的人
  • 魅力一般的人
  • 极具魅力的人

    海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。

    海伦收集的样本数据主要包含以下3种特征:

  • 每年获得的飞行常客里程数
  • 玩视频游戏所消耗时间百分比
  • 每周消费的冰淇淋公升数

数据具体样子:

所以我们要根据前三列数据与最后一列的结果来预测女主对一个全新数据的态度。

 

①第一步,我们要将这个txt文档处理为我们能使用的格式:

def fileToUseful(filename):
    f = open(filename)
    fLines = f.readlines()
    fLinesRows = len(fLines)
    Arrays = np.zeros((fLinesRows,3))
#zeros是用来创建fLinesRows行3列的全0矩阵
    classLabel = []
#从来储存第三列的“喜欢与否”的标签
    index = 0
    for line in fLines:
        line = line.strip()
        line = line.split(\'\\t\')
#将line中的\'\\n\'、空格均去掉
        Arrays[index,:] = line[0:3]
#将line中前3个数保存到Array的第index行中
        if line[-1] == \'didntLike\':
            classLabel.append(1)
        if line[-1] == \'smallDoses\':
            classLabel.append(2)
        if line[-1] == \'largeDoses\':
            classLabel.append(3)
        index += 1 
        
    return Arrays,classLabel
#----将txt文档中数据处理为可利用---- 

得到了结果

。。。是中间省略了其他的许多组数据

下面是将喜欢与否的三种结果抽象化为数字:

[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 2, 1, 2, 3, 2, 3, 2, 3, 2, 1, 3, 1, 3, 1, 2, 1, 1, 2, 3, 3, 1, 2, 3, 3, 3, 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, 2, 2, 3, 1, 2, 1, 2, 2, 2, 2, 2, 3, 2, 3, 1, 2, 3, 2, 2, 1, 3, 1, 1, 3, 3, 1, 2, 3, 1, 3, 1, 2, 2, 1, 1, 3, 3, 1, 2, 1, 3, 3, 2, 1, 1, 3, 1, 2, 3, 3, 2, 3, 3, 1, 2, 3, 2, 1, 3, 1, 2, 1, 1, 2, 3, 2, 3, 2, 3, 2, 1, 3, 3, 3, 1, 3, 2, 2, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 3, 2, 3, 3, 1, 2, 3, 2, 2, 3, 3, 3, 1, 2, 2, 1, 1, 3, 2, 3, 3, 1, 2, 1, 3, 1, 2, 3, 2, 3, 1, 1, 1, 3, 2, 3, 1, 3, 2, 1, 3, 2, 2, 3, 2, 3, 2, 1, 1, 3, 1, 3, 2, 2, 2, 3, 2, 2, 1, 2, 2, 3, 1, 3, 3, 2, 1, 1, 1, 2, 1, 3, 3, 3, 3, 2, 1, 1, 1, 2, 3, 2, 1, 3, 1, 3, 2, 2, 3, 1, 3, 1, 1, 2, 1, 2, 2, 1, 3, 1, 3, 2, 3, 1, 2, 3, 1, 1, 1, 1, 2, 3, 2, 2, 3, 1, 2, 1, 1, 1, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 3, 2, 3, 3, 3, 3, 1, 2, 3, 1, 1, 1, 3, 1, 3, 2, 2, 1, 3, 1, 3, 2, 2, 1, 2, 2, 3, 1, 3, 2, 1, 1, 3, 3, 2, 3, 3, 2, 3, 1, 3, 1, 3, 3, 1, 3, 2, 1, 3, 1, 3, 2, 1, 2, 2, 1, 3, 1, 1, 3, 3, 2, 2, 3, 1, 2, 3, 3, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 3, 2, 1, 1, 3, 3, 3, 2, 3, 2, 1, 1, 1, 1, 1, 3, 2, 2, 1, 2, 1, 3, 2, 1, 3, 2, 1, 3, 1, 1, 3, 3, 3, 3, 2, 1, 1, 2, 1, 3, 3, 2, 1, 2, 3, 2, 1, 2, 2, 2, 1, 1, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 3, 1, 1, 2, 2, 1, 2, 2, 2, 3, 1, 1, 1, 3, 1, 3, 1, 3, 3, 1, 1, 1, 3, 2, 3, 3, 2, 2, 1, 1, 1, 2, 1, 2, 2, 3, 3, 3, 1, 1, 3, 3, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 1, 1, 1, 1, 3, 3, 3, 3, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 3, 2, 1, 3, 2, 3, 2, 3, 2, 1, 1, 2, 3, 1, 3, 3, 3, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 3, 2, 1, 3, 3, 2, 2, 2, 3, 1, 2, 1, 1, 3, 2, 3, 2, 3, 2, 3, 3, 2, 2, 1, 3, 1, 2, 1, 3, 1, 1, 1, 3, 1, 1, 3, 3, 2, 2, 1, 3, 1, 1, 3, 2, 3, 1, 1, 3, 1, 3, 3, 1, 2, 3, 1, 3, 1, 1, 2, 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 3, 1, 1, 2, 2, 2, 3, 2, 2, 1, 2, 3, 3, 2, 3, 3, 3, 2, 3, 3, 1, 3, 2, 3, 2, 1, 2, 1, 1, 1, 2, 3, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 2, 2, 3, 3, 1, 2, 2, 2, 3, 1, 2, 1, 3, 1, 2, 3, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 2, 2, 3, 1, 3, 1, 2, 3, 2, 2, 3, 1, 2, 3, 2, 3, 1, 2, 2, 3, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 3, 2, 1, 3, 3, 3, 1, 1, 3, 1, 2, 3, 3, 2, 2, 2, 1, 2, 3, 2, 2, 3, 2, 2, 2, 3, 3, 2, 1, 3, 2, 1, 3, 3, 1, 2, 3, 2, 1, 3, 3, 3, 1, 2, 2, 2, 3, 2, 3, 3, 1, 2, 1, 1, 2, 1, 3, 1, 2, 2, 1, 3, 2, 1, 3, 3, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 1, 3, 3, 1, 1, 2, 3, 2, 2, 3, 1, 1, 1, 1, 3, 2, 2, 1, 3, 1, 2, 3, 1, 3, 1, 3, 1, 1, 3, 2, 3, 1, 1, 3, 3, 3, 3, 1, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 1, 2, 1, 2, 1, 3, 2, 1, 2, 2, 3, 1, 2, 2, 2, 3, 2, 1, 2, 1, 2, 3, 3, 2, 3, 1, 1, 3, 3, 1, 2, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 1, 1, 3, 2, 1, 2, 1, 2, 2, 3, 2, 2, 2, 3, 1, 2, 1, 2, 2, 1, 1, 2, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 2, 3, 3, 2, 2, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 3, 1, 1, 2, 3, 2, 2, 1, 3, 1, 2, 3, 1, 2, 2, 2, 2, 3, 2, 3, 3, 1, 2, 1, 2, 3, 1, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3]

 

 

②第二步,我们要将这三行数据归一化处理(就是将其归一到0~1内)

def numProcess(data):
    minData = data.min(0)
#.min(0)为返回传入数据每列的最小值,.min(1)为每行的最小,不加参数为所有数的最小值
    maxData = data.max(0)
    ranges = maxData - minData
    dataArray = np.zeros(np.shape(data))
#shape(data)---->(1000,3)   所以zeros为创建1000行3列的全0二维矩阵
    rows = np.shape(data)[0]
#rows是data数据的总行数
    dataArray = data - np.tile(minData,(rows,1))
#所有数据-当前列中最小的(为了之后的归一),这里的1时mindata的数据在行上重复一次
    dataArray = dataArray / np.tile(ranges,(rows,1))
#得到归一化数组
    return dataArray,ranges,minData,rows
#----将txt数据归一化----

 

③ 将上述测试数据与KNN算法相结合进行预测。 

 

if __name__ == \'__main__\':
    fliePath = "/Users/c-pinging/Desktop/ML-Test/KNN-约会分析/datingTestSet.txt"
    data,label = fileToUseful(fliePath)
#data为前三列数据,label为结果的标签值
    data,ranges,mindata,rows = numProcess(data)
#得到归一处理后的数据,每一列值的范围,最小值,行数
    testDataCount = int(0.1 * rows)
#测试数据的个数(因为机器学习要分为training—data与testing-data,所以取百分之十作为测试使用)
    errorCount = 0
#用来保存错误率
    #print data[2:1000]
    for i in range(testDataCount):
        classfiedConsequence = KNN_1.classfy(data[i,:],data[testDataCount:],label[testDataCount:],4)
        print "分类结果为:",classfiedConsequence
        print "真实结果为:",label[i],\'\\n\'
        if classfiedConsequence != label[i]:
            errorCount += 1
    print "此Model的正确率为: %",float(testDataCount-errorCount)/float(testDataCount)*100

 

之后我们计算得到结果:

 

在实验中我将KNN算法与实战代码分为了两个py文件。下面放出全部代码:

#coding:utf-8
import numpy as np
import KNN_1

def fileToUseful(filename):
    f = open(filename)
    fLines = f.readlines()
    fLinesRows = len(fLines)
    Arrays = np.zeros((fLinesRows,3))
#zeros是用来创建fLinesRows行3列的全0矩阵
    classLabel = []
#从来储存第三列的“喜欢与否”的标签
    index = 0
    for line in fLines:
        line = line.strip()
        line = line.split(\'\\t\')
#将line中的\'\\n\'、空格均去掉
        Arrays[index,:] = line[0:3]
#将line中前3个数保存到Array的第index行中
        if line[-1] == \'didntLike\':
            classLabel.append(1)
        if line[-1] == \'smallDoses\':
            classLabel.append(2)
        if line[-1] == \'largeDoses\':
            classLabel.append(3)
        index += 1 
    print Arrays,classLabel
    return Arrays,classLabel

#----将txt文档中数据处理为可利用----  



def numProcess(data):
    minData = data.min(0)
#.min(0)为返回传入数据每列的最小值,.min(1)为每行的最小,不加参数为所有数的最小值
    maxData = data.max(0)
    ranges = maxData - minData
    dataArray = np.zeros(np.shape(data))
#shape(data)---->(1000,3)   所以zeros为创建1000行3列的全0二维矩阵
    rows = np.shape(data)[0]
#rows是data数据的总行数
    dataArray = data - np.tile(minData,(rows,1))
#所有数据-当前列中最小的(为了之后的归一),这里的1时mindata的数据在行上重复一次
    dataArray = dataArray / np.tile(ranges,(rows,1))
#得到归一化数组
    return dataArray,ranges,minData,rows
#----将txt数据归一化----



if __name__ == \'__main__\':
    fliePath = "/Users/c-pinging/Desktop/ML-Test/KNN-约会分析/datingTestSet.txt"
    data,label = fileToUseful(fliePath)
#data为前三列数据,label为结果的标签值
    data,ranges,mindata,rows = numProcess(data)
#得到归一处理后的数据,每一列值的范围,最小值,行数
    testDataCount = int(0.1 * rows)
#测试数据的个数(因为机器学习要分为training—data与testing-data,所以取百分之十作为测试使用)
    errorCount = 0
#用来保存错误率
    #print data[2:1000]
    for i in range(testDataCount):
        classfiedConsequence = KNN_1.classfy(data[i,:],data[testDataCount:],label[testDataCount:],4)
        print "分类结果为:",classfiedConsequence
        print "真实结果为:",label[i],\'\\n\'
        if classfiedConsequence != label[i]:
            errorCount += 1
    print "此Model的正确率为: %",float(testDataCount-errorCount)/float(testDataCount)*100
    

 

 

 

PS:本文属于DIY原创,不过参考了http://blog.csdn.net/c406495762/article/details/75172850大神的blog,所以大家要看更原始的原创可以跳转过去~~

机器学习k-临近算法

程序清单一:fromnumpyimport*importoperatordefcreatDataSet():group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels=["A","A","B","B"]returngroup,labelsdefclassify0(inX,dataSet,labels,k):dataSetSize=dataSet.s 查看详情

机器学习-临近取样(k-nearestnerghbor)knn算法

学习彭亮《深度学习基础介绍:机器学习》课程最邻近规则分类(K-NearestNerghbor),KNN算法概念是分类(classification)算法步骤为了判断未知实例的类别,以所有已知实例的类别作为参考选取参数K,选取它最近的已... 查看详情

k-临近算法学习

...影划分为动作电影,爱情电影等等,本次的随笔参考了《机器学习实战》中第二章节,将电影自动进行分类。从文本文件中解析和导入数据使用matplotlib创建散点图归一化数值言归正传,首先介绍一些关于K临近算法(KNN):工作... 查看详情

机器学习实战笔记-k近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类K近邻算法特点:优点:精度高、对异常值不敏感、无数据输入假定。缺点:计算复杂度高、空间复杂度高。适用数据范围:数值型和标称型。K近邻算法原理:存在一个样本... 查看详情

ng机器学习视频笔记——k-均值算法理论

ng机器学习视频笔记(十一)——K-均值算法理论  (转载请附上本文链接——linhxx) 一、概述        K均值(K-Means)算法,是一种无监督学习(Unsupervisedlearning)算法,其核心是聚类(Clus... 查看详情

《机器学习实战》学习笔记——k近邻算法

1.numpy中一些函数的用法学习shape()用法:shape :tupleofintsTheelementsoftheshapetuplegivethelengthsofthecorrespondingarraydimensions.。  shape返回一个元组,依次为各维度的长度。shape[0]:第一维长度,shape[1]:第二维长度。  tile()用法:numpy.tile 查看详情

机器学习实战笔记-k近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果案例分析:海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数、玩视频游戏所耗时间百分比、每周消费的冰淇淋公升数。我们需要将新数据的每个新数据的每个特... 查看详情

机器学习k近邻算法(代码片段)

k临近算法(解决分类问题):  已知数据集,以及该数据对应类型  给出一个数据x,在已知数据集中选择最接近x的k条数据,根据这k条数据的类型判断x的类型具体实现:fromnumpyimport*importoperatordefcreateDataSet():group=array([[1.0,1.... 查看详情

机器学习实战笔记--k近邻算法

1#encoding:utf-82fromnumpyimport*3importoperator4importmatplotlib5importmatplotlib.pyplotasplt67fromosimportlistdir89defmakePhoto(returnMat,classLabelVector):#创建散点图10fig=plt.figure()11ax=fig.add_subpl 查看详情

机器学习2—k近邻算法学习笔记

    Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外print在Python新版本下是函数,print后面需加上一对括号,否则执行会报错。第二章代码修改如下。fromnumpyimport*imp 查看详情

机器学习笔记之一深入浅出学习k-means算法

摘要:在数据挖掘中,K-Means算法是一种clusteranalysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。在数据挖掘中,K-Means算法是一种clusteranalysis的算法,其主要是来计算数据聚集的算法,... 查看详情

《机器学习实战》读书笔记2:k-近邻(knn)算法

声明:文章是读书笔记,所以必然有大部分内容出自《机器学习实战》。外加个人的理解,另外修改了部分代码,并添加了注释1、什么是K-近邻算法?简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类。不恰当... 查看详情

机器学习-5.k-近邻算法(knn)(代码片段)

1.定义定义:所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入... 查看详情

机器学习基础概念笔记

...见算法:K-均值、最大期望算法、DBSCAN、Parzen窗设计 机器学习应用步骤:收集数据——准备输入数据——分析输入数据 查看详情

机器学习---算法---k-近邻算法

转自:https://www.cnblogs.com/Rosanna/p/3615507.html K-近邻和最近邻(K=1)是模式识别中常用的分类方法,K-近邻算法思想是找到与当前样本相邻的K个有标签样本,然后通过投票决定此样本的类别。例如下图中如何分类未知的绿色圆圈... 查看详情

机器学习实战笔记-利用k均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类。聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好簇识别给出聚类结果的含义。假定有一些数据,现在将相似数据归到一... 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第七章预测技术与哲学)7.3岭回归

7.3岭回归7.3.1验证多重共线性7.3.2岭回归理论7.3.3岭际分析7.3.4k值的判断7.3.5辅助函数 (1)导入多维数据集:加载数据集defloadDataSet(filename):numFeat=len(open(filename).readline().split(‘ ‘))-1#getnumberoffieldsdataMat=[]labelMat=[]fr=ope 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第四章推荐系统原理)kmeans

(上接第二章)  4.3.1KMeans算法流程  算法的过程如下:  (1)从N个数据文档随机选取K个文档作为质心  (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类  (3)重新计算已经得到的各... 查看详情