机器学习笔记(一):K-近邻算法

    首先作为机器学习的入门,我们必须了解的是什么是机器学习.简单来说,机器学习就是把无序的数据变成有用的信息.
作为机器学习领域的先驱,Arthur Samuel在 IBM Journal of Research and Development期刊上发表了一篇名为《 Some Studies in Machine Learning Using the Game of Checkers》的论文中 将机器学习非正式定义为: ”在不直接针对问题进行编程的情况下,赋予计算机学习能力的一个研究领域。”
 
    k-近邻算法是属于机器学习当中监督学习(明确知道预测什么,即目标变量)的一种.
    一般流程是:
    1.收集数据
    2.准备数据
    3.分析数据
    4.训练数据
    5.测试算法:计算错误率
    6.使用算法
k-近邻算法的核心思路总结如下,我只是个小白,如果有错误,欢迎大家指正.
对未知类别属性的数据集中的数据执行以下操作:
(1)计算已知类别的数据集中数据与当前数据的距离
(2)按照距离递增依次排序
(3)选取与当前点距离最近的前k个点
(4)确定前k个点的分类出现的次数
(5)选取出现次数最多的分类作为当前点的预测分类
#/usr/bin/python
#-*-coding:UTF-8-*-
from numpy import *
import operator
def createDataSet():
	group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) #测试集数据
	labels =['A','A','B','B'] #测试集数据对应的数据标签
	return group,labels #返回的形式其实是(group,labels)元组

def classify0(inX,dataSet,labels,k):
	dataSetSize = dataSet.shape[0] #获取测试集的数据条数shape,shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。例如建立一个4×2的矩阵c, c.shape[1] 为第一维的长度,c.shape[0] 为第二维的长度。
	diffMat = tile(inX,(dataSetSize,1))-dataSet #让inX矩阵在列的方向上重复dataSize次,行方向上重复一次,讲得到的矩阵与测试集矩阵作差
	sqDiffMat = diffMat**2 #矩阵平方
	sqDistances = sqDiffMat.sum(axis=1) #sum()函数默认的是axis=0是指普通相加,按列求和,axis=1是指矩阵的按行求和.np.sum([[0,1,2],[2,1,3]],axis=1)的结果就是:array([3,6])
	distances = sqDistances*0.5 #开方运算
	sortedDistIndicies = distances.argsort() #将distances中的元素从小到大排列,提取其对应的index(索引),然后输出到sortedDistIndicies
	classCount = {} #定义字典
	for i in range(k):
		votelabel = labels[sortedDistIndicies[i]] #获取第i小的元素的索引
		classCount[votelabel] = classCount.get(votelabel,0)+1 #查找对应votelabel键,并将其值进行+1操作
	sortClassCount = sorted(classCount.items(), key=operator.itemgetter(1),reverse=True) #从大到小排列,operator.itemgetter(1)返回对象第一个域的值.样即通过sorted函数将字典classcount按照计数器次数从大到小排列出来了,只要调用索引为0即可得出分类类别
	return sortClassCount[0][0] #返回分类次数最多的分类信息

if __name__ == '__main__':
	group,labels = createDataSet()
	print(classify0([0,0],group,labels,3))
结果是B.
约会网站
#/usr/bin/python
#-*-coding:UTF-8-*-
#from numpy import *
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
def file2matrix(filename):
    #打开文件
    fr=open(filename)
    #读取文件每一行到array0Lines列表
    #read():读取整个文件,通常将文件内容放到一个字符串中
    #readline():每次读取文件一行,当没有足够内存一次读取整个文件内容时,使用该方法
    #readlines():读取文件的每一行,组成一个字符串列表,内存足够时使用
    array0Lines=fr.readlines()
    #获取字符串列表行数行数
    numberOfLines=len(array0Lines)
    #返回的特征矩阵大小
    returnMat = zeros((numberOfLines,3))
    #list存储类标签
    classLabelVector=[]
    index=0
    for line in array0Lines:
        #去掉字符串头尾的空格,类似于Java的trim()
        line=line.strip()
        #将整行元素按照tab分割成一个元素列表
        listFromLine=line.split('\t')
        #将listFromLine的前三个元素依次存入returnmat的index行的三列
        returnMat[index,:]=listFromLine[0:3]
        #python可以使用负索引-1表示列表的最后一列元素,从而将标签存入标签向量中
        #使用append函数每次循环在list尾部添加一个标签值
        classLabelVector.append(int(listFromLine[-1]))
        index+=1
    return returnMat,classLabelVector 

if __name__ == '__main__':
    datingDataMat,datingLables = file2matrix('datingTestSet2.txt') #书上写的是datingTestSet.txt是错误的
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
    plt.xlabel("Play game percentage") #设置x轴注释
    plt.ylabel("Use ice cream percentage") #设置y轴注释
    plt.show()


约会网站的绘图界面如下:

 ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLables),15.0*array(datingLables))修改之后的图
上述代码利用datiingLabels存储的列标签属性在散点图上绘制出了不同大小,颜色的点(三个样本的轮廓)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值