knn

Computing sparse pairwise distance matrix in R

狂风中的少年 提交于 2019-11-29 00:46:36
问题 I have a NxM matrix and I want to compute the NxN matrix of Euclidean distances between the M points. In my problem, N is about 100,000. As I plan to use this matrix for a k-nearest neighbor algorithm, I only need to keep the k smallest distances, so the resulting NxN matrix is very sparse. This is in contrast to what comes out of dist() , for example, which would result in a dense matrix (and probably storage problems for my size N ). The packages for kNN that I've found so far ( knnflex ,

KNN与K-MEANS的区别

冷暖自知 提交于 2019-11-28 21:55:55
1. k-means聚类算法过程与原理 k-means算法(k-均值聚类算法)是一种基本的已知聚类类别数的划分算法。它是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。它是使用欧氏距离度量的(简单理解就是两点间直线距离,欧氏距离只是将这个距离定义更加规范化,扩展到N维而已)。它可以处理大数据集,且高效。聚类结果是划分为k类的k个数据集。根据聚类结果的表达方式又可以分为硬 k-means(H CM)算法、模糊k-means算法(F CM)和概率k-means算法(P CM)。 1.1.基本思想 它是基于给定的聚类目标函数,算法采用迭代更新的方法,每一次迭代过程都是向目标函数减小的方向进行,最终聚类结果使得目标函数取得极小值,达到较好的分类效果 1.2 原理 原始的k-means算法首先随机选取k个点作为初始聚类中心,然后计算各个数据对 象到各聚类中心的距离,把数据对象归到离它最近的那个聚类中心所在的类; 调整后的新类计算新的聚类中心,如果相邻两次的聚类中心没有任何变化,说明 数据对象调整结束,聚类准则函数f已经收敛。在每次迭 代中都要考察每个样本的分类是否正确,若不正确,就要调整。在全部数据调整 完后,再修改聚类中心,进入下一次迭代。如果在一次迭代算法中,所有的数据 对象被正确分类,则不会有调整,聚类中心也不会有任何变化

Missing value imputation in python using KNN

大城市里の小女人 提交于 2019-11-28 20:39:36
I have a dataset that looks like this 1908 January 5.0 -1.4 1908 February 7.3 1.9 1908 March 6.2 0.3 1908 April NaN 2.1 1908 May NaN 7.7 1908 June 17.7 8.7 1908 July NaN 11.0 1908 August 17.5 9.7 1908 September 16.3 8.4 1908 October 14.6 8.0 1908 November 9.6 3.4 1908 December 5.8 NaN 1909 January 5.0 0.1 1909 February 5.5 -0.3 1909 March 5.6 -0.3 1909 April 12.2 3.3 1909 May 14.7 4.8 1909 June 15.0 7.5 1909 July 17.3 10.8 1909 August 18.8 10.7 I want to replace the NaN s using KNN as the method. I looked up sklearn s Imputer class but it supports only mean, median and mode imputation. There

knn 数据集准备

孤街醉人 提交于 2019-11-28 16:18:14
1 """ 2 Created on Mon Aug 26 20:57:24 2019 3 4 @author: huoqs 5 6 knn algorithm 7 """ 8 import numpy as np 9 import matplotlib.pyplot as plt 10 11 def generate_data(num_samples, num_features=2): 12 data_size = (num_samples, num_features) 13 data = np.random.randint(0, 100, data_size) 14 15 label_size = (num_samples, 1) 16 labels = np.random.randint(0, 2, label_size) 17 # must be float32 18 return data.astype(np.float32), labels 19 20 def plot_data(all_blue, all_red): 21 plt.scatter(all_blue[:, 0], all_blue[:, 1], c = 'b', marker = 's', s = 180) 22 plt.scatter(all_red[:, 0], all_red[:, 1], c =

KNN和K-means的区别

帅比萌擦擦* 提交于 2019-11-28 12:10:01
knn 算法思路: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 k近邻模型的三个基本要素: k值的选择:k值的选择会对结果产生重大影响。较小的k值可以减少近似误差,但是会增加估计误差;较大的k值可以减小估计误差,但是会增加近似误差。一般而言,通常采用交叉验证法来选取最优的k值。 距离度量:距离反映了特征空间中两个实例的相似程度。可以采用欧氏距离、曼哈顿距离等。 分类决策规则:往往采用多数表决。 k-means 算法步骤: 1. 从n个数据中随机选择 k 个对象作为初始聚类中心; 2. 根据每个聚类对象的均值(中心对象),计算每个数据点与这些中心对象的距离;并根据最小距离准则,重新对数据进行划分; 3. 重新计算每个有变化的聚类簇的均值,选择与均值距离最小的数据作为中心对象; 4. 循环步骤2和3,直到每个聚类簇不再发生变化为止。 k-means方法的基本要素: k值的选择:也就是类别的确定,与K近邻中k值的确定方法类似。 距离度量:可以采用欧氏距离、曼哈顿距离等。 KNN K-Means 1.KNN是分类算法 2.监督学习 3.喂给它的数据集是带label的数据,已经是完全正确的数据 1.K-Means是聚类算法 2.非监督学习 3.喂给它的数据集是无label的数据,是杂乱无章的,经过聚类后才变得有点顺序

Error with knn function

♀尐吖头ヾ 提交于 2019-11-28 09:58:28
I try to run this line : knn(mydades.training[,-7],mydades.test[,-7],mydades.training[,7],k=5) but i always get this error : Error in knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : NA/NaN/Inf in foreign function call (arg 6) In addition: Warning messages: 1: In knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : NAs introduced by coercion 2: In knn(mydades.training[, -7], mydades.test[, -7], mydades.training[, : NAs introduced by coercion Any idea please ? PS : mydades.training and mydades.test are defined as follow : N <- nrow(mydades) permut <- sample(c

K近邻算法(KNN)

白昼怎懂夜的黑 提交于 2019-11-28 07:21:04
给定训练集,对于新输进来的样例,寻找训练数据集里面与之距离最近的K个样例,根据多数表决规则,如果K个实例多数属于某个类,则把该输入实例划分为这个类。 模型三要素是:距离度量,K值的选择,分类决策规则。 距离度量 :使用的距离是欧式距离,或者是更一般的Lp距离或Minkowski距离 p为2则为欧式距离,p=1为曼哈顿距离,p为无穷大则为各个坐标距离的最大值。 K值的选取 : k值减小意味着模型变得复杂,容易发生过拟合,选择较大的k值,可以减小学习的估计误差,但缺点是学习的近似误差会增大,k值一般取一个较小的值,通常使用交叉验证法来选择最优的k值。 K近邻的实现需要考虑如何快速地搜索k个最近邻点。kd树是一种便于对k维(注意这个k是指特征维度,而非KNN里面的k) 空间中的数据进行快速检索的数据结构。kd树是二叉树,表示对k维空间的一个划分,其每个节点对应于k为空间划分中的一个超矩形区域。利用kd树可以省去对大量数据点的搜索,从而减少搜索的计算量。 kd树使用于训练实例数远远大于空间维度的k近邻搜索。当空间维度接近训练实例数时,它的效率会迅速下降,几乎接近线性扫描。 来源: https://blog.csdn.net/pku_langzi/article/details/100030835

2.线性回归

☆樱花仙子☆ 提交于 2019-11-28 07:10:57
(一)简单线性回归 和之前介绍的KNN不同,KNN主要是解决分类问题,而线性回归顾名思义显然是用来解决回归问题的。线性回归具有如下特征: 解决回归问题 思想简单,实现容易 许多强大的非线性模型的基础,比如逻辑回归、多项式回归、svm等等 结果具有很好的可解释性 蕴含机器学习中的很多重要思想 图中是房屋的面积与价格之间的对应关系,不同的面积对应不同的价格,由此在二维平面中便形成了多个点。我们的目的就是要找到一条直线,最大程度上来拟合这些点。 但是在之前的KNN,分类问题中,横轴和纵轴都是样本的特征,而标签则是由这个点是红色还是蓝色决定的。 但是在线性回归中,由于是房产数据,我们必须要预测出一个具体的数值,而不能像分类问题那样,用简单的颜色来代表类别。而这些数据显然是在一个连续的样本空间中,因此需要一个坐标轴来表示。也正因为如此,在二维平面中只能有一个特征,要是多个特征,我们就要更高的维度上进行观察了。 如果样本的特征只有一个,我们称之为简单线性回归 我们的目的是要找到一个直线来尽可能多的拟合这些点,而在二维平面上显然是y = ax + b,那么每一个样本x,都会有一个真实值y和用拟合曲线预测出来的预测值ŷ,因此我们的真实值和预测值就会有一个差距 既然有真实值和预测值,那么评价一个直线的拟合程度,就看所有样本的真实值和预测值之差。如果只是简单的相减,那么两者之差可能有正有负,会抵消掉

4.pca与梯度上升法

て烟熏妆下的殇ゞ 提交于 2019-11-28 07:10:12
(一)什么是pca pca,也就是主成分分析法(principal component analysis),主要是用来对数据集进行降维处理。举个最简单的例子,我要根据姓名、年龄、头发的长度、身高、体重、皮肤的白皙程度(随便想的)等特征来预测一个人的性别,但这些特征中有一个是最没有用的,是什么的?显然是年龄,因为年龄的大小跟这个人的性别无关。还有姓名,这个特征显然起不到决定性作用,因为有的男孩的名字起的就像女孩(比如我本人),反之亦然,但是起码绝大多数情况还是能判断的。同理还有身高,一个180CM的很大概率是男孩,当然女孩也有180cm的,比如模特。像这样我从样本的特征中,挑选出最能代表样本、或者对样本预测起到决定性作用最大的n个特征,就叫做主成分分析。为什么会有pca呢?可以想象一个,显示生活中,样本的特征很多,成百上千个也是正常的,但是我们训练不可能用全部的特征进行训练,因为肯定有很多特征是没有用的,或者说起到的作用是很小的,我们的目的就是希望找到起到决定性最大的n个特征。 主成分分析的特征 一个非监督的机器学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他特征:可视化,去噪等等 我们举一个只有两个特征的例子 如果我们只考虑特征1,不考虑特征2的话,那么显然,蓝色的点要从二维映射到一维 那么同理,如果我们只考虑特征2,不考虑特征1的话,那么显然会是这样

sklearn简单knn运用

孤街浪徒 提交于 2019-11-28 06:21:24
Sklearn 本身就有很多数据库,可以用来练习。 以 Iris 的数据为例,这种花有四个属性,花瓣的长宽,茎的长宽,根据这些属性把花分为三类。 我们要用 分类器 去把四种类型的花分开。 今天用 KNN classifier,就是选择几个临近点,综合它们做个平均来作为预测值。 (1) 导入模块 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier (2) 创建数据 加载 iris 的数据,把属性存在 X,类别标签存在 y: iris = datasets.load_iris() iris_X = iris.data iris_y = iris.target 观察一下数据集,X 有四个属性,y 有 0,1,2 三类: print(iris_X[:2, :]) print(iris_y) """ [[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2]] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1