案例:NLP预测天气冷暖感知度

1、案例需求

根据吃冰淇淋和喝水的数量,判断成都天气冷热程度。

成都春熙路街头采访记录一些游客吃了多少冰淇淋,又喝了几瓶水,他觉得成都天气怎么样(这里只考虑二分类问题,假设只有‘非常热’和‘一般热’)

其中特征向量包括两个分别是冰激凌数t1和喝水数t2,户外活动时长t3:

对应的标签类别分别是非常热A和一般热B。

2、实验数据准备

  • 构造模拟数据
人员 冰淇淋 喝水 户外活动时长 冷热程度 判断描述
小王 8 4 2 A 小王吃了8个冰淇淋,喝了4瓶水,户外2小时,该地区天气非常热
小张 7 1 1 A 小张吃了7个冰淇淋,喝了1瓶水,户外1小时,该地区天气非常热
小李 1 4 4 B 小李吃了1个冰淇淋,喝了4瓶水,户外4小时,该地区天气一般热
小赵 3 0 5 B 小赵吃了3个冰淇淋,喝了0瓶水,户外5小时,该地区天气一般热
  • 代码构造数据集

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    '''
        author:gzy
        date:20190301
        version:0.1.0
    '''
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    class Temperature():
        #设置字字体,避免汉字乱码
        siyuanyahei = FontProperties(fname="../SourceHanSans-Normal.otf")
    
        #创建数据集,返回数据集和类标签
        def create_dataset(self):
            # 数据集
            datasets = np.array([[8,4,2],[7,1,1],[1,4,4],[3,0,5]])
            #类标签
            labels = ['非常热','非常热','一般热','一般热']
            return datasets,labels

3、数据分析与可视化

  • 可视化展示散点图

     #可视化分析数据
        def analyze_data_plot(self,x,y):
            fig = plt.figure()
            # 将画布分隔为1行1列一块
            ax = fig.add_subplot(111)
            ax.scatter(x,y)
    
            #设置散点图的标题和横纵坐标
            plt.title('游客领热感知散点图',fontproperties=self.siyuanyahei)
            plt.xlabel('天热吃冰激凌数目',fontproperties=self.siyuanyahei)
            plt.ylabel('天热喝水的数目',fontproperties=self.siyuanyahei)
            plt.show()

4、算法模型及原理讲解

  • KNN模型原理及欧式距离计算
    • 什么是KNN算法模型
    • KNN工作原理
    • KNN算法思想
    • KNN算法流程

4.1、KNN算法模型

​ k-近邻(KNN,k-NearestNeighbor)算法是一种基本分类与回归方法。k-近邻假设设定一个训练数据集(先验知识),其中的实例类别已定。分类时候,对新的实例数据,根据其K个最近邻的训练实例的类别,通过多数表决等方式进行预测。

==K近邻算法属于有监督学习,实际上利用训练数据集对特征向量空间进行划分,并作为其分类的"模型"。K值的选择、距离度量、以及分类决策规则是K近邻算法的三个基本要素。==

在本案例中,仅讨论分类问题中的k-近邻算法;输入值:案例的特征向量(吃冰淇淋、喝水、活动时间),对应特征空间的点;输出值:案例的类别(非常热、一般热、舒适、一般冷、非常冷)

4.2、KNN工作原理

  • 假设一个带有标签的数据集(训练样本集),包含每条数据与所属分类的对应关系
  • 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较
  • 计算新数据与样本数据集 中每条数据的距离
  • 对求得的所有距离进行排序(从小到大,越小表示越相似)
  • 取前K(K<=20的奇数)个样本数据对应的分类标签
  • 求K个数据中出现次数最多的分类标签作为新数据的分类

4.3、KNN算法思想

  • 计算所有样本点 与 待分类样本之间的距离
  • 计算完 样本距离进行排序
  • 选取距离样本最近的k个点
  • 针对这个k个点,统计各个类别分别有多少个
  • k个点钟某个类别最多,就将该样本划归该点

4.4、KNN算法模型流程与实现

  • 搜集数据
    • 数据采集过程,分为:非机构化数据、半结构化数据、数据化数据
  • 准备数据
    • 格式化处理,对不同类别的数据进行统一的格式化处理
    • 如:将pdf,word,excel,sql等统一转化为txt
  • 分析数据
    • 看数据特点,有无缺失值,数据是离散还是连续
  • 训练数据
    • 不适用与KNN,但在其他一些监督学习中经常会用到
  • 应用算法
    • 针对完善的模型进行封装重构,进行实际应用

构造KNN分类器

    #构造KNN分类器
    def knn_Classifier(self,newV,datasets,labels,k):
        # 获取新样本的数据
        # 获取样本库的数据
        # 选择K值
        # 计算样本数据与样本库数据之间的距离
        # 根据距离进行排序
        # 针对k个点,统计各个类别的数量
        # 投票机制,少数服从多数原则

        pass

欧式距离计算

# 欧氏距离计算
    #方式一 d^2 = (x1-x2)^2 +(y1-y2)^2"
    def ComputeEuclideanDistance(self,x1,x2,y1,y2):
        d = math.sqrt(math.pow((x1-x2),2)+math.pow((y1-y2),2))
        return d

    # 方式二
    def EuclideanDistance(self,instance1,instance2,length):
        d =0
        for x in range(length):
            d += pow((instance1[x]-instance2[x]),2)
        return math.sqrt(d)

About ME

👋 读书城南,🤔 在未来面前,我们都是孩子~
  • 📙 一个热衷于探索学习新方向、新事物的智能产品经理,闲暇时间喜欢coding💻、画图🎨、音乐🎵、学习ing~
👋 Social Media
👋 加入小组~

👋 感谢打赏~