西瓜书课后题——第十章(降维与度量学习) ( KNN、PCA )

本文探讨了PCA降维方法在Yale人脸数据集的应用,通过MATLAB实现并分析了不同维度下重构精度。同时,介绍了KNN分类算法,对比了其与决策树的异同,指出KNN能产生更灵活的分类边界,但易受k值和样本分布影响。
摘要由CSDN通过智能技术生成

此处只记录编程题目10.1和10.6,其余题目请参考:https://blog.csdn.net/icefire_tyh/article/details/52243773

10.1  KNN分类

理论比较简单,书上也说的比较清晰,所以直接给出代码:

import numpy as np
import pandas as pd
import heapq
import matplotlib.pyplot as plt

class KNN:
    #读取数据
    def loadData(self):            
        dataset = pd.read_excel('./WaterMelon_3.0.xlsx',encoding = 'gbk')
        Attributes = dataset.columns
        m,n = np.shape(dataset)
        dataset = np.matrix(dataset)
        for i in range(m):
            if dataset[i,n-1] == '是': dataset[i,n-1] = 1
            else: dataset[i,n-1] = -1
        self.future = Attributes[1:n-1]
        self.x = dataset[:,1:n-1]
        self.y = dataset[:,n-1]
        self.m = m

    def getDistance(self):        # 计算出每一个样本之间的距离,用二维矩阵存贮
        self.distance = np.zeros((self.m,self.m))
        for i in range(self.m):
            self.distance[i,i] = np.inf
            for j in range(i+1,self.m):
                d = self.Edist(self.x[i,:],self.x[j,:])
                self.distance[i,j] = d
                self.distance[j,i] = d

    def Edist(self,x1,x2):    # 欧式距离
        x1 = np.array(x1)
        x2 = np.array(x2)
        print(x1)
        return np.linalg.norm(x1-x2)

    def train(self,k):        # 进行knn训练
        label = np.ones((self.m,))
        for i in range(self.m):
            index = self.getindex(self.distance[i,:],k)    # 得到最小k个样本的索引
            label[i] = self.getLabel(index)               # 根据最近的样本得到该样本的预测标签
        return label

    def getindex(self,dist,k):          # 找最小值对应的索引
        dist = dist.tolist()
        index = map(dist.index,heapq.nsmallest(k,dist))
        return list(index)

    def getLabel(self,index):           # 根据索引对应的样本标签进行分类
        labellist = self.y[index]
        #print(labellist)
        #print(np.sum(labellist))
        if np.sum(labellist)>0: return 1
        else: return -1

    # 绘图
    def myPlot(self,label):
        #print(type(self.y[1]))
        Y = np.array(self.y).tolist()
        Y = np.reshape(Y,(17,)).tolist()
        print(Y)
        #print(type(Y))
        #print(np.shape(Y))
        Tgoodin = [i for i,x in enumerate(Y) if x==1]
        print(Tgoodin)
        Tbadin = [i for i,x in enumerate(Y) if x==-1]
        print(Tbadin)
        Tgood = self.x[Tgoodin,:]
        Tbad = self.x[Tbadin,:]
        print(Tgood)

        label = label.tolist()
        Pgoodin = [i for i,x in enumerate(label) if x==1]
        Pbadin = [i for i,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值