/images/avatar.png

vllbc

kmeans

通过sklearn模块实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
%matplotlib inline

X,y = make_blobs(n_samples=100,n_features=2,centers=[[-1,-1],[0,0],[1,1],[2,2]],cluster_std=[0.4,0.2,0.2,0.2])#使用make_blobs生成训练数据,生成100个样本,每个样本2个特征,共4个聚类,聚类中心分别为[-1,-1],[0,0],[1,1],[2,2],聚类方差分别为0.4,0.2,0.2,0.2
plt.scatter(X[:,0],X[:,1])#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征
plt.show()

kmeans = KMeans(n_clusters=3)#生成kmeans分类器,聚类数量为3,其余参数使用默认值。

y_pred = kmeans.fit_predict(X)#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。

plt.scatter(X[:,0],X[:,1],c=y_pred)#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征,将各聚类结果显示为不同的颜色
plt.show()

kmeans = KMeans(n_clusters=4)#生成kmeans分类器,聚类数量为4,其余参数使用默认值。

y_pred = kmeans.fit_predict(X)#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。

plt.scatter(X[:,0],X[:,1],c=y_pred)#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第二维特征,将各聚类结果显示为不同的颜色
plt.show()

iris = load_iris()     #导入iris数据集,iris数据集包含了150个样本,分别属于3类,每个样本包含4个特征
data_train=iris.data   #iris样本集的样本特征
label_train=iris.target #iris样本集的样本标签
kmeans = KMeans(n_clusters=3)#生成kmeans分类器,聚类数量为3,其余参数使用默认值。
y_predict = kmeans.fit_predict(data_train)#使用fit_predict方法计算聚类中心并且预测每个样本的聚类索引。

plt.scatter(data_train[:,0],data_train[:,2],c=y_predict)#画出训练样本的散点图,散点图的横坐标为样本的第一维特征,纵坐标为样本的第三维特征,将各聚类结果显示为不同的颜色

plt.show()

翻转二叉树

翻转二叉树

开始学习二叉树了

先来个简单题

https://leetcode-cn.com/problems/invert-binary-tree/

很简单

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if root == None:
            return None
        temp = root.left
        root.left = root.right
        root.right = temp
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

合并两个有序列表

合并两个有序列表

题目:

https://leetcode-cn.com/problems/merge-two-sorted-lists/

思路:

利用递归的思想,比较两个当前值,因为是有序链表

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 == None:
            return l2
        if l2 == None:
            return l1
        if l1.val <= l2.val:
            l1.next = self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1,l2.next)
            return l2

LR为什么用交叉熵

关于损失函数的问题,之前也有很多疑惑。看了网上的很多博客,有从很多角度出发来讲解的,看的也是云里雾里。现在大致做一下整理。

对于最小二乘,为什么损失函数是那种形式呢,这里可以假设误差符合正态分布,则y也符合正态分布,则从概率的角度来看,减小预测误差也就是最大化\(P(Y|X, w)\)。可以看一下白板推导中的推导。

协同过滤

协同过滤是推荐系统里面一个常用的算法,因为信息检索领域和推荐系统领域其实是有点相似的(对我目前的认知来说,对两个领域的了解都不深),所以就把协同过滤的笔记整理到了信息检索的目录下。现在主要的都是深度学习的方法了吧,双塔模型什么的。还不是太了解,继续学习。

可获得的最大点数

可获得的最大点数

题目:

https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/

思路:

滑动窗口题目,限定窗口大小然后滑动即可

代码:

class Solution:
    def maxScore(self, cardPoints: List[int], k: int) -> int:
        n = len(cardPoints)
        # 滑动窗口大小为 n-k
        windowSize = n - k
        # 选前 n-k 个作为初始值
        s = sum(cardPoints[:windowSize])
        minSum = s
        for i in range(windowSize, n):
            # 滑动窗口每向右移动一格,增加从右侧进入窗口的元素值,并减少从左侧离开窗口的元素值
            s += cardPoints[i] - cardPoints[i - windowSize]
            minSum = min(minSum, s)
        return sum(cardPoints) - minSum

滑动窗口中位数

滑动窗口中位数

题目:

https://leetcode-cn.com/problems/sliding-window-median/

思路:

很明显的滑动窗口,首先定义一个求中位数的匿名函数,然后一点一点求出来

代码:

class Solution:
    def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
        median = lambda a: (a[(len(a)-1)//2] + a[len(a)//2]) / 2
        res = []
        for i in range(len(nums)-k+1):
            res.append(median(sorted(nums[i:i+k])))
        return res

Attention

Seq2Seq中的Attention

缺陷

在seq2seq这篇文章中详细介绍了seq2seq模型的细节,但是仅仅用一个语义编码c是完全不能够表示编码器的输入的,源的可能含义的数量是无限的。当编码器被迫将所有信息放入单个向量中时,它很可能会忘记一些东西。

PPMI

PMI

点互信息 对于两个单词之间的PMI来说,可以这样计算:

\[ PMI(w,c) = \log \frac{p(w,c)}{p(w)p(c)} = \log \frac{N(w,c) |w,c|}{N(w)N(c)} \] ## MI 在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息(Mutual Information)是度量两个事件集合之间的相关性(mutual dependence)。互信息最常用的单位是bit。