knn算法python代码鸢尾花可视化
时间: 2023-05-31 19:17:55 浏览: 310
### 回答1:
以下是使用Python实现KNN算法并可视化鸢尾花数据集的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2] # 只使用前两个特征
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3, random_state=42)
# 训练KNN模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 可视化训练集和测试集
plt.figure(figsize=(10, 6))
plt.scatter(X_train[:, ], X_train[:, 1], c=y_train, cmap='viridis', label='Train')
plt.scatter(X_test[:, ], X_test[:, 1], c=y_test, cmap='viridis', marker='x', label='Test')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.legend()
plt.show()
# 可视化KNN分类结果
plt.figure(figsize=(10, 6))
h = .02 # 网格步长
x_min, x_max = X[:, ].min() - .5, X[:, ].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap='viridis', alpha=.5)
plt.scatter(X_train[:, ], X_train[:, 1], c=y_train, cmap='viridis', label='Train')
plt.scatter(X_test[:, ], X_test[:, 1], c=y_test, cmap='viridis', marker='x', label='Test')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.legend()
plt.show()
```
运行以上代码,即可得到训练集和测试集的散点图以及KNN分类结果的可视化图。
### 回答2:
KNN(K-Nearest Neighbors)算法是一种简单而有效的分类算法。在Python中,通过使用scikit-learn库,我们可以很方便地对鸢尾花数据进行KNN分类,并将结果进行可视化。
首先,我们需要导入一些必要的库:
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
```
接着,我们可以使用以下代码来加载鸢尾花数据集:
```
iris = datasets.load_iris()
X = iris.data[:, :2] # 只使用前两个特征
y = iris.target
```
在这里,我们只使用了鸢尾花数据集中的前两个特征来进行分类。接下来,我们可以通过以下代码将数据集分成训练集和测试集:
```
# 将数据集分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
```
接下来,我们可以通过以下代码对训练集进行KNN分类:
```
# 训练KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
```
在这里,我们使用了KNeighborsClassifier类来创建一个KNN分类器,并使用fit方法对训练集进行训练。
接着,我们可以使用以下代码对测试集进行预测并计算准确率:
```
# 对测试集进行预测并计算准确率
accuracy = knn.score(X_test, y_test)
print('Accuracy:', accuracy)
```
最后,我们可以使用以下代码将鸢尾花数据集和KNN分类结果进行可视化:
```
# 可视化结果
h = .02 # 网格步长
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# 绘制训练集数据点和测试集数据点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired, alpha=0.5)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
```
在这里,我们首先使用meshgrid函数创建了一个网格,然后对网格中的每个点进行预测,并将结果进行可视化。同时,我们还绘制了训练集数据点和测试集数据点,以便更好地展示分类结果。
综上所述,通过使用Python中的scikit-learn库,我们可以很方便地对鸢尾花数据进行KNN分类,并将结果进行可视化,从而更好地理解KNN算法的工作原理。
### 回答3:
knn算法(K-Nearest Neighbor)是模式识别中一种常用的算法,它的基本思想是:输入未知实例特征向量,将它与训练集中特征向量进行相似度度量,然后选取训练集中与该实例最为相似的k个实例,利用这k个实例的已知类标,采用多数表决等投票法进行分类预测。这种方法简单而有效,准确性高,特别适合于多分类、样本偏斜不平衡、非线性的数据分类问题。本文将介绍如何使用Python实现KNN算法,并可视化表现在鸢尾花分类问题上。
数据集的导入
我们使用鸢尾花数据集,首先需要导入相关的库和数据。其中,数据集中有4个属性分别是花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width),一共150个样本,分别属于3个类别,分别为Setosa,Versicolor,Virginica。
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
iris_data = iris.data
iris_labels = iris.target
iris_names = iris.target_names
KNN算法的实现
KNN算法的核心代码如下所示。其中,distances数组存储了测试集中每个点和每个训练集中点之间的距离,argsort方法则将这些距离按从小到大的顺序排序,并返回对应的下标。由于要选取k个最小值,因此需要选取前k个最小值对应的下标,再统计这些下标对应训练集中类别出现的次数。最后,返回出现次数最多的类别。
#定义KNN分类器
def knn_classify(test_data, train_data, labels, k):
distances = np.sqrt(np.sum((train_data - test_data)**2,axis = 1))
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
maxCount = 0
maxIndex = -1
for key,value in classCount.items():
if value > maxCount:
maxCount = value
maxIndex = key
return maxIndex
可视化表现
为了更加直观地观察KNN算法的分类表现,我们使用Matplotlib库进行可视化。我们将训练集中不同类型的花的属性值绘制在不同的颜色中,并用散点图展示 。接下来,我们将测试集中每个点的属性值和类标绘制在同一张图中,并将分类结果用圆圈标识出来。
import matplotlib.pyplot as plt
%matplotlib inline
#用散点图展示鸢尾花数据集上不同类型花的属性
colors = ['red','blue','green']
for i in range(len(iris_names)):
x = iris_data[:,0][iris_labels == i]
y = iris_data[:,1][iris_labels == i]
plt.scatter(x, y, c = colors[i],label = iris_names[i])
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend(loc='upper left')
#可视化分类表现
point_size = 50
test_point = [6,3] #假设测试点的属性值为[6,3]
plt.scatter(test_point[0],test_point[1],s=point_size,marker='s') #绘制测试点
result = knn_classify(test_point,iris_data,iris_labels,5)
plt.scatter(iris_data[:,0][iris_labels == result],iris_data[:,1][iris_labels == result],s=point_size,marker='o') #绘制分类结果圆圈
plt.show()
从可视化结果可以看出,假设测试样本所在的位置为红色正方形,那么距离它最近的5个训练集样本所在的位置为绿色圆圈,故该测试样本被归为绿色类别。
阅读全文