如何在淘宝网做自己的网站,enjooy wordpress,深圳网站建设 百业,小程序推广平台目录
一 . K-近邻算法#xff08;KNN#xff09;概述
二、KNN算法实现
三、 MATLAB实现
四、 实战 一 . K-近邻算法#xff08;KNN#xff09;概述 K-近邻算法#xff08;KNN#xff09;是一种基本的分类算法#xff0c;它通过计算数据点之间的距离来进行分类。在… 目录
一 . K-近邻算法KNN概述
二、KNN算法实现
三、 MATLAB实现
四、 实战 一 . K-近邻算法KNN概述 K-近邻算法KNN是一种基本的分类算法它通过计算数据点之间的距离来进行分类。在KNN算法中当我们需要对一个未知数据点进行分类时它会与训练集中的各个数据点进行特征比较并找到与之最相似的前K个数据点。然后根据这K个数据点的类别来确定未知数据点所属的类别。 KNN算法的步骤非常简单 1计算未知数据点与训练集中各个数据点之间的距离。常用的距离度量包括欧氏距离和曼哈顿距离。 2按照距离递增的顺序对数据点进行排序。 3选择距离最小的K个数据点。 4根据这K个数据点的类别来确定未知数据点的类别。通常采用多数表决的方式即统计K个数据点中各个类别出现的次数将出现次数最多的类别作为未知数据点的预测类别。 KNN算法的特点是简单易懂容易实现。它没有显式的训练过程仅依赖于已有的训练数据。然而KNN算法的计算复杂度较高尤其是当训练集很大时。此外KNN算法还对训练样本的质量和数量敏感需要合理地选择K值和距离度量方法。 在KNN中通过计算对象间距离来作为各个对象之间的非相似性指标避免了对象之间的匹配问题在这里距离一般使用欧氏距离或曼哈顿距离 同时KNN通过依据k个对象中占优的类别进行决策而不是单一的对象类别决策。这两点就是KNN算法的优势。 接下来对KNN算法的思想总结一下就是在训练集中数据和标签已知的情况下输入测试数据将测试数据的特征与训练集中对应的特征进行相互比较找到训练集中与之最为相似的前K个数据则该测试数据对应的类别就是K个数据中出现次数最多的那个分类其算法的描述为 首先需要收集足够的带有标签的训练数据这些数据包含了输入特征和相应的输出标签。 对于输入的测试数据需要计算它与每个训练数据之间的距离如欧氏距离、曼哈顿距离等。 选取距离测试数据最近的K个训练数据并统计它们中出现最多的标签类别。 将测试数据归类为出现次数最多的标签类别。 二、KNN算法实现 KNN算法的实现通常可以使用Python等编程语言进行实现 import numpy as npclass KNN():def __init__(self, k3, distanceeuclidean):self.k kself.distance distancedef fit(self, X, y):self.X_train Xself.y_train ydef predict(self, X):y_pred []for x in X:distances []for i, x_train in enumerate(self.X_train):if self.distance euclidean:dist np.linalg.norm(x - x_train)elif self.distance manhattan:dist np.sum(np.abs(x - x_train))distances.append((dist, self.y_train[i]))distances.sort()neighbors distances[:self.k]classes {}for neighbor in neighbors:if neighbor[1] in classes:classes[neighbor[1]] 1else:classes[neighbor[1]] 1max_class max(classes, keyclasses.get)y_pred.append(max_class)return y_pred这段代码实现了基本的KNN分类算法包括fit函数进行训练集拟合predict函数进行预测。其中k参数表示要选择的最近邻居数distance参数为距离度量方法。在上述示例代码中欧氏距离和曼哈顿距离两种距离度量方法均已实现。 通过选择不同的数据集和参数可以验证KNN算法的分类性能。在实现KNN算法时还可以采用更加高效的数据结构如kd树、球树和距离度量方法等技巧来对算法进行优化和改进。
三、 MATLAB实现 使用pdist2函数计算欧氏距离而不是手动计算可以极大地提高计算速度。 在计算距离之后直接利用sort函数进行排序并选择前k个最近邻。这样可以简化代码并且使用向量化计算计算速度更快。 使用mode函数求取邻居中出现次数最多的类别作为预测结果并且使用2维输入方式保证正确性。 function y_pred knn(X_train, y_train, X_test, k)n_train size(X_train, 1);n_test size(X_test, 1);y_pred zeros(n_test, 1);% 计算欧氏距离distances pdist2(X_train, X_test);% 选择前k个最近邻[~, indices] sort(distances);neighbors y_train(indices(1:k,:));% 使用投票法预测标签y_pred mode(neighbors, 1);
end四、 实战 在这里根据一个人收集的约会数据根据主要的样本特征以及得到的分类对一些未知类别的数据进行分类大致就是这样。 我使用的是python 3.4.3,首先建立一个文件例如date.py,具体的代码如下
#coding:utf-8from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt###导入特征数据
def file2matrix(filename):fr open(filename)contain fr.readlines()###读取文件的所有内容count len(contain)returnMat zeros((count,3))classLabelVector []index 0for line in contain:line line.strip() ###截取所有的回车字符listFromLine line.split(\t)returnMat[index,:] listFromLine[0:3]###选取前三个元素存储在特征矩阵中classLabelVector.append(listFromLine[-1])###将列表的最后一列存储到向量classLabelVector中index 1##将列表的最后一列由字符串转化为数字便于以后的计算dictClassLabel Counter(classLabelVector)classLabel []kind list(dictClassLabel)for item in classLabelVector:if item kind[0]:item 1elif item kind[1]:item 2else:item 3classLabel.append(item)return returnMat,classLabel#####将文本中的数据导入到列表##绘图可以直观的表示出各特征对分类结果的影响程度
datingDataMat,datingLabels file2matrix(D:\python\Mechine learing in Action\KNN\datingTestSet.txt)
fig plt.figure()
ax fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()## 归一化数据,保证特征等权重
def autoNorm(dataSet):minVals dataSet.min(0)maxVals dataSet.max(0)ranges maxVals - minValsnormDataSet zeros(shape(dataSet))##建立与dataSet结构一样的矩阵m dataSet.shape[0]for i in range(1,m):normDataSet[i,:] (dataSet[i,:] - minVals) / rangesreturn normDataSet,ranges,minVals##KNN算法
def classify(input,dataSet,label,k):dataSize dataSet.shape[0]####计算欧式距离diff tile(input,(dataSize,1)) - dataSetsqdiff diff ** 2squareDist sum(sqdiff,axis 1)###行向量分别相加从而得到新的一个行向量dist squareDist ** 0.5##对距离进行排序sortedDistIndex argsort(dist)##argsort()根据元素的值从大到小对元素进行排序返回下标classCount{}for i in range(k):voteLabel label[sortedDistIndex[i]]###对选取的K个样本所属的类别个数进行统计classCount[voteLabel] classCount.get(voteLabel,0) 1###选取出现的类别次数最多的类别maxCount 0for key,value in classCount.items():if value maxCount:maxCount valueclasses keyreturn classes##测试(选取10%测试
def datingTest():rate 0.10datingDataMat,datingLabels file2matrix(D:\python\Mechine learing in Action\KNN\datingTestSet.txt)normMat,ranges,minVals autoNorm(datingDataMat)m normMat.shape[0]testNum int(m * rate)errorCount 0.0for i in range(1,testNum):classifyResult classify(normMat[i,:],normMat[testNum:m,:],datingLabels[testNum:m],3)print(分类后的结果为:,, classifyResult)print(原结果为,datingLabels[i])if(classifyResult ! datingLabels[i]):errorCount 1.0print(误分率为:,(errorCount/float(testNum)))###预测函数
def classifyPerson():resultList [一点也不喜欢,有一丢丢喜欢,灰常喜欢]percentTats float(input(玩视频所占的时间比?))miles float(input(每年获得的飞行常客里程数?))iceCream float(input(每周所消费的冰淇淋公升数?))datingDataMat,datingLabels file2matrix(D:\python\Mechine learing in Action\KNN\datingTestSet2.txt)normMat,ranges,minVals autoNorm(datingDataMat)inArr array([miles,percentTats,iceCream])classifierResult classify((inArr-minVals)/ranges,normMat,datingLabels,3)print(你对这个人的喜欢程度:,resultList[classifierResult - 1]) 新建test.py文件了解程序的运行结果代码
#coding:utf-8from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as pltimport sys
sys.path.append(D:\python\Mechine learing in Action\KNN)
import date
date.classifyPerson()