《机器学习实战》学习笔记Part 1(一)

仅作记录,供自己日后翻阅和理解。

监督学习一般使用两种类型的目标变量:标称和数值型

标称型目标变量的结果只在有限目标集中取值(分类)

数值型目标变量可以从无限的数值集合中取值(主要用于回归)


第二章 K-近邻算法(KNN)

2.1 算法概述

简单地说,采用测量不同特征值之间的距离方法进行分类。

工作原理:存在一个样本数据集(训练样本集),并且样本集中每个数据都存在标签。输入没标签的新数据后,将新数据地每个特征与样本集中数据对应的特征进行比较,然后算法提取样本中特征最相似数据(最邻近)的分类标签。一般只取样本数据集中前k个最相似的数据(k一般不大于20)

步骤:收集数据——>准备数据——>分析数据——>测试算法——>使用算法

扫描二维码关注公众号,回复: 1739317 查看本文章
from numpy import *
#导入科学计算包
import operator
#运算符模块
import matplotlib
import matplotlib.pyplot as plt

#解决显示中文问题
#coding:utf-8
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

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 test1():
    group,label=createDataSet()
    print(group)
    print(label)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_title("带四个数据点的简单例子")
    ax.scatter(group[:,0], group[:, 1])

KNN伪代码:

1)计算已知类别数据集中的点和当前点之间的距离

2)按照距离递增次序排序

3)选取与当前点距离最小的k个点

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

5)返回前k个点出现频率最高的类别作为当前点的预测分类


from numpy import *
#导入科学计算包
import operator
#运算符模块
import matplotlib
import matplotlib.pyplot as plt

#解决显示中文问题
#coding:utf-8
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

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

# k-j近邻算法
def classify0(inX, dataSet, labels, k):
    # inX是用于分类的输入向量;dataSet是输入的训练样本集,labels是标签向量,k是用于选择最近邻居的数目
    #1 使用欧式距离,计算向量点之间的距离
    dataSetSize = dataSet.shape[0] # 返回多维数组维度的第一维
    diffMat = tile(inX, (dataSetSize,1)) - dataSet # title(x,(m,n))以x为基本单位生成一个m行,每行为n个x的多维数组
    sqDiffMat = diffMat**2 # 平方
    sqDistances = sqDiffMat.sum(axis=1) # 对数组按行求和
    distances = sqDistances**0.5 # 开方
    #1 计算距离结束
    sortedDistIndicies = distances.argsort() # 按列排序,返回行标
    classCount={} # 字典类型
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 将字典分成元祖列表
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    # 使用itemgetter,按照第二个元素的次序对元组进行排序
    return sortedClassCount[0][0]

def test2():
    group, label = createDataSet()
    print(classify0([0.9,0.9],group,label,3))

test2()

 
 2.2 示例:使用算法改进约会网站的配对效果 
 

1 准备数据:从文本文件中解析数据

2 分析数据:使用Matplotlib创建散点图

3 准备数据:归一化数值

4 测试算法:作为完整程序验证分类器

5 使用算法:构建完整可用系统



待续……

猜你喜欢

转载自blog.csdn.net/jesmine_gu/article/details/79078122