1. B
2. B
3. KNN算法的原理简单地说是通过分析与其距离最近的K个邻近节点的类别来判断一个新节点的类别。
此算法的主要缺点有:
(1)计算量大,尤其是当特征数非常多的时候;
(2)样本不平衡的时候,对稀有类别的预测准确率低;
(3)建立KD树、球树之类的模型时需要大量的内存;
(4)使用的是懒散学习方法,基本上学习;
(5)相比决策树模型,KNN模型的可解释性不强。
4. KNN算法的主要实现流程:
(1)选择参数K;
(2)计算未知节点与已知节点之间的距离;
(3)选择最近K个已知节点;
(4)根据多数表决法将未知节点归类到K个最邻近样本中最多数的那种类别。
5.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文字
plt.rcParams['axes.unicode_minus']=False
#生成数据集
dataset=make_classification(n_samples=1000,n_classes=3,n_clusters_per_class=1,n_informative=2,n_redundant=0)
X,y=dataset
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
#建立分类器
knn=KNeighborsClassifier()
#训练分类器
knn.fit(X_train,y_train)
#可视化分类
plt.scatter(X_train[:,0],X_train[:,1],marker='o',c=y_train)
plt.scatter(X_test[:,0],X_test[:,1],marker='+',c=y_test)
plt.show()
程序运行的结果:
6.
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False #显示负数
wine=load_wine()
X,y=wine['data'],wine['target']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
#定义一个分类器
knn=KNeighborsClassifier()
#训练分类器
knn.fit(X_train,y_train)
#预测
predict=knn.predict(X_test)
print('预测值:',predict)
print('真 值:',y_test)
#评估分类器
score=knn.score(X_test,y_test)
print(score)
#数据可视化b
columns=['A'+str(i) for i in range(len(X[0]))]
traindf=pd.DataFrame(X,columns=columns)
corr=round(traindf.corr(),2)
attrNo=len(corr)
attr=np.arange(attrNo)
plt.xticks(attr,labels=columns,ha='right')
plt.yticks(attr,labels=columns)
plt.title('葡萄酒各特征间的相关程度热力图')
value=np.array(corr)
for i in range(attrNo):
for j in range(attrNo):
plt.text(j,i,value[i][j],ha='center',va='center',color='r')
pass
plt.imshow(corr)
plt.colorbar()
plt.tight_layout()
plt.show()
程序的运行结果:
说明一下,此程序中的训练集和测试集是被随机划分的,基于不同训练集和测试集的KNN模型的精度是不同的。