机器学习系列算法1:KNN
原标题:机器学习系列算法1:KNN
原文来自:博客园 原文链接:https://www.cnblogs.com/wanghzh/p/10904252.html
思路:空间上距离相近的点具有相似的特征属性。
执行流程:
•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. 使用模型对所有数据进行预测,并将预测结果保存到数据库中。
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com
上一篇:k-means 算法介绍
下一篇:SVM支持向量机实例
热门资源
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com