zoukankan      html  css  js  c++  java
  • 机器学习系列算法1:KNN

    思路:空间上距离相近的点具有相似的特征属性。

    执行流程:

      •1. 从训练集合中获取K个离待预测样本距离最近的样本数据;
      •2. 根据获取得到的K个样本数据来预测当前待预测样本的目标属性值 

    三要素:K值选择/距离度量(欧式距离)/决策选择(平均值/加权平均)

    Knn问题:数据量大,计算量较大;解决方案:kd-tree

    kd-tree:计算方差,根据方差大的划分

    伪代码实现:

    import numpy as np
    from collections import defaultdict
    
    
    class myknn:
    
        def fit(self, X, Y, k):
            self.train_x = X
            self.train_y = Y
            self.k = k
    
        def predict(self, X):
            predict_labels = []
            for x in X:
                # 1. 从训练数据中获取K个和当前待预测样本x最相似的样本
                neighbors = self.fetch_k_neighbors(x)
                # 2. 将这K个最相似的样本中出现次数最多的类别作为预测值
                predict_label = self.calc_max_count_label(neighbors)
                # 3. 将当前样本的预测值添加到临时的列表中
                predict_labels.append(predict_label)
    
            return predict_labels
    
        def fetch_k_neighbors(self, x):
            distances = []
            for neighbor in self.train_x:
                dis = np.sqrt(np.sum((np.array(x) - neighbor) ** 2))
                distances.append(dis)
            neighbors_y_distances = [[neighbor, y, dis] for neighbor, y, dis in zip(self.train_x, self.train_y, distances)]
    
            k_neighbors_y = sorted(neighbors_y_distances, key=lambda x: x[2])[:self.k]
            return k_neighbors_y
    
        def calc_max_count_label(self, neighbors):
            y_count = defaultdict(int)
            for neighbor, y, _ in neighbors:
                y_count[y] += 1
            max_count_label = sorted(y_count.items(), key=lambda x: x[1], reverse=True)[0][0]
            return max_count_label
    
    
    a = myknn()
    X = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
        [10, 11, 12],
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ]
    Y = [1, 2, 3, 2, 1, 2, 3]
    k = 3
    a.fit(X, Y, k)
    print(a.predict([[7, 8, 9], ]))
    sklearn 实现:
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import os
    
    if not os.path.exists('models'): 
        os.mkdir('models')
    base_path = './models/'  #模型保存路径
    
    from sklearn.datasets import load_iris    #load 鸢尾花数据
    from sklearn.model_selection import train_test_split  #数据分割
    from sklearn.neighbors import KNeighborsClassifier  #knn分类器
    from sklearn.externals import joblib   #持久化
    
    data = pd.read_csv('iris.data', header=None)
    
    print(data.head())
    X = data.loc[:, :3] #前4列为特征数据
    Y = data[4]  #最后一列为目标数据  
    print(X.head())
    
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=22)
    
    '''
        def __init__(self,
                n_neighbors=5,   #邻居数目
                weights='uniform',  #uniform 等权重/distance
                algorithm='auto', #暴力计算和kd-tree
                leaf_size=30,  #构建kd-tree 允许的最大叶子节点
                p=2,    #距离公式
                metric='minkowski', #默认欧式距离
                metric_params=None,
                n_jobs=None,  #开启多少个线程计算
                **kwargs):'''
    
    algo = KNeighborsClassifier(n_neighbors=3)
    algo.fit(X_train, Y_train)
    print('准确率:{}'.format(algo.score(X_train, Y_train)))
    
    # 持久化
    joblib.dump(value=algo, filename=base_path + 'knn.pkl')

    机器学习开发流程:

    # 1. 数据加载
    
    # 2. 数据的清洗、处理
    
    # 3. 训练数据和测试数据的划分
    
    # 4. 特征工程
    
    # 5. 模型对象构建
    
    # 6. 模型训练
    
    # 7. 模型效果评估
    
    # 8. 模型持久化
    
    持久化的方式主要三种:
    -1. 将模型持久化为二进制的磁盘文件。
    -2. 将模型参数持久化到数据库中。
    -3. 使用模型对所有数据进行预测,并将预测结果保存到数据库中。
    
  • 相关阅读:
    2016-09-13面试记录
    javascript中的深度拷贝的实现过程及深拷贝的几种方法。
    javascript中的for in循环
    常见的兼容问题及其解决方法。
    一次清空所有数据方法
    数组排序
    css对齐 挖坑~
    css reset样式重置
    CSS 表单
    CSS 表格
  • 原文地址:https://www.cnblogs.com/wanghzh/p/10904252.html
Copyright © 2011-2022 走看看