knn

k近邻算法,依据少数服从多数。根据已经被正确分类的邻居预测

选择k个邻居中,较大数量的一类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from sklearn.datasets._samples_generator import make_blobs
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
#中心点
centers=[[-2,2],[2,2],[0,4]]
#n_samples:生成样本的数量
#centers:生成中心位置和所需生成样本的个数]
#random_state:随机数种子,未指定情况下,随机生成,每次生成结果不同
#cluster_std:每个簇的方差,指明生成点的分散程度
#X为生成的样本特征,Y为样本簇类别,两者长度相同
#训练集
X,Y=make_blobs(n_samples=100,centers=centers,random_state=0,cluster_std=0.6)
#预测点
X_sample=np.array([[0,2]])
#中心点
c=np.array(centers)
#画出样本
plt.figure(figsize=(10,8),dpi=144)
plt.scatter(X[:,0],X[:,1],c=Y,s=100,alpha=0.5)
#画出中心点
plt.scatter(c[:,0],c[:,1],marker='*',c='red',s=500)
#画出预测点,符号为圆圈,绿色,大小100
plt.scatter(X_sample[:,0],X_sample[:,1],marker='o',c='green',s=100,alpha=0.5)
#定义knn算法
k=5
clf=KNeighborsClassifier(n_neighbors=k)
clf.fit(X,Y)
#取离预测点最近的k个点
neighbors=clf.kneighbors([[0,2]],k,False)
print(X)
#画出待遇测点和最近点连接线
for i in neighbors[0]:
print(X[i][0])
print(X[i][1])
#X[i][0]标识X的第i个横坐标,X[i][1]标识X的第i个纵坐标
plt.plot([X[i][0],X_sample[0][0]],[X[i][1],X_sample[0][1]],'k--',linewidth=0.6)
plt.show()

#开始训练
Y_sample=clf.predict(X_sample)
print(Y_sample)

预测结果:

[0]

image-20240331233138309