Day 19 : KNN 与 K-means

今天进入演算法的介绍,首先打头阵介绍的是 KNN 与 K-means,两者不太一样。

KNN 是监督式学习演算法;K-means 是非监督式学习演算法

KNN (K Nearest Neighbor, KNN)

属於监督式学习演算法,主要是找寻最邻近的 K 个邻居,透过多数决的概念决定属於哪一类

  • K 是参数,决定找几个点
  • 计算每个邻居与自己之间的距离
  • 多数决投票

K 会影响最後的结果

注意:通常会将数值进行正规化,让计算出来的结果比较 robust

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
import pandas as pd

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
X = iris_df.drop(labels=['target_name', 'target'] ,axis=1)
y = iris_df['target'].values
X_train , X_test , y_train , y_test = train_test_split(X, y ,test_size=0.2 , random_state=55)

classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)

# 建立 KNN 的 K 串列
k_list = list(range(1, 50, 1))

# 实作 KNN 交叉验证 
cv_scores = []
for k in k_list:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
    cv_scores.append(scores.mean())
    
# 计算 MSE 
MSE = [1 - x for x in cv_scores]

plt.figure()
plt.figure(figsize=(15,10))
plt.title('The optimal number of neighbors', fontsize=20, fontweight='bold')
plt.xlabel('Number of Neighbors K', fontsize=15)
plt.ylabel('Misclassification Error', fontsize=15)
sns.set_style("whitegrid")
plt.plot(k_list, MSE)

plt.show()


透过这张图可以找到 K 大约在 15~17 有最好的成效!

K-Means

属於非监督式学习演算法,主要应用於分类,我们不会知道答案是什麽!

  • 决定 K 值
  • 随机给定 K 个 中心点(初始化,不一定要是资料的点)
  • 计算每个样本与各中心点的距离,并分配到不同的区域
  • 重新计算新的中心点到各样本的距离,再度更新区域
  • 直到中心点不再变动

假设 K=2,然後我们随机给两个点,接着我们来计算每个样本与各中心点的距离,并分配到不同区域

两个点可以简单用分割线来看最快

再度更新新的中心点,重新计算各中心点的距离,并更新区域

最後达到收敛(若再继续分下去,中心点都会是一样的)

注意: K-Means 不适合用於非数值型资料

from sklearn.cluster import KMeans
wcss = []

for i in range(1, 15):
    kmeans = KMeans(n_clusters = i, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
    kmeans.fit(x)
    wcss.append(kmeans.inertia_)
    
plt.plot(range(1, 15), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# Kmeans 的预测
kmeans = KMeans(n_clusters = 3, init = 'k-means++', max_iter = 300, n_init = 10, random_state = 0)
y_kmeans = kmeans.fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_kmeans, cmap='rainbow')

# 原始数据的分类
plt.scatter(iris_df['sepal length (cm)'], iris_df['sepal width (cm)'], c=iris_df.target, cmap='rainbow')

github 程序码

更详细可以请参考连结


<<:  Angular 浅拷贝之...日记文

>>:  Day 19【ERC-721】用兵之道在一个奇字,2999兵分2999路

请适时的停下脚步,给自己多点思考空间

有的散户确实很认真做功课,但股市瞬息万变,我们的策略今天可以不代表明天也行,获利了除了运气外,也代表...

[Day25]-开发GUI程序使用tkinter2

文字方块 entry 建立文字方块 加入按钮 Entry应用 选项纽 核取方块 功能表设计 ...

19.移转 Aras PLM大小事-表单团队权限

本篇利用品保用的表单来说明 譬如一个问题处理单在工作流程中 会涉及好几个单位成员 那麽权限的编辑开放...

Day 17 机器学习

今天我们要介绍的是机器学习,所谓的机器学习是指着重於训练电脑从资料中学习,并根据经验改进且在机器学习...

NNI的特性及核心功能

上次开场白说明了NNI最基本的Hyper-parameters(超参)调整,其实只是其中的功能之一。...