import numpy as np
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.datasets import make_classification, load_iris
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
np.random.seed(42)
X, y = make_classification(n_samples=500, n_features=10, n_informative=5, random_state=42)
print("=== K值选择 ===")
for k in [1,3,5,7,11,21,51]:
pipe = Pipeline([('s',StandardScaler()),('knn',KNeighborsClassifier(n_neighbors=k))])
s = cross_val_score(pipe, X, y, cv=5)
print("K={}: 准确率={:.4f}".format(k, s.mean()))
iris = load_iris()
print("\n=== 距离度量 ===")
for m in ['euclidean','manhattan','chebyshev']:
pipe = Pipeline([('s',StandardScaler()),('knn',KNeighborsClassifier(metric=m))])
s = cross_val_score(pipe, iris.data, iris.target, cv=5)
print("metric={}: 准确率={:.4f}".format(m, s.mean()))
print("\n=== 加权KNN ===")
for w in ['uniform','distance']:
pipe = Pipeline([('s',StandardScaler()),('knn',KNeighborsClassifier(weights=w))])
s = cross_val_score(pipe, X, y, cv=5)
print("weights={}: 准确率={:.4f}".format(w, s.mean()))
Xr = np.random.uniform(-3,3,200).reshape(-1,1)
yr = np.sin(Xr.ravel()) + np.random.normal(0,0.2,200)
for k in [1,3,5,10,20]:
pipe = Pipeline([('s',StandardScaler()),('knn',KNeighborsRegressor(n_neighbors=k))])
s = cross_val_score(pipe, Xr, yr, cv=5, scoring='r2')
print("KNN回归 K={}: R2={:.4f}".format(k, s.mean()))