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. 使用模型对所有数据进行预测,并将预测结果保存到数据库中。
    
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/wanghzh/p/10904252.html
Copyright © 2011-2022 走看看