KNN实战(一)

这两天一直忙于比赛还有各种培训什么的,今天也算是有时间看看书,调调程序了,我的小心脏辣个兴奋啊。言归正传,之前,对KNN进行了一个简单的验证,今天我们使用KNN改进约会网站的效果,个人理解,这个问题也可以转化为其它的比如各个网站迎合客户的喜好所作出的推荐之类的,当然,今天的这个例子功能也实在有限。

在这里根据一个人收集的约会数据,根据主要的样本特征以及得到的分类,对一些未知类别的数据进行分类,大致就是这样。

我使用的是python 3.4.3,首先建立一个文件,例如date.py,具体的代码如下:

#coding:utf-8

from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt

###导入特征数据
def file2matrix(filename):
    fr = open(filename)
    contain = fr.readlines()###读取文件的所有内容
    count = len(contain)
    returnMat = zeros((count,3))
    classLabelVector = []
    index = 0
    for line in contain:
        line = line.strip() ###截取所有的回车字符
        listFromLine = line.split(‘\t‘)
        returnMat[index,:] = listFromLine[0:3]###选取前三个元素,存储在特征矩阵中
        classLabelVector.append(listFromLine[-1])###将列表的最后一列存储到向量classLabelVector中
        index += 1

    ##将列表的最后一列由字符串转化为数字,便于以后的计算
    dictClassLabel = Counter(classLabelVector)
    classLabel = []
    kind = list(dictClassLabel)
    for item in classLabelVector:
        if item == kind[0]:
            item = 1
        elif item == kind[1]:
            item = 2
        else:
            item = 3
        classLabel.append(item)
    return returnMat,classLabel#####将文本中的数据导入到列表

##绘图(可以直观的表示出各特征对分类结果的影响程度)
datingDataMat,datingLabels = file2matrix(‘D:\python\Mechine learing in Action\KNN\datingTestSet.txt‘)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

## 归一化数据,保证特征等权重
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))##建立与dataSet结构一样的矩阵
    m = dataSet.shape[0]
    for i in range(1,m):
        normDataSet[i,:] = (dataSet[i,:] - minVals) / ranges
    return normDataSet,ranges,minVals

##KNN算法
def classify(input,dataSet,label,k):
    dataSize = dataSet.shape[0]
    ####计算欧式距离
    diff = tile(input,(dataSize,1)) - dataSet
    sqdiff = diff ** 2
    squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量
    dist = squareDist ** 0.5

    ##对距离进行排序
    sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标

    classCount={}
    for i in range(k):
        voteLabel = label[sortedDistIndex[i]]
        ###对选取的K个样本所属的类别个数进行统计
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1
    ###选取出现的类别次数最多的类别
    maxCount = 0
    for key,value in classCount.items():
        if value > maxCount:
            maxCount = value
            classes = key
    return classes

##测试(选取10%测试)
def datingTest():
    rate = 0.10
    datingDataMat,datingLabels = file2matrix(‘D:\python\Mechine learing in Action\KNN\datingTestSet.txt‘)
    normMat,ranges,minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    testNum = int(m * rate)
    errorCount = 0.0
    for i in range(1,testNum):
        classifyResult = classify(normMat[i,:],normMat[testNum:m,:],datingLabels[testNum:m],3)
        print("分类后的结果为:,", classifyResult)
        print("原结果为:",datingLabels[i])
        if(classifyResult != datingLabels[i]):
                                  errorCount += 1.0
    print("误分率为:",(errorCount/float(testNum)))

###预测函数
def classifyPerson():
    resultList = [‘一点也不喜欢‘,‘有一丢丢喜欢‘,‘灰常喜欢‘]
    percentTats = float(input("玩视频所占的时间比?"))
    miles = float(input("每年获得的飞行常客里程数?"))
    iceCream = float(input("每周所消费的冰淇淋公升数?"))
    datingDataMat,datingLabels = file2matrix(‘D:\python\Mechine learing in Action\KNN\datingTestSet2.txt‘)
    normMat,ranges,minVals = autoNorm(datingDataMat)
    inArr = array([miles,percentTats,iceCream])
    classifierResult = classify((inArr-minVals)/ranges,normMat,datingLabels,3)
    print("你对这个人的喜欢程度:",resultList[classifierResult - 1])

新建test.py文件了解程序的运行结果,代码:

#coding:utf-8

from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt

import sys
sys.path.append("D:\python\Mechine learing in Action\KNN")
import date
date.classifyPerson()

运行结果如下图:

这样就算是成功了吧,当然,在这其中也遇到了很多的问题,我看的《机器学习实战》这本书主要还是针对于python2.7的,理所应当的我遇到了不少问题。有在学习这本书的朋友咱们可以交流下哈~

最后还是想说一点,就是在敲代码的时候,编完一段还是先调试一下比较好,这样到最后就不会有什么太大的问题啦,这次我就是这么干的~~~

——————————————————————————————我是萌萌哒分隔线————————————————————————

最近依旧一个字 :“忙”!暑假呢,想想也还真是苦了自己,爸爸麻麻打电话都催着回家,看来二老还真是想我了。当时期末考结束之后就好好计划了这个暑假应该怎么过,现在一大半过去了,确实也没有什么后悔的。其实有时候在想,一个遥不可及的梦想到底值不值得坚持,我的行动告诉了我我在坚持,虽结果不可知,但时间会证明一切吧。

我从不悲观,相信不劳无获,更相信劳有所获!

我喜欢的生活是:该吃吃,该玩玩,该忙依旧得忙~

又快一点了,明早还得早起去上课,早点休息吧,各位晚安~

时间: 2024-12-29 01:29:53

KNN实战(一)的相关文章

机器学习实战__KNN1

KNN的算法工作原理: 存在一个训练样本集合,样本集中每个数据都有确定的标签(分类),即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数.最后,选择K个最相似数据中出现次数最多的标签,作为新数据的分类. 一个KNN实战入门例子: from numpy import

机器学习实战之kNN

笔者最近开始对机器学习非常感兴趣,作为一个有志向的软设方向的女孩纸,我开始了学习的第一步入门,下面将今天刚刚学习的kNN及其应用进行总结和回顾,希望可以得到更好的提升,当然,有志同道合者,你可以联系我给我留言,毕竟菜鸟一起飞才能飞的更高更远.?? 首先,kNN算法也叫k-近邻算法,它的工作原理是:存在一个样本的数据集合,也称作训练样本集,并且每个样本集都有其标签.故而,我们很清楚每一数据和其所属分类之间的关系.当输入新样本时,我们将新数据的每一个特征样本集中对应的数据特征进行比较,然后算法提取特

基于kNN的手写字体识别——《机器学习实战》笔记

看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]:存在一个样本数据集合.每个样本数据都存在标签.输入没有标签的新数据后,将新数据的每个特征与样本集数据的对应特征进行比较,然后算法提取样本集中最相似的分类标签.一般说来,我们只选择样本数据集中前k个最相似的数据,最后,选择这k个相似数据中出现次数最多的分类,作为新数据的分类. 通俗的说,举例说明:有一群明确国籍

Scikit-Learn实战KNN

Scikit-Learn总结 Scikit-Learn(基于Python的工具包) 1.是一个基于Numpy,Scipy,Matplotlib的开源机器学习工具包. 2.该包于2007年发起,基本功能包涵了6个方面:分类.回归.聚类.数据降维.模型选择.预处理 包括了大量常用的算法::SVM,逻辑回归,朴素贝叶斯,k-means 3.网站为:http://scikit-learn.org鸢尾花数据集是由杰出的统计学家 R.A.Fisher在20世纪30年代中期创建的,它被公认为用于数据挖掘的最著

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

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.K-近邻算法的工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中

Python实战之KNN实现

Python实战之KNN实现 用Python来实现K近邻分类算法(KNN)已经是一个老生常谈的问题,网上也已经有诸多资料,不过这里我还是决定记录一下自己的学习心得. 1.配置numpy库 numpy库是Python用于矩阵运算的第三方库,大多数数学运算都会依赖这个库来进行,关于numpy库的配置参见:Python配置第三方库Numpy和matplotlib的曲折之路,配置完成后将numpy库整体导入到当前工程中. 2.准备训练样本 这里简单的构造四个点并配以对应标签作为KNN的训练样本: # =

机器学习实战之kNN算法

机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.11.3,64位,这是python的科学计算包,是python的一个矩阵类型,包含数组和矩阵,提供了大量的矩阵处理函数,使运算更加容易,执行更加迅速. (3)matplotlib 1.5.3,64位,在下载该工具时,一定要对应好python的版本,处理器版本,matplotlib可以认为是python

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(

机器学习实战——kNN分类器

惰性学习法:简单的存储数据,一直等待,直到给定一个测试元组时才进行泛化,根据对存储的元组的相似性进行分类.kNN(k近邻)分类方法于20世纪50年代提出,由于计算密集型算法,因此到60年代之后随着计算能力增强后才逐步应用. kNN基于类比学习,将给定的测试元组表示为n维空间中的一个点,n代表属性数目.然后使用某种距离度量方式来寻找与给定测试元组最近的k个训练元组,对这个k个训练元组的类别进行统计,返回类别数目多的类别作为未知测试元组的类别. 常用的距离度量就是欧几里得距离,也称为二范数.同时为了