栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

机器学习(二)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

机器学习(二)

这里写目录标题
  • KNN算法原理
    • 优点:
    • 缺点:
  • 案例实现(书上)
    • 电影类别分类
      • 代码
      • 实验结果
    • 约会网站得配对效果
      • 源码(未添加分类器)
      • 源码(分类器)
      • 结果
      • 错误及解决方法
    • 可视化
      • 源码
      • 结果
      • 错误
    • 归一化
      • 源码
      • 结果
      • 手写体识别
  • 案例实现(课外)
      • 结果

KNN算法原理

KNN是最简单的分类算法之一,也是最常用的分类算法之一,KNN算法是有监督学习中的分类算法。
knn算法的基本法则是:相同类别的样本之间在特征空间中应当聚集在一起,也就是说当要预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别
如图所示:

图中绿色点为我们要预测的值,当k值等于三时,算法判断离绿色点最近的三个图形中哪一类图形最多就将新预测的点归为哪一类。

当k值改变时,预测的值也将发生变化,如上图所示,当k为5时,预测的值变为红色的圆,因此k值得选择对于knn算法来说非常重要

优点:
  1. 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
  2. 模型训练时间快。
  3. 预测效果好。
  4. 对异常值不敏感。
缺点:
  1. 对内存要求较高,因为该算法存储了所有训练数据
  2. 预测阶段可能很慢
  3. 对不相关的功能和数据规模敏感
案例实现(书上) 电影类别分类 代码
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

实验结果

约会网站得配对效果 源码(未添加分类器)
def file2metrix(filename):
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1])
        index += 1
    return returnMat,classLabelVector
源码(分类器)
def datingClassTest():
    hoRatio = 0.50
    datingDataMat,datingLabels = file2metrix('datingTestSet.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],
                                     datingLabels[numTestVecs:m],3)
        print ("the classifier came back with: %s, the real answer is: %s" 
               % (classifierResult, datingLabels[i]))
        if (classifierResult != datingLabels[i]): errorCount += 1.0
    print( "the total error rate is: %f" % (errorCount/float(numTestVecs)))
结果

错误及解决方法


将 classLabelVector.append(int(listFromLine[-1])) 改为classLabelVector.append(listFromLine[-1])

可视化 源码
import knn
datingDataMat,datingLabels = knn.file2metrix('datingTestSet.txt')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2])

plt.show()
结果

错误

输入import matplotlib 时出现以下错误

直接在设置中添加改包解决

出现找不到array的错误

添加from numpy import *后出现numpy.core._exceptions._UFuncNoLoopError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('float64'), dtype(' None错误

归一化 源码
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
结果



手写体识别

见博客一

案例实现(课外)

根据身高、体重、鞋子尺码,预测性别

import numpy as np
import pandas  as pd
from pandas import Dataframe,Series

feature = np.array([[170,65,41],[166,55,38],[177,80,39],[179,80,43],[170,60,40],[170,60,38]])
target = np.array(['男','女','女','男','女','女'])

from sklearn.neighbors import KNeighborsClassifier #k邻近算法模型

#实例k邻近模型,指定k值=3
knn = KNeighborsClassifier(n_neighbors=3)

#训练数据
knn.fit(feature,target)

#模型评分
knn.score(feature,target)

#预测
knn.predict(np.array([[176,71,38]]))

print('预测分类:', knn.predict(np.array([[176,71,38]])))
结果

参考鸣谢
链接一
链接二
链接三

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号