首先,我们需要导入一些必要的库:
```python import numpy as np import pandas as pd
from sklearn.datasets import load_iris
from sklearn.modelselection import traintest_split
from sklearn.metrics import accuracy_score ```
接下来,我们加载鸢尾花数据集并对其进行预处理:
```python iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.featurenames) df['class'] = iris.target df['class'] = df['class'].map({0: iris.targetnames[0], 1: iris.targetnames[1], 2: iris.targetnames[2]}) ```
查看数据描述统计信息:
python
df.describe()
划分训练集和测试集:
```python x = iris.data y = iris.target.reshape(-1, 1)
xtrain, xtest, ytrain, ytest = traintestsplit(x, y, testsize=0.3, randomstate=35, stratify=y) ```
定义间隔函数和KNN分类器:
```python
def l1_distance(a, b): return np.sum(np.abs(a - b), axis=1)
def l2_distance(a, b): return np.sqrt(np.sum((a - b)**2, axis=1))
class KNN: def init(self, nneighbors=1, distfunc=l1distance): self.nneighbors = nneighbors self.distfunc = dist_func
def fit(self, x, y):
self.x_train = x
self.y_train = y
def predict(self, x):
y_predict = np.zeros((x.shape[0], 1), dtype=self.y_train.dtype)
for i, x_test in enumerate(x):
distance = self.dist_func(self.x_train, x_test)
nn_index = np.argsort(distance)
nn_y = self.y_train[nn_index[:self.n_neighbors]].ravel()
y_predict[i] = np.argmax(np.bincount(nn_y))
return y_predict
```
通过实例化KNN对象来验证模型性能:
```python
knn = KNN(n_neighbors=3)
knn.fit(xtrain, ytrain)
ypredict = knn.predict(xtest)
accuracy = accuracyscore(ytest, y_predict) print("预测准确率:", accuracy) ```
为了评估不同参数的效果,我们可以尝试不同的距离函数和K值:
```python
result_list = []
for p in [1, 2]: knn.distfunc = l1distance if p == 1 else l2_distance
# 测试不同的K值
for k in range(1, 10, 2):
knn.n_neighbors = k
y_predict = knn.predict(x_test)
accuracy = accuracy_score(y_test, y_predict)
result_list.append([k, 'l1_distance' if p == 1 else 'l2_distance', accuracy])
df = pd.DataFrame(result_list, columns=['k', '距离函数', '预测准确率']) ```
通过以上步骤,我们完成了KNN算法的实现,并对其进行了详细的测试与评估。